1 集成方法(Ensemble methods)
1.1 什么是集成方法
简单来说,集成方法 就是组合多个模型,以获得更好效果。
1.2 两种集成方法
- 平均法(averaging methods):也有人直接称之为“袋装法”,所有算法进行 相互独立 训练得到各自的模型,然后再进行投票选择最好的模型。如 随机森林(Forests of randomized trees) 与 袋装法(Bagging methods) 。
- 提升法(boosting methods): 训练开始后,从第二个模型开始,每个模型是针对前一个模型进行加权叠加。如 自适应提升(Adaboost) 与 梯度树提升(Gradient Tree Boosting) 。
2 随机森林(Random Forests)
2.1 “森林”
在随机森林中,集合中的每棵树都是 从训练集中抽取的替换样本中构建的。大量的这样的树,即构成了所说的“森林”。
2.2 “随机”
在树的构造过程中分割每个节点时,可以从所有输入特征中找到最佳分割,也可以在1~max_features
范围中随机选取若干个特征进行分割节点操作。
2.3 作用
这两种随机性来源的目的是降低森林估计器的方差。事实上,单个决策树通常表现出高方差,并且倾向于过度拟合。森林中的注入随机性使得决策树具有一定程度的解耦预测误差。
通过取这些预测的平均值,一些错误可以抵消。随机森林通过组合不同的树来减少方差,有时以稍微增加偏差为代价。在实践中,方差的减少通常是显著的,因此产生了一个整体上更好的模型。
2.4 优点
- 对于很多种数据,它可以产生高准确度的分类器;
- 它可以处理大量的输入变数;
- 它可以在决定类别时,评估变数的重要性;
- 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计;
- 它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;
- 它提供一个实验方法,可以去侦测variable interactions;
- 对于不平衡的分类资料集来说,它可以平衡误差;
- 它计算各例中的亲近度,对于数据挖掘、侦测离群点(outlier)和将资料视觉化非常有用;
- 使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;
- 学习速度快。
简单应用
简单分享一下sklearn官网的例子。
重要说明 sklearn的版本为0.22.1
,之前的版本不一定
能运行一下代码。
酒的类别预测(SVM vs Random Forests)
数据集来自于sklearn官网例子,已经内置于sklearn中,具体信息可以参考 https://scikit-learn.org/stable/datasets/index.html#wine-recognition-dataset
如果对ROC曲线不甚了解的话,不妨参考这篇大佬的文章.
这里只强调其中一点:AUC值越大,模型的分类效果越好
。
代码1
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import plot_roc_curve
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
# 使用官网自带的函数,y是类别,y 取值范围为 {1,2,3}
X, y = load_wine(return_X_y=True)
# 将多分类问题转换为二分类问题
y = y == 2
# 分割为训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
# 训练svc模型
svc = SVC(random_state=42)
svc.fit(X_train, y_train)
可以看到输出内容为:
SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',max_iter=-1, probability=False, random_state=42, shrinking=True, tol=0.001,verbose=False)
接着查看svc模型的ROC曲线图,代码如下:
代码2
# 效果展示
svc_disp = plot_roc_curve(svc, X_test, y_test)
plt.show()
可以看到如图所示的ROC曲线图:
代码3
# 随机森林分类器
rfc = RandomForestClassifier(n_estimators=10, random_state=42)
# 拟合
rfc.fit(X_train, y_train)
ax = plt.gca()
rfc_disp = plot_roc_curve(rfc, X_test, y_test, ax=ax, alpha=0.8)
svc_disp.plot(ax=ax, alpha=0.8)
plt.show()
可以看到RandomForests与SVC的ROC曲线图如下:
调参工作
svc模型参数中c默认为1实在太小,而随机森林却把参数n_estimators=10
,看起来的确有些不公平,不妨调整一下。可以发现n_estimators=3
时效果最佳,AUC=0.99,而SVC中的C=300
时才能达到0.96的AUC。
更多例子
更多例子参考sklearn官网例子,https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#examples-using-sklearn-ensemble-randomforestclassifier
Smileyan
2020年3月1日 0:06