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

scikit-learn系列之如何做算法集成_第1张图片
如何做算法集成

算法集成可以提升模型的准确率。在本文中,你会学习如何使用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

你可能感兴趣的:(scikit-learn系列之如何做算法集成)