泰坦尼克号案例分析:决策树分类

举报
深蓝的回音 发表于 2021/04/23 16:58:13 2021/04/23
【摘要】 前言萌新入坑机器学习,想在kaggle上找些项目来练练手,正好泰坦尼克号好像非常适合入坑,就屁颠屁颠地跑去做了,没想到做一轮下来发现自己好像学了个寂寞,然后就只能疯狂抄代码了…菜鸟就是菜鸟,没办法,加油吧。 一、数据集下载废话略过,kaggle泰坦尼克号直接在网站上下载,然后会得到三个文件:第一个是提交示例,第二个是测试集,第三个是训练集。 二、数据集建模 1.引入库import nump...

前言

萌新入坑机器学习,想在kaggle上找些项目来练练手,正好泰坦尼克号好像非常适合入坑,就屁颠屁颠地跑去做了,没想到做一轮下来发现自己好像学了个寂寞,然后就只能疯狂抄代码了…菜鸟就是菜鸟,没办法,加油吧。


一、数据集下载

废话略过,kaggle泰坦尼克号
直接在网站上下载,然后会得到三个文件:在这里插入图片描述
第一个是提交示例,第二个是测试集,第三个是训练集。

二、数据集建模

1.引入库

import numpy as np
import pandas as pd 
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer

2.读入数据

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

然后看一下这两个文件长啥样。忘记说了,最好使用jupyter notebook,数据处理还是非常方便的。
在这里插入图片描述
在这里插入图片描述
可以发现test里面没有survived的属性,这是需要用训练集训练处模型来预测存活情况的。
最后来看看标准提交。

g_sub = pd.read_csv('gender_submission.csv')
g_sub

在这里插入图片描述
就两行,一行是与测试集一样的PassengerId,另一行就是缺失的Survived存活情况了。
各个特征描述如下:
PassengerId => 乘客ID
Pclass => 客舱等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 兄弟姐妹数/配偶数
Parch => 父母数/子女数
Ticket => 船票编号
Fare => 船票价格
Cabin => 客舱号
Embarked => 登船港口

3.特征工程

令人头疼的特征工程开始了…
首先把训练集和测试集合并,以便统一进行特征处理。

union = train.append(test, ignore_index=True)
union.info()

在这里插入图片描述

(Survived暂时不管)发现Age, Cabin, Fare, Embarked有缺失值。对于Age和Fare,分别使用中位数和平均数进行填充,对于Cabin,缺失值太多,因此我是直接舍弃,对于Embarked就用出现最多的字母填充,还有Name, Ticket,太杂乱所以舍弃了。

union['Age'].fillna(union['Age'].median(), inplace=True)
union['Fare'].fillna(union['Fare'].mean(), inplace=True)
union = union.drop(['Name', 'Cabin'], axis=1)
union['Embarked'].value_counts()

在这里插入图片描述

union['Embarked'].fillna('S', inplace=True)
union.info()

在这里插入图片描述

4.数据变换

(字典特征提取真是个麻烦精)

先把合并的数据集重新拆开

train = union.loc[0:890]
test = union.loc[891:]

之后把x,y分开

x_train = train.drop(['Survived','Ticket'], axis=1)
x_test = test.drop(['Survived','Ticket'], axis=1)
y_train = train['Survived']
y_test = test['Survived']

然后用字典特征提取,把字典向量化,变成array矩阵。(注:pandas中的to_dict()方法,orient设置为records会将每一个样本都转换为一个字典,字典中的键是属性名,值是属性值)变为数值矩阵之后就可以放进分类器中了。

dict = DictVectorizer(sparse=False)
X_train = dict.fit_transform(x_train.to_dict(orient='record'))
X_test = dict.transform(x_test.to_dict(orient='record'))
dict.get_feature_names()
X_train

在这里插入图片描述

5.建模

这反而是最简单的一步,调参侠请求出战。当然这里还是简单介绍一下决策树分类器的基本原理。其实很简单,就是一堆数据从上往下,按照各自的特征进入不同的分支,在这个过程中机器会学习到从上到下分别应该选择哪一种特征来分类,最后生成的树就是已经训练好的树,此时树的每个分支应该用哪一个特征已经确定,就可以用来分类了。那么到底该如何选择特征呢?一般就是通过分支前后纯度的提升来确定。最先分支的应该是对数据纯度提升最大的特征。同时为了防止过拟合,可以设置树的最大深度。

from sklearn.tree import DecisionTreeClassifier
dec = DecisionTreeClassifier(max_depth=5)
dec.fit(X_train, y_train)

建模完成,数据也喂进去了,接下来就可以开始预测了

y_predict = dec.predict(X_test)

模型评估还不会…所以没做…不管了,直接上它,保存,提交!

id = test['PassengerId']
sub = {'PassengerId': id, 'Survived': y_predict}
submission = pd.DataFrame(sub)
submission.to_csv("sub.csv", index=False)

于是,成品sub.csv就出现在文件夹当中了,非常兴奋地查看一下,很好,非常完美,与样例的格式一样。上传,提交,爆0,一气呵成。
嗯??有什么不对劲??怎么爆0了??
经过多番查证后,发现样例的Survived一列是np.int64类型,而我的是np.float32类型…WTF这也行…
那就把之前的那行代码改一下,加一个数据类型变换

y_predict = dec.predict(X_test).astype(np.int64)

再执行一遍,这下提交终于有成绩了,ohhhhhhhh!!虽然基本垫底…算了,能有成绩已经很满意了。
在这里插入图片描述
最后附上完整代码:

import numpy as np
import pandas as pd 
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
g_sub = pd.read_csv('gender_submission.csv')
union = train.append(test, ignore_index=True)
union.info()	#查看
union['Age'].fillna(union['Age'].median(), inplace=True)
union['Fare'].fillna(union['Fare'].mean(), inplace=True)
union = union.drop(['Name', 'Cabin'], axis=1)
union['Embarked'].value_counts()	#查看
union['Embarked'].fillna('S', inplace=True)
union.info()	#查看
train = union.loc[0:890]
test = union.loc[891:]
x_train = train.drop(['Survived','Ticket'], axis=1)
x_test = test.drop(['Survived','Ticket'], axis=1)
y_train = train['Survived']
y_test = test['Survived']
dict = DictVectorizer(sparse=False)
X_train = dict.fit_transform(x_train.to_dict(orient='record'))
X_test = dict.transform(x_test.to_dict(orient='record'))
from sklearn.tree import DecisionTreeClassifier
dec = DecisionTreeClassifier(max_depth=5)
dec.fit(X_train, y_train)
y_predict = dec.predict(X_test).astype(np.int64)
id = test['PassengerId']
sub = {'PassengerId': id, 'Survived': y_predict}
submission = pd.DataFrame(sub)
submission.to_csv("sub.csv", index=False)

总结

虽然是一个很简单的案例,但是我在途中碰到的麻烦一个接一个,想要完整做出一个案例还是非常困难的,理论固然重要,把理论转化为实践的能力也是不可或缺的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。