【机器学习】 kaggle泰坦尼克号决策树预测


前言

萌新入坑机器学习,想在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存活情况了。

3.特征工程

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

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

在这里插入图片描述

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

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)

总结

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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值