机器学习步骤:提出问题——理解数据——数据清洗——构建模型——模型评估——方案实施

1. 提出问题

本文通过使用Kaggle网站上的泰坦尼克生存数据信息,在Python中利用机器学习算法,来预测泰坦尼克号中不同乘客的存活率。

2. 理解数据

数据来源:Kaggle上面的泰坦尼克号项目

Titanic: Machine Learning from Disasterwww.kaggle.com


查看训练数据集和测试数据集分别有多少条数据和多少个变量,然后将训练数据集和测试数据集进行合并,方便同时对两个数据集进行清洗


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据


查看数据前5行:


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_02


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_03


查看描述统计信息


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_04


使用desribe方法查看描述统计信息的缺点是只能查看到数值型数据的描述统计信息,对于其他类型的数据不显示,如字符串类型(姓名、客舱号等列的指标信息)

使用数据框的Info方法可以查看每一列的数据类型和数据总数


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_05


根据分析结果可以看到哪些字段存在缺失数据的情况,为下一步的数据清洗指明方向

2.1 通过可视化理解数据

对生存整体情况进行分析,即本次沉船事件中,有多少人生存下来


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_06


可以看到泰坦尼克上有超过60%的人遇难,选择使用饼图将其进行可视化


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_07


将生存情况按性别分布进行可视化,首先按生存情况和性别分组


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_08


然后将数据转换成DataFrame


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_09


计算遇难率和存活率,从结果看到女性81人遇难,占比约26%,男性468人遇难,占比约81%


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_10


将不同性别存活分布情况进行可视化


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_11


对所有家庭的家庭大小进行可视化,可以发现家庭大小主要集中在3人及以下的小家庭以及单身人士


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_12


对所有人的年龄进行可视化,可以发现年龄间的差异是比较大的


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_13


通过使用散点图对年龄和生存情况之间的关系进行可视化,可以发现年龄和生存率相关性较弱


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_14


3. 数据清洗

a. 数据预处理

选择子集——列名重命名——缺失数据处理——数据类型转换——数据排序——异常值处理

经过前面理解数据,只需要对缺失数据和异常值数据进行处理即可

1)缺失数据处理

数据类型缺失值处理:

使用fillna方法填充缺失数据,此案例中使用平均值来填充缺失数据


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_15


2)字符串类型缺失值处理

将缺失值填充为最频繁出现的值:


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_16


船舱号字段中缺失数据比较多,因此将船舱号(Cabin)缺失值填充为U,表示未知(Unknown)


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_17


b. 特征工程


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_18


a. 特征提取


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_19


onehot编码:如果原始数据中有N种类别,那就将这一个特征扩展为N种特征

1)分类数据特征提取:性别

使用map函数对一维数组Series每个数据应用自定义的函数计算


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_20


2)分类数据特征提取:登录港口

使用get_dummies进行one-hot编码


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_21


3)分类数据特征提取:客舱等级

使用get_dummies进行one-hot编码


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_22


4)分类数据特征提取:姓名


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_23


再使用map函数对Series每个数据应用自定义的函数计算,此处即为用map函数使这一列的值都使用getTitle函数得到对应姓名的头衔


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_24


5)分类数据特征提取:客舱号

客舱号的首字母即为客舱的类别


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_25


使用get_dummies进行one-hot编码,列名前缀是Cabin。在过程中使用匿名函数语法简化函数。匿名函数语法为lambda参数1,参数2:函数体。在下面代码中,使用匿名函数lambda作获取到船舱号的首字母作为类别,然后用map函数使这一列的值都使用这个函数得到对应船舱号的首字母


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_26


6)分类数据特征提取:家庭类别

第一步得到每个乘客自己的家庭人数是多少

乘客的家庭人数=同代直系亲属数(Parch)+不同代直系亲属数(SibSp)+乘客自己


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_27


第二步使用匿名函数的条件判断建立家庭类别


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_28


b. 特征选择

选择哪些特征对预测生存情况有影响,可以提高模型的正确率,本次案例使用相关系数来筛选特征

第一步:使用数据框的corr方法得到相关系数矩阵,得到的是一个数据框


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_29


第二步:将相关系数矩阵中的生存情况这一列提取出来,并对这一列进行降序排列


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_30


将相关系数进行可视化,可以直观地看到各个特征与生存情况(Survived)是呈正相关还是负相关关系,以及各相关系数的大小。


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_31


根据各个特征与生存情况(Survived)的相关系数大小,选择了这几个特征作为模型的输入:

头衔(titleDf)、客舱等级(pclassDf)、家庭大小(familyDf)、船票价格(Fare)、船舱号(cabinDf)、登船港口(embarkedDf)、性别(Sex)


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_32


4. 构建模型

由于坦尼克号测试数据集是最后要提交给Kaggle的,里面没有生存情况的值,所以不能用于评估模型。因此:

  • 将Kaggle泰坦尼克号项目给的测试数据,叫做预测数据集(记为pred),也就是使用机器学习模型生成结果来对其生存情况进行预测。
  • 使用Kaggle泰坦尼克号项目给的训练数据集,做为原始数据集(记为source),从这个原始数据集中拆分出训练数据集(记为train:用于模型训练)和测试数据集(记为test:用于模型评估)。


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_33


泰坦尼克号预测生存率是一个二分分类问题,通过乘客的特征来预测乘客是生存还是死亡。在本次案例中,使用Python机器学习包sklearn的逻辑回归算法

建立模型用的训练数据集和测试数据集


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据_34


训练模型构建:

1)导入算法

2)创建模型:逻辑回归(logistic regression)

3)训练模型


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_python onehot编码_35


5. 模型评估

测试数据查看模型准确率


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_测试数据_36


模型准确率为82%,准确率尚可。

6. 方案实施


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_机器学习 泰坦尼克号数据_37


要上传至Kaggle,还需要将预测结果转换成csv文件


机器学习 泰坦尼克号数据 泰坦尼克号python数据预处理_数据集_38


将预测结果上传到Kaggle即可看到分数和排名。