根据原有的代码,请帮我用梯度提升树(GBDT)来构造模型并进行修改
时间: 2025-04-01 08:15:05 浏览: 41
好的!基于你之前提供的代码框架,我们可以将原来的线性回归模型替换为梯度提升树(GBDT)。下面是具体的修改方案和完整代码示例:
---
### GBDT 模型的特点
Gradient Boosting Decision Tree (GBDT) 是一种强大的集成学习算法,特别适合处理非线性数据。相比于传统的线性模型,它能够捕捉复杂的特征交互关系,同时对少量噪声具备一定的鲁棒性。
为了适配你的任务需求,我们将:
1. 替换掉之前的 `LinearRegression`,改用 `GradientBoostingRegressor`;
2. 调整超参数以适应小样本场景下的建模要求;
3. 对于目标变量形状不足的问题仍然保持相同的保护逻辑。
---
### 修改后的代码实现
以下是完整的代码实现:
```python
import numpy as np
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor # 导入GBDT模型
from sklearn.metrics import mean_squared_error, r2_score
# 模拟原始特征及其标签
X = np.array([[0.1, -0.2, 3.5, -1.7], [-0.5, 0.3, 4.0, -2.0], [0.2, 0.1, 3.8, -1.8]]) # 扩展后的特性矩阵(3x4)
y = np.array([1.0]) # 目标变量形状需匹配实际情况
# 划分训练集和测试集
try:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
if len(y_train) < 2 or len(y_test) < 1:
raise ValueError("数据划分后不足以支持有效的建模")
except Exception as e:
print(f"分割失败: {e}")
exit()
# 进行特征选择 (假设需要保留四个重要特征)
selector = SelectKBest(score_func=f_regression, k=4)
X_new = selector.fit_transform(X_train, y_train.ravel())
print('Selected Features Shape:', X_new.shape)
print('Target Variable Shape:', y_train.shape)
# 构造GBDT模型并预测结果
gbdt_model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
gbdt_model.fit(X_new, y_train.ravel()) # 训练GBDT模型
# 测试阶段同样需要进行特征选择转换
predictions = gbdt_model.predict(selector.transform(X_test))
# 输出评价指标
mse = mean_squared_error(y_test, predictions)
if len(y_test) > 1:
rsq = r2_score(y_test, predictions)
else:
rsq = None # 当样本点太少时避免直接调用r2_score造成nan
print(f'Mean Squared Error: {mse}')
print(f'R-squared Score: {rsq}')
```
---
### 关键点说明
1. **引入了 `GradientBoostingRegressor`**
它是一个专门用于回归任务的 GBM 实现,通过设置适当的超参可以更好地拟合复杂模式。
2. **增加了更多的保护逻辑**
确保在极少数情况下不会因为数据质量问题而报错退出程序。
3. **针对小样本特化的调整**
设置较小的学习率(`learning_rate=0.1`)、较浅的最大深度(`max_depth=3`),并且限制决策树的数量(`n_estimators=100`)以防过拟合现象发生。
---
###
阅读全文
相关推荐
















