100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python数据分析/机器学习 笔记之决策树(泰坦尼克号旅客生存预测)

python数据分析/机器学习 笔记之决策树(泰坦尼克号旅客生存预测)

时间:2018-09-04 22:42:03

相关推荐

python数据分析/机器学习 笔记之决策树(泰坦尼克号旅客生存预测)

最近在学习用python数据分析,不可避免的接触到了机器学习的一些算法,所以在这里简单整理一些学习的笔记和心得与大家分享!

首先机器学习分为:监督学习和非监督学习,前者有参照物,后者为参照物;主要分为回归预测、分类预测、聚类等。

今天要学习的是监督学习中的决策树算法!决策树既可以用于回归也可用来分类,是较常用的模型之一。

下面直接说下用python实现决策树的数据分析

数据源:泰坦尼克号旅客信息(训练数据:特征信息和是否存货;测试数据:特征信息)

具体特征字段:

我们直接使用python中自带的sklearn 中自带的决策树分类器 DecisionTreeClassifier

clf = DecisionTreeClassifier(criterion='entropy')

sklearn 中只实现了 ID3 与 CART 决策树,在构造 DecisionTreeClassifier 类时,其中有一个参数是 criterion,意为标准。

它决定了构造的分类树是采用 ID3 分类树,还是 CART 分类树,对应的取值分别是 entropy 或者 gini

entropy: 基于信息熵,也就是 ID3 算法,实际结果与 C4.5 相差不大;

gini:默认参数,基于基尼系数。criterion=gini 时,实际上执行的是 CART 。

在构造决策树分类器后,我们可以使用 fit 方法让分类器进行拟合,使用 predict 方法对新数据进行预测,得到预测的分类结果,也可以使用 score 方法得到分类器的准确率。

下面开始进行分析

1、数据探索

使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度

使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等

使用 describe(include=[‘O’]) 查看字符串类型(非数字)的整体情况

使用 head 查看前几行数据(默认是前 5 行)

使用 tail 查看后几行数据(默认是最后 5 行)

import pandas as pd# 数据加载train_data = pd.read_csv('./Titanic_Data/train.csv')test_data = pd.read_csv('./Titanic_Data/test.csv')# 数据探索print(train_data.info())print('-'*30)print(train_data.describe())print('-'*30)print(train_data.describe(include=['O']))print('-'*30)print(train_data.head())print('-'*30)print(train_data.tail())

2、数据清洗

我们发现 Age、Fare 和 Cabin 这三个字段的数据有缺失,其中 Age 为年龄字段,是数值型,我们可以通过平均值进行补齐;Fare 为船票价格,是数值型,我们也可以通过其他人购买船票的平均值进行补齐。

# 使用平均年龄来填充年龄中的 nan 值train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)# 使用票价的均值填充票价中的 nan 值train_data['Fare'].fillna(train_data['Fare'].mean(), inplace=True)test_data['Fare'].fillna(test_data['Fare'].mean(),inplace=True)

Cabin 为船舱,有大量的缺失值,在训练集和测试集中的缺失率分别为 77% 和 78%,无法补齐;Embarked 为登陆港口,

有少量的缺失值,我们可以把缺失值补齐。

首先观察下 Embarked 字段的取值,方法如下:

print(train_data['Embarked'].value_counts())

结果如下:

S 644C 168Q77

我们发现一共就 3 个登陆港口,其中 S 港口人数最多,占到72%,因此我们将其余缺失的 Embarked 数值均设置设为S

# 使用登录最多的港口来填充登录港口的 nan 值train_data['Embarked'].fillna('S', inplace=True)test_data['Embarked'].fillna('S',inplace=True)

3、特征选择

特征选择也就是选择会影响分类结果的因素有哪些?乘客编号passengerid和乘客姓名name这种无规律无意义的数据不用选择,船舱cabin数据缺失较严重不选择,所以剩下的字段我们都作为特征字段选择。

# 特征选择features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']train_features = train_data[features]train_labels = train_data['Survived']test_features = test_data[features]

但是特征值中很多为字符串,这样分析起来不方便,所以我们将字符串转换为数字。eg:sex列中为male,female转换为单独的列,并用0或1来表示是否存在,同理Embarked。

使用 sklearn 特征选择中的 DictVectorizer 类,用它将可以处理符号化的对象,将符号转成数字 0/1 进行表示:

from sklearn.feature_extraction import DictVectorizerdvec=DictVectorizer(sparse=False)train_features=dvec.fit_transform(train_features.to_dict(orient='record'))

原本是一列的 Embarked,变成了“Embarked=C”“Embarked=Q”“Embarked=S”三列

Sex 列变成了“Sex=female”“Sex=male”两列

这样 train_features 特征矩阵就包括 10 个特征列

4、决策树模型

现在我们使用ID3算法,所以设置 criterion=‘entropy’,使用 fit 进行训练,将特征值矩阵和分类标识结果作为参数传入。

from sklearn.tree import DecisionTreeClassifier# 构造 ID3 决策树clf = DecisionTreeClassifier(criterion='entropy')# 决策树训练clf.fit(train_features, train_labels)

5、输出预测结果

test_features=dvec.transform(test_features.to_dict(orient='record'))# 决策树预测pred_labels = clf.predict(test_features)print(pred_labels)

结果如下:

[0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 00 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 1 0 0 01 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 0 00 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 00 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 10 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 01 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 10 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 01 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 10 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 00 0 1 0 1 0 0 1 0 0 0]

最后我们可以使用决策树中自带score函数来看模型的准确率:

# 得到决策树准确率acc_decision_tree = round(clf.score(train_features, train_labels), 6)print(u'score 准确率为 %.4lf' % acc_decision_tree)

结果:

score 准确率为 0.9820

以上就算是一个完整的数据分析过程,大部分为学习课程中的摘抄和整理(非全部原创)仅供大家参考。

用到的数据可以在 GitHub 上下载:/cystanford/Titanic_Data

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。