目录
一、基础认识
1. 集成算法介绍
2. 集成算法种类
二、sklearn中的随机森林
1. ensemble.RandomForestClassifier (随机森林分类)
(1)基本参数
(2)基本属性
(3)基本接口
2. ensemble.RandomForestRegressor (随机森林回归)
3. 其他(补充)
三、测试代码
1. ensemble.RandomForestClassifier
2. ensemble.RandomForestRegressor
一、基础认识
1. 集成算法介绍
集成学习 (ensemble learning) 是时下非常流行的 机器学习算法,它本身不是一个 单独的机器学习算法,而是 通过在数据上构建多个模型,集成所有模型的建模结果。基本上 所有的机器学习领域都可以 看到集成学习的 身影。在现在的 各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广。
集成算法目标:
集成算法 会考虑 多个评估器的 建模结果,汇总之后 得到一个综合 的结果,以此来 获取比 单个模型更好的回归或分类表现。
2. 集成算法种类
多个模型集成成为的模型叫做 集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting) 和stacking。
装袋法 的核心思想是构建多个相互独立的评估器,然后 对其预测 进行平均 或多数 表决原则来 决定集成评估器的 结果。装袋法的 代表模型就是 随机森林。
提升法 中,基评估器是 相关的,是按顺序 — — 构建的。其核心思想 是结合弱评估器的力量一次次对难以评估的样本 进行预测,从而构成一个强评估器。提升法的代表模型 有Adaboost和梯度提升树。
二、sklearn中的随机森林
涉及模块:sklearn.ensemble
1. ensemble.RandomForestClassifier (随机森林分类)
(1)基本参数
(2)基本属性
(3)基本接口
2. ensemble.RandomForestRegressor (随机森林回归)
重要参数:criterion
回归树 衡量分枝质量的指标,支持的标准有三种:
① 输入“ mse”使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来 作为 特征选择的 标准,这种方法 通过 使用叶子节点的 均值来 最小化 L2损失。
② 输入“ friedman_mse”,使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差。
③ 输入“ mae” 使用绝对平均误差 MAE (mean absolute error),这种指标使用 叶节点的中值来 最小化 L1损失。
3. 其他(补充)
① 单个决策树的 准确率越高,随机森林的 准确率也会越高,因为 装袋法是 依赖于 平均值或者少数 服从多数 原则来 决定集成的结果的。
② n_estimators 参数对 随机森林模型的 精确性影响是 单调的,n_estimators 越大,模型的效果 往往越好。但是相应的,任何模型 都有决策边界,n_estimators达到一定的程度之后,随机森林的 精确性往往 不在上升 或 开始波动,并且,n_estimators 越大,需要的 计算量和 内存也越大,训练的时间 也会越来越长。
③ 当 random_state固定时,随机森林中生成是 一组固定的树,但 每棵树依然是 不一致的,这是 用随机挑选特征 进行分枝 的方法得到的 随机性。并且可以证明,当这种随机性越大 的时候,袋装法的效果 一般会越来越好。用 袋装法集成时,基分类器 应当是 相互独立的,是不相同的。
④ 袋装法 是通过 有放回的 随机抽样技术 来形成不同 的训练数据。在 使用随机森林时,我们 可以不划分 测试集和训练集,只需要 用袋外数据来 测试我们的 模型即可。(即控制 oob_score参数)
⑤ 当 n 和 n_estimators 都不够大 的时候,很可能 就没有 数据掉 落在袋外,自然也就无法使用 oob 数据来 测试模型了。
⑥ 在使用 袋装法时 要求基评估器 要尽量独立。其次还有 另一个必要条件:基分类器的判断准确率至少要超过随机分类器,即,基分类器的判断准确率至少要超过 50%。
三、测试代码
1. ensemble.RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 实例化数据集
data = load_breast_cancer()
rfc = RandomForestClassifier(criterion='gini',
n_estimators=72,
random_state=90,
max_depth=8,
min_samples_split=2,
max_features=22
)
rfc = rfc.fit(data.data, data.target)
score = cross_val_score(rfc, data.data, data.target, cv=10).mean()
print(score)
2. ensemble.RandomForestRegressor
# 导入波士顿房价数据集
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\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]
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
rfr = RandomForestRegressor(n_estimators=100, random_state=90)
score = cross_val_score(rfr, data, target, scoring='neg_mean_squared_error', cv=5).mean()
print(score)