暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

sklearn新增模型HistGradientBoosting:效果更好、速度更快、支持缺失值输入

Coggle数据科学 2023-09-11
732

HistGradientBoosting

https://scikit-learn.org/stable/modules/ensemble.html#histogram-based-gradient-boosting

Scikit-learn 0.21引入了两种新的梯度提升树实现,分别是HistGradientBoostingClassifier
HistGradientBoostingRegressor
,灵感来自于LightGBM。

  • 速度优势

这些基于直方图的估计器在样本数量超过数万个样本时可以比GradientBoostingClassifier
GradientBoostingRegressor
快上数个数量级

  • 支持缺失值输入

它们还内置了对缺失值的支持,避免了需要使用一个填充器(imputer)的必要。

使用案例

大多数参数与GradientBoostingClassifier
GradientBoostingRegressor
保持不变。唯一的例外是max_iter
参数,它代替了n_estimators
,控制了Boosting过程的迭代次数:

>>> from sklearn.ensemble import HistGradientBoostingClassifier
>>> from sklearn.datasets import make_hastie_10_2

>>> X, y = make_hastie_10_2(random_state=0)
>>> X_train, X_test = X[:2000], X[2000:]
>>> y_train, y_test = y[:2000], y[2000:]

>>> clf = HistGradientBoostingClassifier(max_iter=100).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.8965

对于回归问题,可用的损失函数包括"均方误差"('squared_error')、"绝对误差"('absolute_error',对离群值不敏感)、"泊松分布"('poisson',适用于模拟计数和频率)。对于分类问题,唯一可用的损失函数是"对数损失"('log_loss')。

对于二元分类,它使用二元对数损失,也称为二项偏差或二元交叉熵。对于n_classes >= 3
,它使用多类别对数损失函数,具有多项式偏差和分类交叉熵作为替代名称。选择合适的损失函数版本基于传递给fit的y。

通过max_leaf_nodes
max_depth
min_samples_leaf
参数可以控制树的大小。

用于对数据进行分箱的箱子数量由max_bins
参数控制。使用更少的箱子可以作为一种正则化形式。通常建议使用尽可能多的箱子,这是默认设置。

缺失值支持

HistGradientBoostingClassifier
HistGradientBoostingRegressor
内置了对缺失值(NaNs)的支持。

在训练过程中,树生长器在每个分裂点学习样本是否具有缺失值,并根据潜在的增益确定缺失值样本是应该分到左子节点还是右子节点。在预测时,具有缺失值的样本被分配到相应的左子节点或右子节点:

>>> from sklearn.ensemble import HistGradientBoostingClassifier
>>> import numpy as np

>>> X = np.array([012, np.nan]).reshape(-11)
>>> y = [0011]

>>> gbdt = HistGradientBoostingClassifier(min_samples_leaf=1).fit(X, y)
>>> gbdt.predict(X)
array([0011])

当缺失值的模式具有预测性质时,分裂可以基于特征值是否缺失来进行:

>>> X = np.array([0, np.nan, 12, np.nan]).reshape(-11)
>>> y = [01001]
>>> gbdt = HistGradientBoostingClassifier(min_samples_leaf=1,
...                                       max_depth=2,
...                                       learning_rate=1,
...                                       max_iter=1).fit(X, y)
>>> gbdt.predict(X)
array([01001])

如果在训练过程中某个特征没有遇到缺失值,那么具有缺失值的样本将被映射到具有最多样本的子节点。

设置样本权重

以下的示例演示了模型如何通过设置样本权重为零来忽略具有零权重的样本:

>>> X = [[10],
...      [10],
...      [10],
...      [01]]
>>> y = [0010]
>>> # 通过将前两个训练样本的权重设置为0来忽略它们
>>> sample_weight = [0011]
>>> gb = HistGradientBoostingClassifier(min_samples_leaf=1)
>>> gb.fit(X, y, sample_weight=sample_weight)
HistGradientBoostingClassifier(...)
>>> gb.predict([[10]])
array([1])
>>> gb.predict_proba([[10]])[01]
0.99...

正如您所看到的,由于前两个样本的样本权重被忽略,[1, 0] 被舒适地分类为1。

 竞赛交流群 邀请函  #

△长按添加竞赛小助手

每天大模型、算法竞赛、干货资讯

与 36000+来自竞赛爱好者一起交流~

文章转载自Coggle数据科学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论