(一)机器学习中的集成学习入门

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


使用各种不同的模型而不仅仅是一种模型是非常可靠的。 在一个组上一起工作的几个模型的集合称为 Ensemble。 该方法称为 Ensemble Learning,也就是集成学习。

投票模型

你可以使用不同的算法训练您的模型,然后将它们合并以预测最终输出。 比如说,你使用随机森林分类器,SVM分类器,线性回归等;模型相互匹配,并通过使用 sklearn.ensemble 中的 VotingClassifier 类进行投票,从而得到最佳的分类答案。硬投票是指从集合中选择模型以通过简单多数投票进行最终预测以获得准确性。只有当所有分类器都可以计算结果的概率时,才能进行软投票。 软投票通过平均各个算法计算的概率得出最佳结果。

具体 Python 代码如下:

from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier

log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()

voting_clf = VotingClassifier(
	estimators = [('lr', log_clf), ('rf', rnd_clf), ('svc',svm_clf)],
	voting = 'hard')
voting_clf.fit(X_train, y_train)

VotingClassifier 的准确性通常高于单个分类器。 确保包含不同的分类器,以便对于类似数据分布的拟合不会出现在一起。

bagging和pasting

您可以在数据集的各种随机子集上使用单个模型,而不是在单个数据集上运行各种模型。 带替换的随机抽样算法称为Bagging。 如果你脑海中难以想象,只需想象忽略数据集中的几个随机数据并与其余数据进行建模。 在pasting的情况下,应用相同的过程,唯一的区别在于pasting不允许对相同的预测器多次采样训练实例。

python 代码如下:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(random_state=42), n_estimators=500,
    max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)

y_pred = bag_clf.predict(X_test)

bootstrap = True参数指定使用Bagging。 对于pasting算法,将参数更改为bootstrap = False就可以了。

如果分类器可以计算其预测的概率,则BaggingClassifier自动执行软投票。 这可以通过检查你的分类器是否具有predict_proba()方法来验证。

但是,Bagging 通常比 pasting 效果好得多。

评估

在训练集上执行 Bagging 时,只有63%的实例包含在模型中,这意味着分类器之前没有看到过37%的实例。 这些可以像交叉验证一样用于评估。

要使用此功能,只需在前面示例中的BaggingClassifier类中添加oob_score = True参数就可以了。

Python 代码如下:

bag_clf = BaggingClassifier(
DecisionTreeClassifier(random_state=42), n_estimators=500,
max_samples=100, bootstrap=True, n_jobs=-1, random_state=42,
oob_score = True) 

到目前为止,只有实例被采样。但是对于具有大量特征的数据集,还有其他技术。

随机森林

决策树的集合是随机森林。 随机森林在内部执行 Bagging。 随机森林创建了几棵树,有时是数千棵树,并为给定的数据集计算最佳模型。 随机森林算法不是在分割节点时考虑所有特征,而是从所有特征的子集中选择最佳特征。 这为较低的方差换取较高的偏差,从而产生更好的模型。

Python 代码如下:

from sklearn.ensemble import RandomForestClassifier

rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)

y_pred_rf = rnd_clf.predict(X_test)

参数:n_estimators 是森林中树的限制数。 max_leaf_nodes 用于设置最终节点的最大数量,以便算法不会在单个特征中深入钻取并过度拟合模型(有关详细说明,请参阅决策树)。 n_jobs 指定要使用的计算机的核心数; -1值表示所有可能的最大内核。

使用网格搜索可以通过改变参数值来改进模型。

AdaBoost

虽然AdaBoost技术的功能数学非常令人生畏,但其理念非常简单。 首先,选择一个基本分类器,对给定的集进行预测。 记下错误分类的实例。 错误分类的实例的权重增加。 在训练集上训练第二分类器并使用更新的权重。

简单来说,运行分类器并进行预测。 运行另一个分类器以适合以前错误分类的实例并进行预测。 重复,直到所有/大多数训练实例都适合。

Python代码如下:

from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=1), n_estimators=200,
    algorithm="SAMME.R", learning_rate=0.5, random_state=42)
ada_clf.fit(X_train, y_train)

Scikit-learn 使用 Adaboost 的多类版本称为 SAMME(使用多类指数损失函数的Stagewise Additive Modeling)。 如果预测变量可以计算概率(具有predict_proba()方法),则Scikit Learn使用SAMME.R(R表示实数),它依赖于概率并且不易过度拟合。如果过度拟合,请尝试对基本估算器进行正则化。

Gradient Boosting

与AdaBoost类似,Gradient Boosting也适用于添加到整体的连续预测模型。 Gradient Boosting不是更新AdaBoost等训练实例的权重,而是将新模型与残差相匹配。

简而言之,将模型拟合到给定的训练集。 计算成为新训练实例的残差。 一个新的模型就这些进行了训练等等。 选择添加所有模型进行预测。

python 代码如下:

from sklearn.ensemble import GradientBoostingRegressor

gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)

学习率参数缩小了每棵树的贡献。 在learning_rate和n_estimators之间进行权衡。 降低learning_rate的值会增加整体中的树的数量。 这称为收缩。 不同的是,将估算器的数量增加到较大值可能会使模型过度拟合。

XGBoost

XGBoost是最近,最优秀和最强大的梯度增强方法。 XGBoost 不是在 Leaf 节点上做出“是”和“否定决定”,而是为每个决策分配正面和负面的价值。 所有树木都是弱学习者,并提供比随机猜测略好的决策。 但总的来说,XGBoost 表现得非常好。

Python 代码如下:

from xgboost import XGBoostClassifier
xgb_clf = XGBClassifier()
xgb_clf.fit(X, y)

XGBoost可以与树和线性模型一起使用,并且已经被用于最成功的Kaggle比赛模型中。 它是您的数据科学工具箱中的强大工具。

发布了414 篇原创文章 · 获赞 168 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/CoderPai/article/details/90609944
今日推荐