5.【基础】泰坦尼克号幸存预测--DecisionTree

本文所有实现代码均来自《Python机器学习及实战》

#-*- coding:UTF-8 -*-

#第一步:读取泰坦尼克号乘客数据
import pandas as pd
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#观察前几行数据,可以发现数据种类各异(数值型,类别型),甚至还有缺失数据
titanic.head()
#使用pandas,数据都转入pandas独有的dataframe格式(二维数据表格),直接使用info(),查看数据的统计特性
titanic.info()

#第二步:特征选择与数据预处理
#根据分析,我们认为sex,age,pclass这些特征都很有可能成为决定幸免与否的决定性因素
X = titanic[['pclass','sex','age']]
y = titanic['survived']
#对当前选择的特征进行探查
print X.info()
#通过上面的输出,有以下几个任务需要完成
#1.age这一列的数据只有633个,我们需要补充完整
#2.sex与pclass的值都是类别型,需要转换成数值特征,用0/1代替。
#填充age的缺失值,用平均值或者中位数来代替
X['age'].fillna(X['age'].mean(),inplace=True)

#第三步:数据分割
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
#这里导入的是DictVectorizer,不同于文本分类中的CountVectorizer!
#sparse=False指不用稀疏矩阵表示
vec = DictVectorizer(sparse=False) 
#转换特征之后,我们发现凡是类别型的特征都单独剥离出来,独自构成一列特征,数值型特征则保持不变,如sex分割成'sex=female', 'sex=male'两列
#因为我们这里用的是决策树分类,每一个节点最多有2个分支,所以我们将所有特征值全部转换为0/1的形式,即为什么将类别型剥离出来
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print vec.feature_names_
#同样需要对测试数据进行特征转换
X_test = vec.fit_transform(X_test.to_dict(orient='record'))

#第五步:使用决策树分类器训练模型并预测
from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
dtc.fit(X_train,y_train)
y_predict = dtc.predict(X_test)

#第六步:对决策树分类器的预测性能进行评估
from sklearn.metrics import classification_report
print 'Accuracy of dtc:',dtc.score(X_test,y_test)
print classification_report(y_predict,y_test,target_names=['died','survived'])

#总结:
#决策树模型的推断逻辑比较直观,具有清晰的可解释性,也方便了模型的可视化,无需考虑对数据的量化甚至是标准化
#属于参数模型,需要花费更多的时间在训练数据上

你可能感兴趣的:(机器学习实战)