系列文章目录
监督学习:参数方法
【学习笔记】 陈强-机器学习-Python-Ch4 线性回归
【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归
【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv)
【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归
【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析
【学习笔记】 陈强-机器学习-Python-Ch8 朴素贝叶斯
【学习笔记】 陈强-机器学习-Python-Ch9 惩罚回归
【课后题练习】 陈强-机器学习-Python-Ch9 惩罚回归(student-mat.csv)
监督学习:非参数方法
【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch10 KNN法
【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)
集成学习
文章目录
前言
本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。
本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载
参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.
数学原理等 详见陈强老师的 PPT
参考了:网友阡之尘埃的Python机器学习09——随机森林
另:各位同学能不能帮我看看习题(分类问题的随机森林:Mushroom.csv),我是不是处理X没处理对啊?为什么不管是单个决策树还是随机森林,R^2都是1.0 啊啊啊?!!!我已经纠结了好几天了
一、集成学习:随机森林(Random Forest)
集成学习(Ensemble Learning)方法通过结合多个模型的预测结果来减少单个模型可能出现的过拟合和偏差,提高预测性能和稳定性。
主要的集成学习方法包括:Bagging(Bootstrap Aggregating),Boosting,Stacking(Stacked Generalization),Voting。
Bagging(Bootstrap Aggregating):通过自助法(Bootstrap Sampling)从原始数据集中生成多个训练子集,每个子集用于训练一个基学习器(如决策树)。最终的预测结果是这些基学习器预测结果的平均(回归)或投票(分类)结果。随机森林就是一种典型的 Bagging 方法。
随机森林(Random Forest)结合了多个决策树的预测结果以提高模型的准确性和稳定性。
在随机森林中,每个决策树都是独立训练的。
参数:mtry
随机森林最重要的调节参数: m m m(代表在每个节点分裂时,随机选择的特征数量),可控制过拟合、提高模型稳定性。
在文献中一般称为“mtry”,在sklearn中称为“max_features
”.
对于回归树,一般建议随机选取 m = p / 3 m=p/3 m=p/3个变量( p p p为特征变量的个数 )。
对于决策树,则一般建议 m = p m=\sqrt{p} m=p.
调节参数 m m m (mtry)的选择,涉及偏差与方差的权衡,可通过袋外误差或交叉验证来确定。
另,对于随机森林,自助样本的数目 B B B不太重要。
变量重要性
度量“变量重要性”是评估特征对模型预测贡献的重要步骤。
对于每个变量,在随机森林的每棵决策树,可度量由该变量所导致的分裂准则函数( 残差平方和或基尼指数) 之下降幅度。 针对此下降幅度,对每棵决策树进行平均,即为对该变量重要性的度量。
偏依赖图
变量重要性 只是将特征变量的重要性进行了度量.feature_importances_
和排序.feature_importances_.argsort()
。
而偏依赖图(Partial Dependence Plots, PDP)可以展示每个变量对 y y y 的边际效应(marginal effects)。
偏依赖图PartialDependenceDisplay.from_estimator()
适用于任何 f ( ⋅ ) f(·) f(⋅) 无解析表达式的黑箱(black box)方法。
二、 回归问题-随机森林 案例
使用波士顿房价数据boston (参考【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 &【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree) )
1. 载入数据+数据处理
import numpy as np
import pandas as pd
# 从原始来源加载数据
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)
# 处理数据
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
# 创建DataFrame
columns = [
"CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX",
"PTRATIO", "B", "LSTAT"
]
df = pd.DataFrame(data, columns=columns)
df['MEDV'] = target
# 确定特征
X = df.drop(columns=['MEDV'])
y = df['MEDV']
# 将数据分割为训练集(70%)和测试集(30%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=1)
2. 装袋估计(BaggingRegressor)
1)进行袋装估计
from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor
model = BaggingRegressor(
estimator=DecisionTreeRegressor(random_state=123),
n_estimators=500, oob_score=True, random_state=0)
model.fit(X_train, y_train)
model.score(X_test, y_test)
结果输出: 0.9054552734857662
笔记:BaggingRegressor ()
BaggingRegressor(Bootstrap Aggregating Regressor)是一个用于回归任务的集成学习算法,通过构建多个回归模型的集合来提高预测性能和模型稳定性。它通过袋装方法(Bagging)对基学习器进行训练,并结合多个模型的预测结果来生成最终预测。
BaggingRegressor ()
是 Scikit-learn 库中的一个类,用于实现 Bagging 方法的回归版本。它通过对数据进行自助抽样(bootstrap sampling),训练多个回归模型,并对这些模型的预测结果进行平均,减少模型的方差,提高预测准确性。
#基本语法和参数
from sklearn.ensemble import BaggingRegressor
# 初始化 BaggingRegressor
model = BaggingRegressor(
estimator=DecisionTreeRegressor(), #基学习器
n_estimators=10, #基学习器的数量
max_samples=1.0, #每个基学习器训练时使用的样本比例或数量
max_features=1.0, #每个基学习器训练时使用的特征比例或数量
bootstrap=True, #是否进行自助采样
bootstrap_features=False, #是否对特征进行自助采样
oob_score=False, #是否使用袋外样本(out-of-bag samples)进行评分
n_jobs=None, #并行计算的作业数量
random_state=None)
estimator:基学习器,用于生成每个模型的实例。通常是一个回归模型,如 DecisionTreeRegressor、LinearRegression 等。
n_estimators:基学习器的数量。默认值为 10。增大该值通常可以提高模型的稳定性,但也会增加计算复杂度。
max_samples:每个基学习器训练时使用的样本比例或数量。默认值为 1.0(使用所有样本)。可以设为一个浮动比例(如 0.8),表示使用 80% 的样本进行训练。
max_features:每个基学习器训练时使用的特征比例或数量。默认值为 1.0(使用所有特征)。可以设为一个浮动比例(如 0.8),表示使用 80% 的特征进行训练。
bootstrap:是否进行自助采样(bootstrap sampling)。默认值为 True。当设置为 True 时,使用放回抽样;为 False 时,使用原始样本。
bootstrap_features:是否对特征进行自助采样。默认值为 False。当设置为 True 时,特征也会进行自助采样。
oob_score:是否使用袋外样本(out-of-bag samples)进行评分。默认值为 False。当设置为 True 时,模型会计算袋外样本的得分作为模型的评估指标。
n_jobs:并行计算的作业数量。默认值为 None,表示不使用并行计算。如果设为 -1,则使用所有可用的处理器。
random_state:控制随机数生成的种子,确保结果的可复现性。默认值为 None。
2)计算袋外样本性能
①启用袋外样本:在创建 BaggingRegressor 实例时,设置 oob_score=True
。这会使模型在训练过程中计算袋外样本的得分。
② .oob_prediction_
(只在设置 oob_score =True 时可用)获取袋外(Out-Of-Bag, OOB)样本的预测结果(包含了每个训练样本的袋外预测值,即在训练过程中没有用于该基学习器训练的样本的预测值)。
③ mean_squared_error()
计算袋外(OOB)均方误差(MSE)
④.oob_score_
获取袋外得分(对于回归任务,通常是 R² 得分(决定系数),它表示模型在袋外样本上的拟合优度。)。
#袋外预测
pred_oob = model.oob_prediction_
#袋外均方误差
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_train, pred_oob))
#袋外预测值的拟合优度
model.oob_score_
结果输出: 11.323470116238905
0.8605296124474909 低于模型在测试集上的 R²( 0.905)
笔记:BaggingRegressor 的属性
oob_score_
袋外样本的拟合优度(只在设置 oob_score =True 时可用)oob_prediction_
袋外样本的预测值。(只在设置 oob_score =True 时可用)estimators_
训练过程中使用的基学习器列表。类型:listfeature_importances_
为特征的重要性n_features_
训练时使用的特征数量。类型:intn_samples_
训练时使用的样本数量。类型:int
3)对比:线性回归
#对比:线性回归拟合优度
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(X_train, y_train)
model.score(X_test, y_test)
结果输出: 0.7836295385076302 低于BaggingRegressor的拟合优度
4)决策树的数量(n_estimators)对袋外误差的影响
oob_errors = [] #初始化一个空列表 oob_errors,用于存储每个模型的袋外(OOB)均方误差(MSE)。
for n_estimators in range(100,301):
model = BaggingRegressor(
estimator=DecisionTreeRegressor(random_state=123),
n_estimators=n_estimators,
n_jobs=-1, #使用计算机所有Kernel
oob_score=True, #启用袋外得分计算
random_state=0)
model.fit(X_train, y_train)
pred_oob = model.oob_prediction_
oob_errors.append(mean_squared_error(y_train, pred_oob))
#画出折线图
import matplotlib.pyplot as plt
plt.plot(range(100, 301), oob_errors)
plt.xlabel('Number of Trees')
plt.ylabel('OOB MSE')
plt.title('Bagging OOB Errors')
由上图可见,决策树的数量(B)> 200时,袋外误差基本稳定 → 继续扩大B 不会继续 增大/降低 袋外误差
3. 随机森林 估计(mtry=p/3)
1)对于回归树,一般mtry=p/3