目录
1. ensemble.RandomForestClassifier (随机森林分类)
2. ensemble.RandomForestRegressor (随机森林回归)
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)