关于titanic数据集(一)

引言

训练玩手写数据集之后,开始联系泰坦尼克号的数据集的训练,mnist应为是关于图像识别,虽然只有一通道,但是也是需要用到cnn的,而titanic因为是对存活的预测,所以是一个二分类问题一个简单的逻辑回归问题,重要的步骤是在数据的处理上面,这里参考寒小阳的一个博客,然后在此基础之上进行进一步的数据的处理。

特征工程

导入包,读取文件

import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

data_train = pd.read_csv('./titanic/train.csv')

测试数据
之后我们将数据进行筛选,首先,passengerid,肯定是不会作为最后的ferture的,Survived是预测结果y,

Pclass与存活的柱状图:
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df = pd.DataFrame({u'live': Survived_1, u'unlive': Survived_0})
df.plot(kind='bar', stacked=True)
plt.show()

Pclass存活率
很明显了,再第一仓的存活率明线大于第二仓或者第三仓,这个Pclass就需要被选成feature之一,那么问题来了,我们对Pclass的处理是直接使用三类呢(1,2,3),还是分成两类==》因为第一仓的的获救率明显大于第二仓和第三仓,所以我们是不是也可以将第一仓设为第一类,其他设为第二类,,,,我们先按照三类来计算,

Age属性:

我们仔细观察了一下,发现好多Age属性是空的,而很显然age属性对最后的生存结果应该是有很大影响的,所以我们需要补全这个age,,,这个时候就用到了Name属性了(?????能从name看出age?????),那这个时候仔细观察了一下,发现name里面是有些标注一个人的大概特征的 ,比如miss,mr,mrs,然后我们就对这三种人群进行了年龄分布的箱图,这个地方===>name中带有Mr说明是男性,Mr就是所有男性的一个数据(30左右),带MIss说明是未婚女性(20左右),Mrs的说明是已婚女性(35左右), 恩,这个结论很好,符合我们一般的逻辑思维,,,这个时候就更加自信了,

data_train_Mr = data_train.Age[data_train.Name.str.contains('Mr')][data_train.Age.notnull()].as_matrix()
data_train_Miss = data_train.Age[data_train.Name.str.contains('Miss')][data_train.Age.notnull()].as_matrix()
data_train_Mrs = data_train.Age[data_train.Name.str.contains('Mrs')][data_train.Age.notnull()].as_matrix()
plt.subplot(131)
plt.boxplot(data_train_Mr)
plt.xlabel('Mr')
plt.ylabel('Age')
plt.subplot(132)
plt.boxplot(data_train_Miss)
plt.xlabel('Miss')
plt.ylabel('Age')
plt.subplot(133)
plt.boxplot(data_train_Mrs)
plt.xlabel('Mrs')
plt.ylabel('Age')
plt.show()

年龄箱图
再图中我们还可以观察到,已婚女性没有离散数据(可能是应为数据量太少了),而男性的异常点就很多,
这个时候我们并不会直接用三种人群的中位数去填充确实的数据,而是使用了随机森林对已有数据进行训练,然后对确实数据进行预测,也就是用已有数据 预测age,这个地方age就变成了一个输出了(真的烦,训练中的训练),,,那么问题来了,既然是要训练数据,我们就要挑选feature,很显然,name是主要feature,还有呢,,我们会想到SibSp(兄弟的个数),Parch(父母以及子女个数),这两个属性对age应该也有影响,毕竟如果Parch有好几个的话,说明有好几个小孩了,说明年龄应该很大了,我们把这两个数据纳入训练age的feature,
接下来我们看了一下,pclass对年龄的影响,哎呀,发现再第一仓的年龄的人分布再26-50之间,第二仓的人分布再23-37之间,第三仓分布再18-30之间,可见,越高等的仓的人的年龄就越偏大,,恩,可能越老越有钱吧,只能这么解释了,。。那么结论就来了,Pcalss也是作为训练年龄的一个feature,

data_train_Mr = data_train.Age[data_train.Pclass == 1][data_train.Age.notnull()].as_matrix()
data_train_Miss = data_train.Age[data_train.Pclass == 2][data_train.Age.notnull()].as_matrix()
data_train_Mrs = data_train.Age[data_train.Pclass == 3][data_train.Age.notnull()].as_matrix()
plt.subplot(131)
plt.boxplot(data_train_Mr)
plt.xlabel('1')
plt.ylabel('Age')
plt.subplot(132)
plt.boxplot(data_train_Miss)
plt.xlabel('2')
plt.ylabel('Age')
plt.subplot(133)
plt.boxplot(data_train_Mrs)
plt.xlabel('3')
plt.ylabel('Age')
plt.show()

Pcalss年龄分布
所以我们就用这三个特征来训练年龄(这边使用寒小阳大神的随机森林),最后得到

from sklearn.ensemble import RandomForestRegressor

ages_df = data_train[['Name', 'Age', 'SibSp', 'Pclass', 'Parch']]
age_Miss = ages_df[ages_df.Name.str.contains('Miss')]
train_age_Miss = age_Miss[['Age', 'SibSp', 'Pclass', 'Parch']]
train = train_age_Miss[train_age_Miss.Age.notnull()].as_matrix()
test = train_age_Miss[train_age_Miss.Age.isnull()].as_matrix()
X = train[:, 1:]
y = train[:, 0]

rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
result = rfr.predict(test[:, 1:])
train_age_Miss.loc[(train_age_Miss.Age.isnull()), 'Age'] = result
ages_df = data_train[['Name', 'Age', 'SibSp', 'Pclass', 'Parch']]
age_Mr = ages_df[ages_df.Name.str.contains('Mr')]
#train_age_Mr = age_Mr[['Age', 'SibSp', 'Pclass', 'Parch']]
train_age_Mr = age_Mr.iloc[:, 1:]
train = train_age_Mr[train_age_Mr.Age.notnull()].as_matrix()
test = train_age_Mr[train_age_Mr.Age.isnull()].as_matrix()
X = train[:, 1:]
y = train[:, 0]

rfr.fit(X, y)
result = rfr.predict(test[:, 1:])
train_age_Mr.loc[(train_age_Mr.Age.isnull()), 'Age'] = result

年龄
最后得到的年龄是这个样自的,我们发现,其中有几个是小数的,那这就是训练出来的一些个age,这个时候我们看看还有没有空的age

df_ = df[['Name', 'Age']]
df_[df_.Age.isnull()]`

我们发现还有五条数据age是空的,这边数据我就不放了,发现这几个数据都带有,Master,Dr,可以,这其实是研究生博士的意思,我就给这几个数据的age设置成了32,恩,一个研究生博士年龄三十岁左右差不多嘛。。

SibSp,Parch,Ticket,Fare,Embarked

回归正题,我们找到了age之后,然后对之后的特征进行筛选,sibsp parch这两个,我觉得对获救并没有什么影响,(没道理人家救你的时候还问你有几个孩子吗), ticket上面的信息我们暂时先不提取,可能ticket是很有用的,但是我看不懂这个船票,暂时先放在这里,Embarked这个属性再寒小阳博客里面说明了,这个数据很诡异,先暂时不考虑,

处理数据

所以快了,特征工程这一步我们已经完成了,我们筛选出了Pclass,Sex,Age,Cabin这四个属性,然后我们需要对这四个属性的值进行处理,

dum_Pclass = pd.get_dummies(test_['Pclass'], prefix='Pclass')
dum_Sex = pd.get_dummies(test_['Sex'], prefix='Sex')
test_.loc[(test_.Cabin.notnull()), 'Cabin'] = 'Yes'
test_.loc[(test_.Cabin.isnull()), 'Cabin'] = 'No'
dum_Cabin = pd.get_dummies(test_['Cabin'], prefix='Cabin')
test_data_final = pd.concat([test_, dum_Pclass, dum_Sex, dum_Cabin], axis=1)
test_data_final['Age_scaled'] = scaler.fit_transform(test_data_final['Age'], age_scale_param)

处理结果

训练数据

这边是对测试集的处理,对训练集的处理也类似与这个,然后吧前面几个属性去掉,就拿到了最终的特征数据,最后参考寒小阳博客里面模型融合,

from sklearn.ensemble import BaggingRegressor


train_df = df_train.filter(regex='Survived|Age_.*|Cabin_.*|Sex_.*|Pclass_.*')
train_np = train_df.as_matrix()

# y即Survival结果
y = train_np[:, 0]

# X即特征属性值
X = train_np[:, 1:]
# fit到BaggingRegressor之中
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)
bagging_clf = BaggingRegressor(clf, n_estimators=20, max_samples=0.8, max_features=1.0, bootstrap=True, bootstrap_features=False, n_jobs=-1)
bagging_clf.fit(X, y)

predictions = bagging_clf.predict(data_test_x)
result = pd.DataFrame({'PassengerId': test_id['PassengerId'].as_matrix(), 'Survived': predictions.astype(np.int32)})
result.to_csv("./bagging.csv", index=False)

最终成绩
最后结果不是很理想,但是比之前提高了一些,还是可以的,主要是做了bagging所以才提高的,可能我这个特征选取的有问题,,,,

最后

这是第二次发博,事隔半个月,我发现发一次博客还是需要专研很多东西的,特别是自己要写出来放到网上,就要做到没有错误,所以还是加油吧,欢迎大家多指出我文中的一下问题,指导指导。(ง •̀_•́)ง

  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丸子呢

致力于源码分析,期待您的激励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值