集成是合并多个学习模型来构建更强大模型的方法。
随机森林
随机森林是解决决策树经常对训练数据过拟合的一种方法,是许多决策树的集合,每棵树和其他树略有不同,对这些树的结果取平均值。
在two-moons数据集应用RandomForestClassifier
树的个数(n_eastimators参数决定)->对每棵树:自取采样(随机抽取与原数据集元素相同个数但是内容有重复的数据集)->对每次测试只选择其中一边继续测试(深度由max_features参数决定)
为了每棵树差异不会过大,更好拟合,每棵树的深度要很大。
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
# two_moons数据集
x, y = make_moons(n_samples=100, noise=0.25, random_state=3)
x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=42)
# 构造森林
forest = RandomForestClassifier(n_estimators=5, random_state=2).fit(x_train, y_train)
# 可视化
fig, axes = plt.subplots(2, 3, figsize=(20, 10))
for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
ax.set_title("Tree {}".format(i))
mglearn.plots.plot_tree_partition(x_train, y_train, tree, ax=ax)
# 最后一个画布axes[-1,-1]
mglearn.plots.plot_2d_separator(forest, x_train, fill=True, ax=axes[-1,-1], alpha=.4) # 分界线
axes[-1,-1].set_title('Random Forest')
mglearn.discrete_scatter(x_train[:, 0], x_train[:, 1], y_train)
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
ravel() 函数实现将多维数组降位一维。ravel(散开,解开)
estimators_属性 :在RandomForestClassifier中,指的是决策树分类器的集合。
参数
- n_jobs参数:调节使用的内核个数。在大型数据集上都贱随机森林可能会比较费时,可以使用多个CPU内核加快处理。
- random_state参数:控制随机状态。随机森林本质是随机的,可以设置不同的随机状态(或者不设置)可以彻底改变模型结构。
- 预剪枝选项(max_depth)
- n_estimators参数:指定决策树的个数。在内存允许的情况下尽量多,可以起到降低过拟合得到鲁棒性更好的集成。
- max_features参数:决定每棵树随机性大小。较小可以降低过拟合。一般使用默认值:分类max_features=sqrt(n_features),回归max_features=m_features
梯度提升回归树(梯度提升机)
可以用在分类和回归。
梯度提升是合并许多简单的模型(弱学习器:深度较小的树),添加的树越来越多,可以不断迭代提高性能。
在cancer数据集应用GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=0)
# 构造分类器
gbrt = GradientBoostingClassifier(random_state=0).fit(x_train, y_train)
print(gbrt.score(x_train, y_train)) # 1.0
print(gbrt.score(x_test, y_test)) # 0.958041958041958
# 降低学习率来加强预剪枝
gbrt2 = GradientBoostingClassifier(random_state=0, learning_rate=0.01).fit(x_train, y_train)
print(gbrt2.score(x_train, y_train)) # 0.9953051643192489
print(gbrt2.score(x_test, y_test)) # 0.9440559440559441
learning_rate参数:学习率。学习率越低就需要越多的树来构建具有相似复杂度的模型,
参数
与随机森林比,模型对参数设置更为敏感,参数设置正确模型精度更高。
- 除了预剪枝与集成中树的数量以外,还有learning_rate参数:学习率,用于控制每棵树纠正前一棵树错误的强度。可以通过增大n_estimators来向集成中添加更多树。这两个参数高度相关。通常根据时间和内存选择合适的n_estimators,然后对不同的learning_rate进行遍历。
- max_depth(一般不超过5)/max_leaf_nodes用以降低每棵树的复杂度
优缺点
优:不需要对数据进行缩放就可以表现很好;适用于二元特征与连续特征同时存在的数据。
缺:需要仔细调参;训练时间可能比较长;不适用于高维稀疏矩阵。