机器学习:集成学习和随机森林

时间:2025-02-17 12:09:32

集成学习

集成学习通过构建并合并多个模型来完成学习,从而获得比单一学习模型更显著优越的泛化能力,集成学习就是利用模型的"集体智慧",提升预测的准确率,根据单个模型方式,集成学习可分为两大类:

  • 个体之间存在强依赖关系,其代表为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