集成分类模型综合考量多个分类器的预测结果从而做出决策,这种“综合考量”的方式大体上分为两种:

(1)利用相同的训练数据同时搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则作出最终的分类决策。比较有代表性的是随机森林分类器

(2)按照一定次序搭建多个分类模型,这些模型之间存在依赖关系,一般而言,每一个后续模型的加入都需要对现有的集成模型的综合性能有所贡献,进而不断提升更新过后的集成模型的性能。比较有代表性的是梯度提升决策树。

本文通过预测泰坦尼克号乘客是否能够生还的案例来比较单一决策树、随机森林分类器和梯度提升决策树三个模型的性能。

import pandas as pd

titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
titanic.head()
#查看数据特性,可以发现有数据缺失
titanic.info()

#选择特征
X=titanic[['pclass','age','sex']]
y=titanic['survived']
#对当前选择的特征进行查验
X.info()

#age数据列有缺失,使用平均数或者中位数都是对模型偏离造成最小影响的策略
#mean()方法为均值,median()为中位数
X['age'].fillna(X['age'].mean(),inplace=True)
X.info()


#数据分割
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)
#特征转换器
from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False)
#转换特征后,我们发现凡是类别型的特征都单独剥离处理,独成一列特征,数值型的则保持不变
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
X_test=vec.fit_transform(X_test.to_dict(orient='record'))
print(vec.feature_names_)


#导入决策树分类器
from sklearn.tree import DecisionTreeClassifier
#使用默认配置初始化决策树分类器
dtc=DecisionTreeClassifier()
dtc.fit(X_train,y_train)
dtc_y_predict=dtc.predict(X_test)


#使用随机森林分类器进行集成模型的训练以及预测分析
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier()
rfc.fit(X_train,y_train)
rfc_y_predict=rfc.predict(X_test)

#使用梯度提升决策树进行集成模型的训练以及预测分析
from sklearn.ensemble import GradientBoostingClassifier
gbc=GradientBoostingClassifier()
gbc.fit(X_train,y_train)
gbc_y_predict=gbc.predict(X_test)

#性能评价
from sklearn.metrics import classification_report
#单一决策树模型的性能评价
print('The accuracy of decision tree is ',dtc.score(X_test,y_test))
print(classification_report(dtc_y_predict,y_test,target_names=['died','survived']))
#随机森林分类器模型的性能评价
print('The accuracy of random forest classifier is ',rfc.score(X_test,y_test))
print(classification_report(rfc_y_predict,y_test,target_names=['died','survived']))
#梯度提升决策树模型的性能评价
print('The accuracy of gradient tree boosting is ',gbc.score(X_test,y_test))
print(classification_report(gbc_y_predict,y_test,target_names=['died','survived']))



下面是评价结果

The accuracy of decision tree is  0.781155015198
             precision    recall  f1-score   support

       died       0.91      0.78      0.84       236
   survived       0.58      0.80      0.67        93

avg / total       0.81      0.78      0.79       329

The accuracy of decision tree is  0.781155015198
             precision    recall  f1-score   support

       died       0.90      0.78      0.83       234
   survived       0.59      0.79      0.68        95

avg / total       0.81      0.78      0.79       329

The accuracy of decision tree is  0.790273556231
             precision    recall  f1-score   support

       died       0.92      0.78      0.84       239
   survived       0.58      0.82      0.68        90

avg / total       0.83      0.79      0.80       329



可以发现,在相同的训练和测试数据条件下,仅仅使用模型的默认配置,梯度上升决策树具有最佳的预测性能,其次是随机森林分类器,最后是单一决策树。