如果要借由一个人的年龄来预测患流感的死亡率,这里肯定无法采用线性模型,如果要用数学表达式描述这种非线性关系,使用分段函数最为合理,而在机器学习模型中,决策树就是描述这种非线性关系的不二之选。决策树常用的度量方法包括信息熵和基尼不纯性,Scikit-learn中决策树模型默认配置的就是基尼不纯性。
本篇博客不讲述决策树分类模型的理论知识,而是采用一个对泰坦尼克号乘客是否能够生还进行预测的实例进行学习。语言是Python3.6,环境是Anaconda3。
1、读取泰坦尼克号乘客数据并查验
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()
2、对缺失的数据进行处理
#age数据列有缺失,使用平均数或者中位数都是对模型偏离造成最小影响的策略
#mean()方法为均值,median()为中位数
X['age'].fillna(X['age'].mean(),inplace=True)
X.info()
3、分割训练集和测试集
#数据分割
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)
4、使用决策树模型预测乘客的生还情况
#特征转换器
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)
y_predict=dtc.predict(X_test)
5、对预测结果进行评价
#性能评价
from sklearn.metrics import classification_report
print(dtc.score(X_test,y_test))
print(classification_report(y_predict,y_test,target_names=['died','survived']))
6、结果分析
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
决策树模型总体上预测准确性约为78.12%,从详细的性能指标可以看出,该模型在预测遇难者方面性能较好,却需要在识别生还者的精确率方面下功夫。