本博客所有内容均整理自《Hands-On Machine Learning with Scikit-Learn & TensorFlow》一书及其GitHub源码。
看《Hands-On》一书至第三章,习题里面后两题是实际操作的编程题,自己初步动手效果不错,特此记录一下。
运行环境:Jupyter Notebook 语言:Python3.6.4
0、题目描述
Kaggle的Titanic Challenges经典题源自那次震惊世界的沉船事故,要求你根据一些特征,如Titanic的乘客的年龄,性别,客舱等级,在哪上船等等,来预测某一名乘客最终是否从这次劫难中生还。我是听说根据数据显示,那次沉船事故毕竟是发生在所谓永不沉没的Titanic号上,所以死亡人数并不算多,但大部分死亡人士都是低等级客舱的穷人,而生还的大部分都是高级客舱的富人!所以,接下来让我们一步步来利用机器学习的方法来进行一下数据分析和预测吧!
具体有哪些特征我们需要后续下载了数据集之后自己观察,总之最终的目标就是去预测某一ID的乘客是否在这次沉船事故中生还,将预测的生还情况上传到Kaggle官网就可以得到你的训练得分。
在这里把预测数据生成csv以及上传数据就省略了,主要是详细解析和描述一下数据预处理,模型训练和交叉验证这三个机器学习过程,总体目标是获得80%以上的准确率。(先定一个小目标)
1、数据预处理
首先,我们从Kaggle官网下载train.csv和test.csv,这两个表格分别代表训练集和测试集,将其放在你的工程目录下的合适位置,便于读取;在这里,我是在工程目录下建了一个文件夹名为“datasets”,然后在“datasets”文件夹里再建了一个文件夹名为“titanic”,然后把train.csv和test.csv都放在“titanic”文件夹内。
第一步,当然是读取这两个数据集,读取的方式是采用pandas的read_csv()函数,该函数接受一个文件路径,读取该文件。
import os
TITANIC_PATH = os.path.join("datasets", "titanic")
import pandas as pd
def load_titanic_data(filename, titanic_path=TITANIC_PATH):
csv_path = os.path.join(titanic_path, filename)
return pd.read_csv(csv_path)
train_data = load_titanic_data("train.csv")
test_data = load_titanic_data("test.csv")
这里import os是用来获取文件路径的。函数load_titanic_data是用来专门读取数据的,避免使用绝对路径。
其实上面的代码效果类似于:
train_data = read_csv(".../train.csv")
test_data = read_csv(".../test.csv")
其中...代表你的文件路径。
读入数据之后,一般来说可以先看一下各个数据的基本情况,使用head()函数来显示前五个数据。
train_data.head()
test_data.head()
效果如下图所示:
从显示情况来看,训练数据有乘客ID,生还情况(1代表生还,0代表未生还),客舱等级,姓名,性别,年龄,SibSp,Parch,票号,票价,客舱号,上船点,一共12个特征。而训练集则是没有生还情况,只有其他11个特征。
其中,有两个特征我都是直接用的英文,因为英语六级的我并不理解这是个什么意思,其实这种情况很普遍,很多时候我们获取的数据根本就是乱的,很少像上面这样是别人帮你一一校对好的,而且事实证明就算是校对好的数据集,也很可能有特征你根本理解不了。遇到这种情况不要担心,我们可以上网去搜一下,或者索性就让它是英文,管它代表什么呢,拿着训练就是了,说不定机器学习模型会告诉我们这是个什么呢!
其实SibSp和Parch这两个特征读不懂真不怨我英语水平不行,根据搜索,其实这两个特征词是简写拼凑单词,SibSp代表siblings&spouses,即兄弟姐妹和配偶,即该乘客有多少兄弟姐妹和配偶在船上(可能像Rose就会被统计成有两个配偶在船上吧),Parch则代表children&parents,即小孩和父母,即该乘客有多少子女和父母在船上。其实想想也有道理,如果一个人的亲属在船上,该人可能会有更大的欲望去求生。
OK,接下来我们着重关注训练集,因为这种情况下,训练集和测试集已经分好了,我们在训练模型时应单独使用训练集,而把测试集放到一边