决策树、梯度提升与高级特征处理方法
立即解锁
发布时间: 2025-09-10 01:24:41 阅读量: 8 订阅数: 14 AIGC 


表格数据机器学习实战
# 决策树、梯度提升与高级特征处理方法
## 1. 梯度提升算法相关技术
### 1.1 GOSS采样近似
GOSS(Gradient-based One-Side Sampling)的采样近似在处理大型数据集时,与传统方法相比,其引入的误差可以忽略不计。使用GOSS时,最佳情况下能得到与标准LightGBM训练相似的结果,但速度提升显著。这使得在寻找正确的超参数或为问题选择最相关特征时,GOSS是快速实验的不错选择。不过,与其他加速方法不同,GOSS不是默认启用的,需要手动指定使用。
### 1.2 LightGBM的提前停止策略
LightGBM支持提前停止策略,其控制参数与XGBoost实现中的参数类似。以下是一个应用提前停止策略的示例代码:
```python
from lightgbm import LGBMClassifier, log_evaluation
train, test = train_test_split(range(len(data)), test_size=0.2, random_state=0)
train, validation = train_test_split(
train,
test_size=0.2,
random_state=0
)
lgbm = LGBMClassifier(boosting_type='gbdt',
early_stopping_round=150,
n_estimators=1000,
max_depth=-1,
min_child_samples=3,
force_col_wise=True,
verbosity=0)
X = column_transform.fit_transform(data.iloc[train])
y = target_median[train]
Xv = column_transform.transform(data.iloc[validation])
yv = target_median[validation]
lgbm.fit(X, y, eval_set=[(Xv, yv)],
eval_metric='accuracy',
callbacks=[log_evaluation(period=0)])
Xt = column_transform.transform(data.iloc[test])
yt = target_median[test]
preds = lgbm.predict(Xt)
score = accuracy_score(y_true=yt, y_pred=preds)
print(f"Test accuracy: {score:0.5f}")
```
在这个例子中,如果测试集上的性能在100次迭代中没有提升,算法将停止训练,并选择到目前为止在测试集上性能最高的迭代轮次。与XGBoost实现相比,有一些细微的差异,例如`eval_metric`的名称不同,并且要抑制训练期间的评估打印,需要指定一个回调函数`log_evaluation`。
最近,提前停止也被实现为一个回调函数。如果使用提前停止作为回调函数,可以对LightGBM停止训练的方式有更多控制:
- `first_metric_only`:允许指定是否仅使用第一个指标进行提前停止。
- `min_delta`:表示继续训练所需的指标最小改进值,通常设置为零(任何改进都可以),但可以提高该值以对集成的增长施加更严格的控制。
### 1.3 让XGBoost模仿LightGBM
自LightGBM引入并采用不平衡决策树后,XGBoost除了原有的按层策略(depthwise)外,也开始支持按叶策略(lossguide)。通过`grow_policy`参数设置,可以让XGBoost表现得像LightGBM。当使用`lossguide`生长策略时,为避免过拟合,建议设置以下参数:
- `max_leaves`:设置要添加的最大节点数,仅与`lossguide`策略相关。
- `max_depth`:设置树的最大深度。如果`grow_policy`设置为`depthwise`,`max_depth`的行为与通常一样;如果设置为`lossguide`,`max_depth`可以设置为零,表示没有深度限制。
### 1.4 LightGBM对Scikit-learn的启发
在Scikit-learn 0.21版本中,受LightGBM启发,添加了两个新的梯度提升树实现:`HistGradientBoostingClassifier`和`HistGradientBoostingRegressor`。与原有的Scikit-learn梯度提升实现相比,新的基于直方图的实现具有以下新特性:
- 分箱(Binning)
- 多核处理(原实现为单核)
- 不支持稀疏数据
- 内置对缺失值的支持
- 单调性和交互约束
- 原生支持分类变量
以下是一个使用`HistGradientBoostingClassifier`的示例代码:
```python
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.metrics import accuracy_score
accuracy = make_scorer(accuracy_score)
cv = KFold(5, shuffle=True, random_state=0)
model = HistGradientBoostingClassifier(learning_rate=0.1,
max_iter=300,
max_depth=4,
min_samples_leaf=3,
random_state=0)
model_pipeline = Pipeline(
[('processing', column_transform),
('modeling', model)])
cv_scores = cross_validate(estimator=model_pipeline,
X=data,
y=target_median,
scoring=accuracy,
cv=cv,
return_train_score=True,
return_estimator=True)
mean_cv = np.mean(cv_scores['test_score'])
std_cv = np.std(cv_scores['test_score'])
fit_time = np.mean(cv_scores['fit_time'])
score_time = np.mean(cv_scores['score_time'])
print(f"{mean_cv:0.3f} ({std_cv:0.3f})",
f"fit: {fit_time:0.2f}",
f"secs pred: {score_time:0.2f} secs")
```
该算法仍在开发中,不支持稀疏数据,这意味着在存在许多独热编码特征的情况下,无论如何准备数据,其性能都无法像XGBoost或LightGBM那样快。
### 1.5 集成算法总结
- **集成算法概述**:集成算法通过使用多个模型或将它们链接在一起来提高单个模型的预测能力。常见的集成算法基于决策树,主要有两种核心策略:平均法和提升法。
- **平均法策略**:如随机森林,倾向于减少预测方差,同时仅略微增加偏差。粘贴(Pasting)是一种平均法,通过在数据子样本上训练不同模型并汇总预测结果;装袋(Bagging)与平均法类似,但使用自助采样。不过,平均法计算量较大,且可能通过采样排除数据分布的重要部分而增加偏差。
- **随机森林**:通过自助采样和特征子采样组合决策树,创建不同的模型集,产生更可靠和准确的预测。可用于确定特征重要性和衡量数据集中案例的相似性,但需要微调超参数,如树的数量、最大特征数、树的最大深度和终端分支的最小大小。若树的数量设置过高,计算成本会增加
0
0
复制全文
相关推荐









