机器学习案例5:基于决策树的泰坦尼克号生存预测

案例5:基于决策树的泰坦尼克号生存预测

为什么写本博客

​ 前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。

需要的基础

​ 懂不懂原理不重要,本系列的目标是使用python实现机器学习。

​ 必须会的东西:python基础、numpy、pandas、matplotlib和库的使用技巧。

说明

​ 完整的代码在最后,另外之前案例中出现过的方法不会再讲解。

感觉本次代码存在问题,但是自己没有发觉,有所错误,望理解。

目录结构

1. 涉及的新方法:

模型创建

from sklearn.tree import DecisionTreeClassifier
# 创建模型
model = DecisionTreeClassifier()
'''
常用参数介绍:
	max_depth 树的最大深度
	criterion='gini / entropy' 指定划分标准基尼或者信息增益
	min_samples_split 内部节点划分最小样本数,即样本数小于它,不再划分
	min_samples_leaf 叶节点最小样本数
'''

pandas缺失值替换

import pandas as pd
# 假设x 为pandas数据对象
x.fillna(填充的值,inpalce=True)
# inpalce表示是否直接替换原始数据,否则返回新数据

2. 数据集介绍与处理:

数据集下载

​ 泰坦尼克号数据集来源于kaggle官网,如果你已经注册过账号,可以直接在官网下载:

https://www.kaggle.com/c/titanic/overview

​ 如果你没有注册或者注册失败(常见问题是没有验证码),你可以在国内的天池网站上下载,这里注册很简单,地址为:

https://tianchi.aliyun.com/dataset/111507?t=1672890630716

在这里插入图片描述

将数据集下载到本地的data文件夹下,代码py文件与data同一级别。

数据集介绍

​ 虽然通过下载的数据集,看到已经划分为train和test了,但是细看会发现test数据集没有survived列,因此,我们还是需要自己划分一下数据集

​ 另外,打开train.csv,看其中的数据,不难发现,特征如下:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
# survived表示是否活下来了
# pclass: 乘客买的票类别,代表了地位
# age : 年龄
# sex : 性别

​ 除此之外,可以发现,一些数据存在缺失的情况。

获取数据

​ 首先,我们需要获取数据:

# 导入模块
import  numpy as np
import pandas as pd
import sklearn
from sklearn.tree import DecisionTreeClassifier

# 加载数据
data = pd.read_csv('./data/train.csv')
print(data.head())
print(data.shape)

​ 打印结果如下:

   PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
0            1         0       3  ...   7.2500   NaN         S
1            2         1       1  ...  71.2833   C85         C
2            3         1       3  ...   7.9250   NaN         S
3            4         1       1  ...  53.1000  C123         S
4            5         0       3  ...   8.0500   NaN         S

[5 rows x 12 columns]
(891, 12)

数据处理

这里,我们只考虑乘客的社会地位、年龄、性别三个因素对于是否活下去的影响。

​ 因此,首先,把这些数据获取到:

# 获取数据
x = data[['Pclass','Age','Sex']]
y = data['Survived']
print(x.head())
print(y.head())

​ 打印结果如下:

   Pclass   Age     Sex
0       3  22.0    male
1       1  38.0  female
2       3  26.0  female
3       1  35.0  female
4       3  35.0    male
0    0
1    1
2    1
3    1
4    0
Name: Survived, dtype: int64

​ 接下来,我们需要对缺失值进行处理,而在这三者中只有age存在缺失值,我们使用平均值进行代替:

# 缺失值处理
x['Age'].fillna(x['Age'].mean(),inplace=True)

​ 最后,由于类别中存在male female是字符型的数据,因此需要将它离散化,这里,我默认male为0,female为1:

# 特征处理 
# 加上转置是将行向量变为列向量,这样可以替换
x['Sex'] = np.array([0 if i == 'male' else 1 for i in x['Sex']]).T
# 打印查看是否替换成功
print(x.head())

​ 打印结果为:

   Pclass   Age  Sex
0       3  22.0    0
1       1  38.0    1
2       3  26.0    1
3       1  35.0    1
4       3  35.0    0

​ 最后,划分数据集:

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)

3. 模型创建、训练和评估:

​ 模型创建和训练:

# 创建模型
model = DecisionTreeClassifier(criterion='entropy',max_depth=12)
model.fit(x_train,y_train)

​ 评估,采取准确率来评估:

# 评估
score = model.score(x_test,y_test)
print('准确率:',score)

​ 打印结果为:

准确率: 0.770949720670391

​ 可以看到,这个结果其实非常差劲。我尝试修改了深度,但是结果并没有好转,仍然在75左右徘徊,当然这也可能是因为我数据没有处理好的原因:

# 深度和准确率
# 3 准确率: 0.7653631284916201
# 4 准确率: 0.7653631284916201
# 5 准确率: 0.7430167597765364
# 6 准确率: 0.7486033519553073
# 8 准确率: 0.7541899441340782
# 12 准确率: 0.770949720670391

4. 可视化:

​ 下面,将决策树可视化,决策树可视化的方法很多,这里介绍最简单的一种方法:

from sklearn import tree
tree.plot_tree(model,feature_names,class_names)
'''
参数:
	model : 决策树模型
	feature_names : 特征名字列表
	class_names : 标签类别列表
'''
# 最后需要使用matplotlib来显示
matplotlib.pyplot.show()

​ 我们将上面的进行可视化,不过深度改为3,因为这样出来的图片清晰一些:

plt.figure(figsize=(20,20))
feature_name = ['pclass','age','sex']
class_name = ['survived','death']
tree.plot_tree(model,feature_names=feature_name,class_names=class_name)
plt.savefig('./data/tree.png')

​ 结果如下图:

在这里插入图片描述

5. 总结和完整代码:

​ 上面的代码我并不是很满意,感觉存在一定的问题,另外准确率太低也是问题之一。这里暂且不谈,以后有机会或者大家发现了,会来及时纠正。

​ 完整代码:

# author: baiCai
# 导入模块
import  numpy as np
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import export_graphviz
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('./data/train.csv')
# print(data.head())
# print(data.shape) # (891, 12)
# 获取数据
x = data[['Pclass','Age','Sex']]
y = data['Survived']
# print(x.head())
# print(y.head())
# 缺失值处理
x['Age'].fillna(x['Age'].mean(),inplace=True)
# 特征处理
x['Sex'] = np.array([0 if i == 'male' else 1 for i in x['Sex']]).T
# 打印查看是否替换成功
# print(x.head())
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,random_state=22)


# 创建模型
model = DecisionTreeClassifier(criterion='entropy',max_depth=3)
# 3 准确率: 0.7653631284916201
# 4 准确率: 0.7653631284916201
# 5 准确率: 0.7430167597765364
# 6 准确率: 0.7486033519553073
# 8 准确率: 0.7541899441340782
# 12 准确率: 0.770949720670391
model.fit(x_train,y_train)
# 评估
score = model.score(x_test,y_test)
pred = model.predict(x_test)
print('准确率:',score)
print('预测值:',pred)
# 可视化方法一:
# export_graphviz(model, out_file="./data/tree.dot", feature_names=['pclass','age','sex'])
# 更简单的方法:
plt.figure(figsize=(20,20))
feature_name = ['pclass','age','sex']
class_name = ['survived','death']
tree.plot_tree(model,feature_names=feature_name,class_names=class_name)
plt.savefig('./data/tree.png')
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值