提升(Boosting)分类器隶属于集成学习模型。它的基本思想是把成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的模型。这个模型的特点在于不断迭代,每次迭代就生成一颗新的树。对于如何在每一步生成合理的树,大家提出了很多的方法,比如我们在集成(分类)模型中提到的梯度提升树(Gradient Tree Boosting)。它在生成每一棵树的时候采用梯度下降的思想,以之前生成的所有决策树为基础,向着最小化给定目标函数的方向再进一步。
在合理的参数设置下,我们往往要生成一定数量的树才能达到令人满意的准确率。在数据集较大较复杂的时候,模型可能需要几千次迭代运算。但是,XGBoost工具更好地解决这个问题。XGBoot 的全称是eXtreme Gradient Boosting。正如其名,它是Gradient Boosting Machine的一个C++实现。XGBoost最大的特点在于能够自动利用CPU的多线程进行并行,并在算法上提高了精度。
#对比随机决策森林以及XGBoost模型对泰坦尼克号上的乘客是否生还的预测能力
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
#通过URL地址来下载Titanic数据
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#选取pclass、age以及sex作为训练特征。
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
#对缺失的age信息,采用平均值方法进行补全,即以age列已知数据的平均数填充。
X['age'].fillna(X['age'].mean(), inplace=True)
#对原数据进行分割,随机采样25%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
#对原数据进行特征向量化处理
vec = DictVectorizer(sparse=False)
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))
#采用默认配置的随机森林分类器对测试集进行预测。
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
print('The accuracy of Random Forest Classifier on testing set:', rfc.score(X_test, y_test))
#out[]:The accuracy of Random Forest Classifier on testing set: 0.78419452887538
#采用默认配置的XGBoost模型对相同的测试集进行预测。
from xgboost import XGBClassifier
xgbc = XGBClassifier()
xgbc.fit(X_train, y_train)
print('The accuracy of eXtreme Gradient Boosting Classifier on testing set:', xgbc.score(X_test, y_test))
#out[]:The accuracy of eXtreme Gradient Boosting Classifier on testing set: 0.7872340425531915
从上述输出的观察,我们可以发现,XGBoost分类模型的确可以发挥更好的预测能力。