使用 SAP HANA PAL 训练回归模型

Objective

After completing this lesson, you will be able to 了解混合梯度提升树 (HGBT) 算法的回归功能。

训练房源价格的 PAL 回归模型

面向 SAP HANA 的 Python 机器学习客户端 (hana-ml) 提供对以下内容的访问:

  • 预测分析库 (PAL) 的所有功能
  • Python 中的自动化预测库(APL)函数

这些函数可以与 SAP HANA 数据框架一起用作输入数据。

准备输入数据集

算法将输入数据集随机分为三个不相交的子集:训练、测试和验证。这些子集对于执行机器学习工作流至关重要。

请注意,根据分区算法 [1] 的要求,输入数据集必须包含"ID"列才能创建这些分区。如果未显式指定 'ID' 列,则算法会假定 DataFrame 的第一列包含 'ID'。有关更多详细信息,请参阅 [1]。

以下介绍如何将"ID"列插入数据集:

Python
1
hdf_input = hdf.add_id(id_col='ID')
Python
1
hdf_input.head(5).collect()
输出:
 标识MedInc家庭年龄AveRoomsAveBedrms群体AveOccup纬度经度目标
011.2452.02.920.91396.04.6537.80-122.275.00
121.1652.02.430.941349.05.3937.87-122.255.00
237.8552.07.791.05517.02.4137.86-122.245.00
349.3952.07.510.951366.02.7537.85-122.245.00
457.8752.08.281.04947.02.6237.83-122.235.00

对输入数据集进行分区

上述每个子集都没有最佳分区百分比。您需要选择满足预测项目目标的分区百分比。

例如,常见的分区百分比包括:

  • 培训:80%/测试:20%
  • 培训:70%/测试:30%
  • 培训:60%/测试:40%

在这种特殊情况下,你需要最大化用于训练模型的数据量,并且仍然留有足够的数据点,以进行强大的模型评估。因此,建议的数据拆分如下:

培训:70%/测试:30%

分区算法的输入参数如下所示:

Python
12345678
# Partitioning the input data into train, test, validation sub-sets from hana_ml.algorithms.pal.partition import train_test_val_split regressdata_hdf=hdf_input.select('ID', 'MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude', 'Target') train_hdf, test_hdf, val_hdf = train_test_val_split(data=regressdata_hdf, id_column='ID', random_seed=2, partition_method='random', training_percentage = 0.7, testing_percentage = 0.3, validation_percentage = 0.0) print(regressdata_hdf.select_statement)

输出:

SELECT "ID", "MedInc", "HouseAge", "AveRooms", "AveBedrms", "Population", "AveOccup", "Latitude", "Longitude", "Target" FROM (SELECT CAST(ROW_NUMBER() OVER() AS INTEGER) + 0 AS "ID", * FROM (SELECT * FROM "ML_DEMO"."california_housing"))) AS "DT_269"

训练混合梯度提升树 (HGBT) 模型

PAL 混合梯度提升树 (HGBT) 算法 [1] 是一种支持混合功能类型(连续和分类)作为输入的 HANA 优化梯度提升树实施。它支持回归和分类场景。

回归的混合梯度提升模型基于如下所示的训练子集进行训练:

Code Snippet
123456789101112
HybridGradientBoostingRegressor %%time hgr = HybridGradientBoostingRegressor( n_estimators = 20, split_threshold=0.75, split_method = 'exact', learning_rate=0.3, max_depth=2, resampling_method = 'cv', fold_num=5, evaluation_metric = 'rmse', ref_metric=['mae'] ) hgr.fit(train_hdf, features=['ID', 'MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'], label='Target')

CPU times: user 4.81 ms, sys: 408 μs, total: 5.22 ms

墙壁时间:633毫秒

输出:

<hana_ml.algorithms.pal.trees.HybridGradientBoostingRegressor at 0x7fe3333e9510>

参考

[1] SAP 算法 hana_ml.algorithms.pal package:HybridGradientBoostingRegressor

功能重要性

功能重要性根据输入特征在预测响应或相关变量 [1] 时的贡献为输入功能分配分数。

功能的评分越高,其对模型预测目标变量的影响就越大。重要性分数在 [0, 1] 范围内。

以下是检查模型功能重要性的方法:

观察到最有影响力的特征是 'MedInc',重要性值为 '0.51'。此功能表示块组中的中等收入。"块组是美国的最小地理单元。人口普查局公布样本数据"[2].

此外,在位置 3 和位置 5,我们分别找到"纬度"和"经度"功能。其相应的重要性值为 '0.09' 和 '0.05'。

Python
1
hgr.feature_importances_.sort('IMPORTANCE', desc='TRUE').collect()
 VARIABLE_NAME重要性
0MedInc0.513025
1标识0.230721
2纬度0.097631
3AveOccup0.085743
4经度0.057718
5AveRooms0.011069
6家庭年龄0.004093
7AveBedrms0.000000
8群体0.000000

参考

[1] SAP 算法 hana_ml.algorithms.pal 包:HybridGradientBoostingRegressor

[2] California Housing 数据集说明