scikit-learn系列之如何做算法集成

如何做算法集成

算法集成可以提升模型的准确率。在本文中,你会学习如何使用scikit-learn建立一些最有效的算法集成方法。我会带你一步步的完成 Bagging,Boosting和Voting,展示给你如何深入压榨模型的准确率。组合模型来做集成预测,目前有三个最流行的算法来完成。

1. Bagging:使用训练样本的不同子集来建立多个模型(一般是相同类型)
2.Boosting:建立多个模型的序列(一般是相同类型),后一个模型用来修正前一个模型的预测错误。
3. Voting:建立多个模型(一般是不同类型)和简单的统计量(比如均值),来进行组合预测。

本文不会具体展开每个模型,我假设你对机器学习算法已经有了一般性的了解,只是在寻找如何进行算法组合的方法。我们使用UCI的Pima Indians onset of Diabetes数据集来展示每个集成算法。这是一个标准的二值分类问题,输入变量为数值型,具有不同的scale。每个集成算法都使用10 fold 交叉验证,一个标准的评估机器学习模型表现的技术。

Bagging算法

Bootstrap Aggregation或者叫bagging,从你的训练集多次抽样,在每个样本上进行模型。最后的输出是所有子模型的预测的平均结果。本文介绍三个bagging模型。

  1. Bagged Decision Trees
  2. Random Forest
  3. Extra Trees

1. Bagged决策树

Bagging最适合那些具有高度变异的算法。很常用的一个例子就是决策树(不进行剪枝)。以下的例子使用 BaggingClassifier和the Classification and Regression Trees 算法 (DecisionTreeClassifier), 创建有100个树的模型。

# Bagged Decision Trees for Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()
num_trees = 100
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

2. 随机森林

随机森林是bagged决策树的一个扩展。从训练样本中可放回的抽样,构建决策树,但是要减少每个分类器之间的相关。就是说,不是贪婪地选取最佳的分割点,而是随机地选择特征子集建立分界点。你可以使用RandomForestClassifier类来构建随机森林模型。 以下例子使用100个树进行分类,随机选择3个特征构建分割点。

# Random Forest Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
max_features = 3
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

3. Extra Trees

Extra Trees 也是Bagging方法的一个修正版。使用训练样本直接构建随机树。你可以使用ExtraTreesClassifier类构建Extra Trees。以下例子构建了一个100个树的模型,选择7个随机特征。

# Extra Trees Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import ExtraTreesClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
max_features = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Boosting算法

Boosting集成算法创建一个模型序列,并试图矫正序列中该模型之前模型的错误。一旦模型被创建,模型使用单个模型的准确率作为权重进行整体的预测。两个最常用的boosting算法:

  1. AdaBoost
  2. Stochastic Gradient Boosting

1. AdaBoost

AdaBoost 大概是第一个有效的boosting算法. 一般根据具体实例是否容易被预测给其添加权重,当进行后续模型构建的时候根据权重对该实例进行处理。你可以使用AdaBoostClassifier类构建AdaBoost模型。以下例子构建了一个30个树的序列模型。

# AdaBoost Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import AdaBoostClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 30
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

2. Stochastic Gradient Boosting

Stochastic Gradient Boosting是最为精细的模型集成技术。它也可能是最有效的提升模型表现的集成技术。你可以使用 GradientBoostingClassifier类构建Gradient Boosting模型。以下例子构建一个100个树的模型。

# Stochastic Gradient Boosting Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import GradientBoostingClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Voting算法

Voting是组合多个算法进行预测的一个最简单的方法。首先使用你的训练集分别建立模型,Voting类用于组合你的模型,平均多个模型的结果来进行预测。子模型的预测可以进行加权,但是手动的给分类器加上权重还是比较困难的。更为高级的方法是让模型自己学习给子模型加权。这个所谓的stacked aggregation方法目前在 scikit-learn还不能实现。你可以使用VotingClassifier类建立voting模型。以下例子组合logistic 回归,分类和回归树以及SVM来进行预测。

# Voting Ensemble for Classification
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
# create the sub models
estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model2))
# create the ensemble model
ensemble = VotingClassifier(estimators)
results = model_selection.cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())

知识点:

  1. Bagging Ensembles包括Bagged Decision Trees, Random Forest and Extra Trees。
  2. Boosting Ensembles包括 AdaBoost and Stochastic Gradient Boosting。
  3. Voting Ensembles 以组合任意模型。
  4. sklearn.ensemble, BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier
  5. AdaBoostClassifier,GradientBoostingClassifier
  6. VotingClassifier

喜欢本文,就点个喜欢吧!

原文链接:Ensemble Machine Learning Algorithms in Python with scikit-learn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容