入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster

kaggle创始人为Anthony毕业于墨尔本大学,于2010年在创立kaggle, 现在被google收购, 现在有100多万活跃用户。

  1. 学习kaggle平台如何参加比赛, 如何提交项目
  2. 练习Titanic - Machine Learning from Disaster

泰坦尼克号项目主要是通过一个train.csv文件提供的基础数据,预测test.csv文件中测试数据集的准确性, 然后把预测结果保存到gender_submission.csv提交。

import pandas as pd
train_data = pd.read_csv('titanic/train.csv')

pandas是数据科学库, 和numpy处理矩阵类似, 主要用于处理表格, 相当于一个可编程的excel, 方便处理数据.

按照惯例缩写为pd
所以一般语法:

import pandas as pd # 引入pandas库, 由pd代替

读取文件:一般pandas读取的文件为csv, 也有excel和text文件, 语法一样。

train_data = pd.read_csv('titanic/train.csv') # titanic是上级文件夹

train_data变量名用于保存读取的文件内存

type(train_data)
pandas.core.frame.DataFrame

DataFrame是pandas的数据保存方式, 就是一个数据表格

一下语法可以制作表格:

pd.DataFrame({'Yes': [1, 2], 'No': [3, 4]})

入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster
可见, pandas可以制作漂亮的表格, DataFrame为制表方法, 字典中的key为column, 代表列的项目名, value用list表示, 代表每一列的具体内容, DataFrame自动加索引。

train_data.head() # 默认读取前五行。

入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster

1 解题的第一步是读懂表格:

第一列为索引号, 第二列为乘客ID,然后是否生还,根据表格1 代表活着, 0代表死亡, 应为一等舱的旅客大部分生还,另外kaggle文件有说明, 可见Pclass是一个影响很大的feature, 姓名应该影响不大, 但根据我们对泰坦尼克号的了解, 性别和年龄应该影响很大,应该是妇女和儿童优先登上救生艇,下一列是有没有兄弟姐妹或配偶也在船上,另一列是有没有父母小孩, 这些项目也是其中的影响因素。然后再看船票和票价, 可见头等舱几乎是三等的10倍, 应该影响很大。然后舱位和上船地点, 舱位也影响很大, 因为三等的没有, 应该在船的底层, 从电影中我们可以看到, 至于上船地点, 应该影响不大, 那个地方都有穷人和富人。

2 test.csv

import pandas as pd
test_data = pd.read_csv('titanic/test.csv')
test_data.head()

入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster
可见test.csv几乎和train.csv一样, 但少了一项survived, 这项需要我们预测。

3 gender_submission.csv

入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster
可见, 从892号开始测试, 通过的前面891个数据的feature, 预测后面的数据, 通过提交的submission检验模型的准确性。

4 模型的选择

通过对kaggle的基础内容学习, 可以选择决策树模型, 但Random Forest 应该准确性更高, 至于features的选择, 可以先全部选择, 然后尝试是否有必要删除一些featueres来提高精确性。

5 数据清洗

由于表格中的性别影响很大, 应该需要用到, 需要做数据处理。

6 题目要求

The competition is simple: we want you to use the Titanic passenger data (name, age, price of ticket, etc) to try to predict who will survive and who will die.

7 代码IDE

由于本题要求数据量不大, 运算时间不长, 可以用kaggle提供的notebook或者自己的Jupyter notebook, 如果处理计算机视觉和深度学习的一些问题建议使用GPU, 如果没有, 可以用Kaggle免费提供的加快计算时间。

8 关于submission file 原始数据:

原始数据假设所有male挂了, 所有的female活着, 我们需要检验是否正确。

9 计算男女的存活率:

需要学习过pandas或SQL, 这样更容易理解下面的语法:

women = train_data.loc[train_data.Sex == 'female']["Survived"]
rate_women = sum(women)/len(women)
print("% of women who survived:", rate_women)

% of women who survived: 0.7420382165605095

men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men) / len(men)
print("% of men who survived:", rate_men)

% of men who survived: 0.18890814558058924

语法: women = train_data.loc[train_data.Sex == ‘female’]代表
locate 表中Sex == ‘female’ 的所有项目, 然后再单独取[“Survived”]这一列。
sum()和len()是pandas的方法。

可见男女的存活比例差距很大, 但男人还是有一定的存活比例, 不然都挂了, 人类就该灭绝了。

但是这一数据是相当重要的, 即使我们什么都不做,直接预测所有女人存活, 我们就有了75%的正确率了。

如果我们还用用到其他参数, 比如船票, 舱位,是有有子女父母等,那就需要很大的运算量。

但是是否还有更好的模型可以利用。

10 ML 模型

在机器学习中sklearn, sci-kit-learn中有很多可以直接运用的模型, 这样大量减少了我们的编码与运算时间。

对于同一问题,多种模型都可解决, 不同的模型对于运算结果有很大的影响, 模型中参数的选择对于预测结果也有很大的影响, 而且每个人都有不同的偏好。通过对模型的不断理解可以针对不同问题, 选择合适的模型。

该问题, 我们用到random forest model。
入坑kaggle第二天- 详细分析Titanic - Machine Learning from Disaster
如果只用一颗树, 也就是决策树做模型, 可能会遇到很多问题, 如果树太深, 会造成overfitting, 如果叶子节点太少, 则会underfitting, 为了避免这样的问题, 我们可以用多颗决策树, 也就是random forest model, 通过多棵树(例如100), 然后取平均值, 一般会得到很好的结果。好比参加知识竞赛, 自己不会时, 求助现场观众, 如果多数选A, 那么就选A, 一般会得到正确的答案。至于数学证明, 暂时不会, 应该就是这样理解。

11 使用pandas注意事项

和使用SQL一样, 使用前需要保存原始数据, 不然数据经过修改, 无法恢复。

12 sklearn模型学习方法

建议边学machine learning, 边学sklearn, 如果不理解机器学习, 很难理解sklearn.

13 本题模型

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
from sklearn.ensemble import RandomForestClassifier
# label
y = train_data["Survived"]
# features choose 4
features = ["Pclass", "Sex", "SibSp", "Parch"]
# data clean
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])
# choose 100 tree, depth = 5, random_state = 1
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
# trian the model
model.fit(X, y)
# prodict the model
predictions = model.predict(X_test)
# output the file
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")

Your submission was successfully saved!

our First Entry
Welcome to the leaderboard!
Your score represents your submission’s accuracy. For example, a score of 0.7 in this competition indicates you predicted Titanic survival correctly for 70% of people.

What next? You’ve got a few options:

上一篇:推荐系统构建


下一篇:Ubuntu KVM安装过程