集成学习
集成学习通过构建并合并多个模型来完成学习,从而获得比单一学习模型更显著优越的泛化能力,集成学习就是利用模型的"集体智慧",提升预测的准确率,根据单个模型方式,集成学习可分为两大类:
- 个体之间存在强依赖关系,其代表为Boosting算法
- 个体之间不存在强依赖关系,其代表是Bagging和随机森林
Boosting
1.什么是Boosting
Boosting(直译为推进,提升)是一族可以将弱学习器提升为强学习器的算法,其工作原理是:
- 先训练一个初始模型;
- 根据模型的表现进行调整,使得模型预测错误的数据获得更多的关注,再重新训练下一个模型
- 不断重复第二步,直到模型数量达到预先设定的数目,最终将T个模型加权结合
2. 实现Boosting
import sklearn.tree as st
import sklearn.ensemble as se
# 决策树模型
model = st.DecisionTreeRegressor(max_depth=4)
# 构建400颗不同权重决策树,训练模型
model = se.AdaBoostRegressor(model,
n_estimators=400, # 决策树数量
random_state = 7 # 随机种子)
# 训练模型
model.fit(train_x,train_y)
# 预测模型
pred_test_y = model.predict(test_x)
3. 波士顿房价预测案例
import pandas as pd
import numpy as np
from sklearn.ensemble import AdaBoost
from sklearn.datasets import load_boston
# 加载波士顿房价数据集
boston = load_boston()
X, y = boston.data, boston.target
# 初始化 Adaboost 分类器
ada_regressor = AdaBoost(
base_estimator=None, # 使用树状投票算法作为弱学习器
n_estimators=200, # 树的数量
learning_rate=0.1, # 学习率,控制每棵树对整体预测的影响
max_depth=4, # 森林的深度
min_samples_split=2,
min_samples_leaf=1,
random_state=None
)
# 训练模型
ada_regressor.fit(X, y)
# 评估模型性能
target = y.reshape(-1, 1)
y_pred = ada_regressor.predict(X)
rmse = np.sqrt(mean_squared_error(target, y_pred))
print(f"均方根误差:{
rmse:.4f}")
# 绘制散点图和回归线
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.scatter(X.flatten(), y, c='b', label='真实房价')
plt.plot(X.flatten(), y_pred.reshape(-1), 'r-', linewidth=2, label='预测房价')
plt.xlabel('特征变量(X)')
plt.ylabel('房价(y)')
plt.title("波士顿房价预测")
plt.legend()
plt.show()
随机森林
随机森林是专门为决策树分类器设计的一种集成方法,是Bagging法的一种扩展,它是指每次构建决策树模型时,不仅随机选择部分样本,而且还随机选择部分特征来构建多颗决策树,这样不仅规避了强势样本对预测结果的影响,而且也削弱了强势特征的影响,使模型具有更强的泛化能力
实现随机森林
import sklearn.ensemble as se
model = se.RandomForestRegressor(
max_depth, # 决策树最大深度
n_estimators, # 决策树最大数量
min_samples_split # 子表中最小样本数,小于这个数则不继续拆分
)
使用随机森林对波士顿房价进行预测
from sklearn import preprocessing
# 对数转换
y_log = np.log(y + 1) # 添加1以避免取零或负值
from sklearn.ensemble import RandomForestRegressor
# 初始化模型
regressor = RandomForestRegressor(
n_estimators=200,
max_features='sqrt',
max_depth=4,
random_state=42
)
# 训练模型
regressor.fit(X, y_log)
# 模型评估
# RMSE(均方根误差):衡量预测值与实际值的平均绝对差。
from sklearn.metrics import mean_squared_error
# 预测房价
y_pred = rf regressor.predict