前言
- 本文为练手记录,适用于刚入门的朋友参照阅读练习,大神请绕道,谢谢!
- 阅读大约需要10分钟。
一、理解项目概况并提出问题
1.1 登陆官网查看项目概况
Titanic: Machine Learning from Disasterwww.kaggle.com变量解释:
![722f80142339c40c73a7b5e81b16cbc0.png](https://img-blog.csdnimg.cn/img_convert/722f80142339c40c73a7b5e81b16cbc0.png)
![1e62289812e484d75bc10560287ad663.png](https://img-blog.csdnimg.cn/img_convert/1e62289812e484d75bc10560287ad663.png)
下载三个数据集,测试数据,训练数据和预测数据。
1.2 整体思路
![013fbe50c0a369379c50031f677f3b74.png](https://img-blog.csdnimg.cn/img_convert/013fbe50c0a369379c50031f677f3b74.png)
1.3 提出问题
1)有没有可能一些特定的人群如妇女儿童会比大多数人更容易存货?
2)不同等第仓存货概率是不是不同?
3)生存概率和年龄有关系吗?
4)生存概率会不会收到家庭成员多少的影响?
二、数据理解、准备
2.1 数据查看、合并
![9c0b29081613b0c98421dd4001ae311a.png](https://img-blog.csdnimg.cn/img_convert/9c0b29081613b0c98421dd4001ae311a.png)
首先我们通过pandas的read_.csv函数来导入两个csv然后用shape函数看看行列。
![ebd4ee787d1cbce807d1b3465c26a534.png](https://img-blog.csdnimg.cn/img_convert/ebd4ee787d1cbce807d1b3465c26a534.png)
通过train.append()来合并数据集。
合并的原因是因为训练数据特征要和测试数据特征一致。
我们发现测试数据集比训练数据集少一行是因为少了survive,这个参数是最后需要和预测数据集比对查看正确率的,所以会缺失。合并时忽略在appen参数加上ignore_index=True用NaN填充。
![012081468fb7582cf3c41611ad7147da.png](https://img-blog.csdnimg.cn/img_convert/012081468fb7582cf3c41611ad7147da.png)
合并成功
![83e9cea669acd558f7f4d44b42a6dad3.png](https://img-blog.csdnimg.cn/img_convert/83e9cea669acd558f7f4d44b42a6dad3.png)
我们通过describe()来查看数据类型的描述统计信息
![f0135fca0f0351e50e22a4abd87f34cf.png](https://img-blog.csdnimg.cn/img_convert/f0135fca0f0351e50e22a4abd87f34cf.png)
用info函数查看所有列的行,可以查看缺失情况,为进一步数据清洗做准备。
2.2 通过可视化理解数据
![8cc6201f8b62e81a66ef2214d62fa37e.png](https://img-blog.csdnimg.cn/img_convert/8cc6201f8b62e81a66ef2214d62fa37e.png)
我们对所有人的年龄进行可视化,发现年龄差距比较大。
![fb5527e7e81eb64c970773c17894c597.png](https://img-blog.csdnimg.cn/img_convert/fb5527e7e81eb64c970773c17894c597.png)
我们对相关系数进行可视化,可以明显的看出一些参数的正相关和负相关性大小,方便我们选取变量。
![829548de5183d2805c71bbafdc5c9a82.png](https://img-blog.csdnimg.cn/img_convert/829548de5183d2805c71bbafdc5c9a82.png)
我们也可以通过散点图发现年龄和生存率关系不是很大,和上图相关系数所呈现的信息保持一致。
三、数据清洗,准备
3.1 处理float64缺失值:Age,Fare
对于数值型数据我们直接用平均值填充
![e9703877a436bb4b163a21d316bc652b.png](https://img-blog.csdnimg.cn/img_convert/e9703877a436bb4b163a21d316bc652b.png)
full['Age']=full['Age'].fillna(full['Age'.mean()])
full['Fare']=full['Fare'].fillna(full['Fare'.mean()])
3.2 处理object缺失:Cabin,Embarked
![b2c2ff5e9d8a3b2b0ed245b797c4eb9c.png](https://img-blog.csdnimg.cn/img_convert/b2c2ff5e9d8a3b2b0ed245b797c4eb9c.png)
用value_counts()函数来查看每个属性总和发现S最多,我们就用S填充
![4840830835915512eaeaf91abe13c3c3.png](https://img-blog.csdnimg.cn/img_convert/4840830835915512eaeaf91abe13c3c3.png)
![13d443091fd7a99cb2cb6785fc9736e8.png](https://img-blog.csdnimg.cn/img_convert/13d443091fd7a99cb2cb6785fc9736e8.png)
发现还存在控制,我们用U来表示未知。
![69f10ffab787616836f7a1d412ec1a52.png](https://img-blog.csdnimg.cn/img_convert/69f10ffab787616836f7a1d412ec1a52.png)
用http://full.info()查看发现所有数据已经填充完毕
四、特征工程
数据分析当中核心就是提取数据特征,因为数据特征代表了和数据结果的联系。
4.1 对各个变量进行分类
![0f609a17b87501c908278ec8486a00e1.png](https://img-blog.csdnimg.cn/img_convert/0f609a17b87501c908278ec8486a00e1.png)
而具体提取数据特征的步骤大致为:
![0e9e09b0be04a06fa3ab7ea5d9019633.png](https://img-blog.csdnimg.cn/img_convert/0e9e09b0be04a06fa3ab7ea5d9019633.png)
4.2 分类数据特征提取
分类数据主要有Sex,Cabin,Embarked,Pclass,Parch,SibSp,下面逐个清理。
1、性别
![1b7865b01113997ccf530d5858b8f038.png](https://img-blog.csdnimg.cn/img_convert/1b7865b01113997ccf530d5858b8f038.png)
我们发现这里的性别是用male和female,我们要将其转换成0,1.
首先定义映射的字典,
sex_mapDic={'male':1,
'female':0}
通过map函数让每个数据进行自定义函数计算
full['Sex']=full['Sex'].map(sex_mapDict)
2、登陆港口Embarked
![b61046307d276e44ee0aa3bc2f2ce4c7.png](https://img-blog.csdnimg.cn/img_convert/b61046307d276e44ee0aa3bc2f2ce4c7.png)
我们首先用创建DataFrame()二维数据表,之后用get_dummies(full['Embarked',prefix='Embarked'])来进行one-hot编码存入二维表中。
(3)船舱等级Pclass
![300aaad7ebd95ce1e80b7cade9c20718.png](https://img-blog.csdnimg.cn/img_convert/300aaad7ebd95ce1e80b7cade9c20718.png)
客舱等级也是一样的步骤。
(4)船舱号Cabin
![18dbbc1738d68684b4b85ee7e41eb5a0.png](https://img-blog.csdnimg.cn/img_convert/18dbbc1738d68684b4b85ee7e41eb5a0.png)
这里有一个知识点是lambda函数
![0efd229a490e24a49b13f562d1aadd49.png](https://img-blog.csdnimg.cn/img_convert/0efd229a490e24a49b13f562d1aadd49.png)
直接定义:landba c:c[0]
代表输入c输出c[0] 非常简单粗暴
(5)Parch,SibSp数据
接下来处理Parch,SibSp数据,先理解下这两个数据是什么意思。
SibSp:表示船上兄弟姐妹数和配偶数量,理解为同代直系亲属数量,
Parch:表示船上父母数和子女数,理解为不同代直系亲属数量。
所以FamilySize等于=本人+sibsp+parch
![9de2aa8cffc9c07ef623b62857fe8f7f.png](https://img-blog.csdnimg.cn/img_convert/9de2aa8cffc9c07ef623b62857fe8f7f.png)
这里和前面不同的是,前面可以直接1 2 3 等仓用特征提取函数,这里要进行范围划分所以要自己产生列,然后用map函数映射修改。
且这里的lambda函数有所不同用到了一个if判断,写法是if为真结果放前面,为假else结果放后面。
lambda s :1 if s==1 else 0
![e1e2a54ee54b7350da076e2ade8ac97a.png](https://img-blog.csdnimg.cn/img_convert/e1e2a54ee54b7350da076e2ade8ac97a.png)
合并后发现已经有33个特征了
4.3 字符串数据提取特征
![e4b68955cd3fb4fc8f2bf5d18710166d.png](https://img-blog.csdnimg.cn/img_convert/e4b68955cd3fb4fc8f2bf5d18710166d.png)
提取姓名的时候逗号前面是名字,逗号后面句号前面的是称谓所以我们要用split函数提取两次。
![45d1cc91d6fa8663ca9d08bb47f3f800.png](https://img-blog.csdnimg.cn/img_convert/45d1cc91d6fa8663ca9d08bb47f3f800.png)
定义一个函数同样用map映射批量修改。
![ac8947dcfb90fa1be82d16b5ba7e08b3.png](https://img-blog.csdnimg.cn/img_convert/ac8947dcfb90fa1be82d16b5ba7e08b3.png)
发现老外的称谓真的很多
![697c87eb295caf71c3783fc12b301f97.png](https://img-blog.csdnimg.cn/img_convert/697c87eb295caf71c3783fc12b301f97.png)
定义数据字典,转换onehot,重复的工作挺多。
![dd0e3db79089b34420bc7a8c116d3a78.png](https://img-blog.csdnimg.cn/img_convert/dd0e3db79089b34420bc7a8c116d3a78.png)
五、获取特征相关性
5.1 获取corr矩阵
![8b36e557d39721695c0c959ae147ff9f.png](https://img-blog.csdnimg.cn/img_convert/8b36e557d39721695c0c959ae147ff9f.png)
因为我们最终结果要知道是否生存,所以看survived这一列的相关性即可。
![515db4faf4ba72da60aca9236137d07a.png](https://img-blog.csdnimg.cn/img_convert/515db4faf4ba72da60aca9236137d07a.png)
发现方框内几列呈现正负相关性非常的强
![0c694b958172186c1485c6f66f370654.png](https://img-blog.csdnimg.cn/img_convert/0c694b958172186c1485c6f66f370654.png)
于是乎我们组合这几列27个影响因子。
六、准备数据
![82c0017070cb76b1904c30f51d043159.png](https://img-blog.csdnimg.cn/img_convert/82c0017070cb76b1904c30f51d043159.png)
这里要清楚特征是我们提取的影响生存数的因素,标签是生存数。
预测数据集在891行之后要进行区分。
七、模型建立、训练
用sklearn的linear_model的逻辑回归算法建立模型,并开始用拆分好的数据进行训练:
![b3b37becac826f8130e4ba65b6ab240a.png](https://img-blog.csdnimg.cn/img_convert/b3b37becac826f8130e4ba65b6ab240a.png)
可以看到我们把原始数据以28分,分成训练数据和测试数据。
![716703ccd9a86dada6f28077ba8de67e.png](https://img-blog.csdnimg.cn/img_convert/716703ccd9a86dada6f28077ba8de67e.png)
通过model.fit(train_x,train_y)进行训练
八、模型的评估、预测
8.1 模型正确率评估
![46506b3d86a431e4cff00e67b430baa2.png](https://img-blog.csdnimg.cn/img_convert/46506b3d86a431e4cff00e67b430baa2.png)
输入model.score(test_x,test_y) 输入测试特征和标签进行评估分数
8.2 用模型进行预测,并按要求输出
将前面准备的预测数据特征pre_x,用模型的predict方法预测生存数据pre_y,并整理成整数型int数据
![c56386f2b37fd5d96e293df701101710.png](https://img-blog.csdnimg.cn/img_convert/c56386f2b37fd5d96e293df701101710.png)
8.3 提交
![1d3469100413a5a21f1e3c666dd9ca9a.png](https://img-blog.csdnimg.cn/img_convert/1d3469100413a5a21f1e3c666dd9ca9a.png)
提交后我们就会看到我们的排名和成绩
![7333a0fc41577bac51fb15b50cdf49a0.png](https://img-blog.csdnimg.cn/img_convert/7333a0fc41577bac51fb15b50cdf49a0.png)