算法集成可以提升模型的准确率。在本文中,你会学习如何使用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模型。
- Bagged Decision Trees
- Random Forest
- 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算法:
- AdaBoost
- 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())
知识点:
- Bagging Ensembles包括Bagged Decision Trees, Random Forest and Extra Trees。
- Boosting Ensembles包括 AdaBoost and Stochastic Gradient Boosting。
- Voting Ensembles 以组合任意模型。
- sklearn.ensemble, BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier
- AdaBoostClassifier,GradientBoostingClassifier
- VotingClassifier
喜欢本文,就点个喜欢吧!
原文链接:Ensemble Machine Learning Algorithms in Python with scikit-learn