DecisionTree

数据描述

使用泰坦尼克号乘客信息数据,预测其生还情况

1
2
3
4
5
6
# 导入 pandas 用于数据分析
import pandas as pd
# 利用 pandas 的 read_csv 模块直接从互联网收集泰坦尼克号乘客数据
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
# 观察前几行数据,可以发现,数据种类各异,数值型、类别型,甚至还有缺失数据
titanic.head()

观察前几行数据

1
2
# 使用 pandas,数据都转入 pandas 独有的 dataframe 格式(二维数据表格),直接使用 info(),查看数据的统计特性
titanic.info()

转格式

由输出可知,该数据共有 1313 条乘客信息,并且有些特征数据是完整的(如pclass,name 等),有些则是缺失的;有些是数值类型的,有些则是字符串。

特征选择

1
2
3
4
5
6
# 机器学习十分重要的一环:特征的选择。需要基于一些背景知识,根据我们队这场事故的了解,sex, age, pclass 这些特征都很有可能是决定幸免于否的关键因素。
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 对当前选择的特征进行探查
X.info()

特征选择

数据处理

借由上面的输出,我们设计如下几个数据处理的任务:

  1. age 这个数据列,只有 633个数据,需要补完;
  2. sex 与 pclass 两个数据列的值都是类别型的,需要转化为数值特征,用 0/1 代替。
1
2
3
4
5
# 首先我们补充 age 里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略。
X['age'].fillna(X['age'].mean(), inplace=True)
# 对补完的数据重新探查
X.info()

补完

由输出可知,age 特征得到了补完。

准备训练集、测试集

1
2
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)

特征转换

1
2
3
4
5
6
7
# 使用 scikit-learn.feature_extraction 中的特征转换器
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
# 转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一系列特征,数值型的则保持不变。
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print vec.feature_names_

转换特征后

1
2
# 同样需要对测试数据的特征进行转换
X_test = vec.transform(X_test.to_dict(orient='record'))

使用决策树预测乘客是否生还

1
2
3
4
5
6
7
8
# 从 sklearn.tree中导入决策分类器
from sklearn.tree import DecisionTreeClassifier
# 使用默认配置初始化决策树分类器
dtc = DecisionTreeClassifier()
# 使用分割到的训练数据进行模型学习
dtc.fit(X_train, y_train)
# 用训练好的决策树模型对测试特征数据进行预测
y_predict = dtc.predict(X_test)

性能测评

1
2
3
4
5
6
# 从 sklearn.metrics 里导入 classification_report
from sklearn.metrics import classification_report\
# 输出预测准确性
print dtc.score(X_test, y_test)
# 输出更加详细的分类性能
print classification_report(y_predict, y_test, target_names=['died','survived'])

性能

由输出可知,决策树模型总体在测试集上的预测准确性约为 78.12%。该模型在预测遇难者方面的性能较好,在识别生还者的准确率方面仍有待提高。

特点分析

决策树的推断逻辑非常直观,具有清晰地可解释性,也方便了模型的可视化。这些特性同时也保证在使用决策树模型时,是无须考虑对数据的量化甚至标准化的。并且,与前一节K近邻模型不同,决策树仍然属于有参数模型,需要花费更多的时间在训练数据上。