赞
踩
为什么写本博客
前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。
需要的基础
懂不懂原理不重要,本系列的目标是使用python实现机器学习。
必须会的东西:python基础、numpy、pandas、matplotlib和库的使用技巧。
说明
完整的代码在最后,另外之前案例中出现过的方法不会再讲解。
感觉本次代码存在问题,但是自己没有发觉,有所错误,望理解。
目录结构
模型创建
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表示是否直接替换原始数据,否则返回新数据
数据集下载
泰坦尼克号数据集来源于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)
模型创建和训练:
# 创建模型
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
下面,将决策树可视化,决策树可视化的方法很多,这里介绍最简单的一种方法:
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')
结果如下图:
上面的代码我并不是很满意,感觉存在一定的问题,另外准确率太低也是问题之一。这里暂且不谈,以后有机会或者大家发现了,会来及时纠正。
完整代码:
# 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')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。