First Look of Titanic Problem on Kaggle

Preface

用了两天的一些空闲时间,看完并自己跟着敲完了上边的代码自己亲自试了试。整体地走了一个用机器学习解决问题的流程,总得来说也是有一个较为清楚的认识吧,现就一些想法与笔记记录下来。

Titanic问题解决过程

按照样例中的做法,结合自己的看法,重要的几步有:获取数据,分析数据,处理数据(对null值的处理,删除无关紧要的数据,从已有的数据中通过组合与计算等获取新的有意义的特征数据),选用模型进行学习和预测,得到结果

获取数据

主要应用pandas进行操作,其中一个很关键的一点是其中的DataFrame类型的对象,是操作数据的载体,其拥有强大的一些函数,大大方便了对数据的感知,需要之后的进一步了解其特性。

分析数据

分析数据大致分为三类,一个是用一些自带的函数作大致的信息查看;第二是提取一些feature的组合来看;三是用matplotlibseaborn等可视化工具来可视化地查看一些属性。

整体大致查看

用到的一些常用的函数有:

1
2
3
4
5
data_df.head() # get first 5 element
data_df.info()
data_df.describe()
data_df.shape()
data_df.colums.values

提取feature查看

用一些组合与排序的方式达到目的,如:

1
train_df[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Sex')
Sex Survived
0 female 0.742038
1 male 0.188908

可视化查看

这一方面,matplotlibseaborn的函数众多,自己还需要进一步的了解,需要做到自如地处理数据,在不同的层面上比较。

处理数据

删除无用的数据

drop()删除df中的无用数据:

1
2
train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)
test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)

在已有的基础上获取新数据

进行计算或者组合等:

1
2
for datasets in combine:
datasets['name_length'] = datasets.Name.str.len()

categorical 的数据到 ordinal的转化

应用map将一些类型的数据,转化成数字型的,如:

1
2
3
4
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
for dataset in combine:
dataset['Title'] = dataset['Title'].map(title_mapping)
dataset['Title'] = dataset['Title'].fillna(0)

对null等非法值的处理

因为NaN,null等值会影响学习及预测,所以进行处理,有多种用其它数据替代的方式,也有好多trick,但是相对来说比较简单。

如下,是采用有效值的平均进行替换:

1
test_df['Fare'].fillna(test_df['Fare'].dropna().median(), inplace=True)

对一些数值型的数据进行区间分类

先建立区间:

1
2
train_df['AgeBand'] = pd.cut(train_df['Age'], 5)
train_df[['AgeBand', 'Survived']].groupby(['AgeBand'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)

再将原来的数值替换为区间代号:

1
2
3
4
5
6
for dataset in combine:
dataset.loc[ dataset['Age'] <= 16, 'Age'] = 0
dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1
dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2
dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3
dataset.loc[ dataset['Age'] > 64, 'Age'] = 4

运用模型作学习与预测

选择模型进行学习 fit

直接从sklearn中选择所需的模型,然后fit测试数据的X和Y:

1
2
3
4
# SVM
from sklearn.svm import SVC
svc = SVC()
svc.fit(X_train, Y_train)

进行预测 predict

1
Y_pred = svc.predict(X_test)

评估 score

1
accurate_svc = svc.score(X_train, Y_train)

选择最优的模型并计算出结果

Conclusion

作为机器学习,或者Kaggle的入门例子,这个例子看来来还是很明确的,也有几点记在了心中。

  1. 数据的处理太重要了,只要数据处理得好,用模型去训练和去预测不是问题。
  2. 处理数据的时候一定要注意可能会影响结果的非法值,进行相关的预处理
  3. 对于模型的一些实现细节可能不需要了解,但是要对他们是干什么的作一个了解吧,不然就是盲目地去根据问题的分类要试好多模型。

然而,竞赛毕竟是竞赛,有着明确的dataset和明确的目的性,而且很专一地可以用机器学习去解决。而在现实生活中,有两个问题摆在机器学习的要前,一个是没有条理的数据集,二是不是那么明了的一个题目,更加的杂。这给用机器学习解决实际问题增添了一些困难。

不过,练习这些毕竟也是好的!