#导入2个Python常用数据分析的库
import numpy as np
import pandas as pd
#将数据源文件读取
#注意Windows环境下,需要用r转义一下,不然读取不进来
train = pd.read_csv(r"C:UsersAdministratorDesktoptrain.csv")
test = pd.read_csv(r"C:UsersAdministratorDesktoptest.csv")
print('训练数据集:',train.shape,'测试数据集:',test.shape)
![75df62ba68bb08474de93928098519aa.png](https://i-blog.csdnimg.cn/blog_migrate/6076b1f3d8cf8d339f2a4ee372af923a.png)
结果:表示训练数据集为891行,12列;测试数据集为418行,11列,测试集少了一列Survived即我们后续需要通过逻辑回归进行预测的。
#初步观察数据情况
#Pclass客舱等级
#SibSp同代直系亲属数
#Parch不同代直系亲属数
#Cabin客舱号
#Embarked登船港口
#Fare船票价格
full.head()
![7399ad42b2f9968a7bee7ab489ed78f3.png](https://i-blog.csdnimg.cn/blog_migrate/3544ea15e4a0421d502660d9da27bc59.png)
结果:用head函数可以默认查看前5行数据,便于我们初步掌握数据概况。
#描述性数据统计
full.describe()
![7d969099c177506f5b920ad7fcd1d9bf.png](https://i-blog.csdnimg.cn/blog_migrate/55aaac803248d2fec23f4d7d702a3c1b.png)
结果:用describe函数可以进行描述性数据统计,即我们常见的均值、标准差、中位数等。
#查看每一列数据类型和数据总数
#Survived、Age、Fare、Cabin、Embarked有缺失
full.info()
![2d6e84c1337e9386da8c32c990f5cd71.png](https://i-blog.csdnimg.cn/blog_migrate/7dbcd69b3575f03ce9915b75112f1533.png)
结果:用info函数可以查看各列的数据个数,便于我们快速定位那些列有缺失值。
#数据预处理,缺失值填充
#数值型数据用均值或中位数填充,如Age
#应用fillna函数,用于填充缺失值
full['Age'] = full['Age'].fillna(full['Age'].mean())
full['Fare'] = full['Fare'].fillna(full['Fare'].mean())
#分类型数据用最常见类别进行填充
#先通过value_counts函数,查询一下该列出现的各类型总数
full['Embarked'].value_counts()
![14fac0ffaf79a4dd8858e97945a1859b.png](https://i-blog.csdnimg.cn/blog_migrate/26e39e3225b113965aae873003771ef6.png)
#看到量最多的是S,因此用它来填充确实项
full['Embarked'] = full['Embarked'].fillna('S')
#因Cabin缺失较多,用新的‘U’来表示(Unknow)
full['Cabin'] = full['Cabin'].fillna('U')
#再次观察一下数据,发现除Survived之外,都已经填充完成
full.info()
![6aa4673a13fbf6021884326f7c012b91.png](https://i-blog.csdnimg.cn/blog_migrate/d48bd217e32cb1b6e0114ab108f47e5b.png)
#Sex为字符型字段,需要转换为数值型数据便于处理
sex_mapDict = {'male':1,'female':0} #建立一个字典
full['Sex'] = full['Sex'].map(sex_mapDict) #运用maple函数对Sex这一列进行重新编码
full.head()
![c529175c787af5beaa8860d534590042.png](https://i-blog.csdnimg.cn/blog_migrate/3711c6fd2b8424fc284c6094e2bce0fe.png)
#使用数据框的get-dummies( )对登船港口进行one-hot编码
embarkeddf = pd.DataFrame() #存放提取后的特征
embarkeddf = pd.get_dummies(full['Embarked'],prefix='Embarked') #使用get_dummies进行one-hot编码,列名前缀是Embarked
embarkeddf.head(10)
![8e76f7436de1ad1e783109e2c9bf1c2e.png](https://i-blog.csdnimg.cn/blog_migrate/145b55220a59e19337f266e45bae8886.png)
结果:get_dummies函数的作用是将该列出现值的类型再重新划分为子列,通过子列里的布尔类型标识它的类型。
full = pd.concat([full,embarkeddf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.head()
![98c9a98a454697e2687ecdfb502db180.png](https://i-blog.csdnimg.cn/blog_migrate/c0c524be24cf55996ae300db0b0bdc60.png)
结果:通过concat函数将新增的列加到原数据表中。
full.drop('Embarked',axis=1,inplace=True) #将原Embarked列删除
full.head()
![49d876af928154c0facf132814eb36af.png](https://i-blog.csdnimg.cn/blog_migrate/38edc9f7ec262fad4cddfe7d7899ce18.png)
#对客舱等级Pclass进行同样的one-hot编码处理
pclassdf = pd.DataFrame() #存放提取后的特征
pclassdf = pd.get_dummies(full['Pclass'],prefix='Pclass') #使用get_dummies进行one-hot编码,列名前缀是Pclass
full = pd.concat([full,pclassdf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.drop('Pclass',axis=1,inplace=True) #将原Pclass列删除
full.head()
![c496f420ebbcc931814b46ad19ad943c.png](https://i-blog.csdnimg.cn/blog_migrate/4a0b1f737ecd3f2969dd09edf8605e7d.png)
#对姓名和头衔做编码处理
#定义一个函数,从姓名中提取头衔
def gettitle(name):
str1=name.split(',')[1]
str2=str1.split('.')[0]
str3=str2.strip() #strip用于移除字符串头尾指定字符(默认为空格)
return str3
titleDf=pd.DataFrame() #存放提取后的特征
titleDf['title']=full['Name'].map(gettitle)
titleDf.head()
结果:
![6e4eb5e63ae4359221991b28332acba1.png](https://i-blog.csdnimg.cn/blog_migrate/e700a9199bd9cfc401817ec97066ebb3.png)
titleDf['title'].value_counts() #查询头衔的类别和数量
结果:
![90cfc45f3b500f1d9abca5b47ed043c2.png](https://i-blog.csdnimg.cn/blog_migrate/140341211420c01b7c8d8447365e373e.png)
#有些头衔并不是常见头衔,而且出现频率比较低
#这样不利于机器学习,可将头衔分为6类Officer,Royalty,Mrs,Miss,Mr,Master六种
title_mapDict={
"Capt":"Officer",
"Col":"Officer",
"Major":"Officer",
"Dr":"Officer",
"Rev":"Officer",
"Jonkheer":"Royalty",
"Don":"Royalty",
"Sir":"Royalty",
"the Countess":"Royalty",
"Dona":"Royalty",
"Mme":"Mrs",
"Mlle":"Miss",
"Ms":"Mrs",
"Mrs":"Mrs",
"Mr":"Mr",
"Miss":"Miss",
"Master":"Master",
"Lady":"Royalty"
}
titleDf['title']=titleDf['title'].map(title_mapDict)
titleDf['title'].value_counts()
结果:
![7210d5b142eaf1d00da912c21e138fbb.png](https://i-blog.csdnimg.cn/blog_migrate/fd930d54cbafeaead75ec33f8e0ca550.png)
titleDf = pd.get_dummies(titleDf['title'])
titleDf.head()
结果:
![6ed31e705e0293ca869e55a11b813a95.png](https://i-blog.csdnimg.cn/blog_migrate/f64a6c991a955fb843cc765ac5cf1555.png)
full = pd.concat([full,titleDf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.head()
结果:
![1f2260e45ca1f545da0727fbdc7b9c0c.png](https://i-blog.csdnimg.cn/blog_migrate/b7d3e975371d947f921f86c14d797ff6.png)
#对船舱号Cabin进行同样的one-hot编码处理
full['Cabin']=full['Cabin'].map(lambda c:c[0]) #取船舱号的首位做标识符
cabindf = pd.DataFrame() #存放提取后的特征
cabindf = pd.get_dummies(full['Cabin'],prefix='Cabin') #使用get_dummies进行one-hot编码,列名前缀是Cabin
full = pd.concat([full,cabindf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.drop('Cabin',axis=1,inplace=True) #将原Cabin列删除
full.head()
结果:
![797b50b29c559a95674e50dad2230516.png](https://i-blog.csdnimg.cn/blog_migrate/c4a9c29a01373ab01d83bd9aa9c42cb6.png)
#家庭数据Parch、SibSp:对于家庭数据选择计算家庭人数的方法提取特征
familydf=pd.DataFrame() #存放提取后的特征
familydf['family_size']=full['SibSp']+full['Parch']+1
familydf['family_single']=familydf['family_size'].map(lambda a:1 if a==1 else 0)
familydf['family_small']=familydf['family_size'].map(lambda a:1 if 2<=a<=4 else 0)
familydf['family_large']=familydf['family_size'].map(lambda a:1 if 5<=a else 0)
full = pd.concat([full,familydf],axis=1) #添加one-hot编码产生的虚拟变量(dummy variable)到full中
full.head()
结果:
![edf9bd4fafcd4c52f5da66784356e228.png](https://i-blog.csdnimg.cn/blog_migrate/ba55d2ca85d3a55a6a0aabd6e5803543.png)
full.info()
结果:
![26e5428ce7cf2d89f8a7215e2c873993.png](https://i-blog.csdnimg.cn/blog_migrate/d086f3d3b32a8d4c8cb4ae505dbff541.png)
#查看相关性,使用corr生成相关系数矩阵
corrDf = full.corr()
corrDf
结果:
![2a573f09c1fa2643d715a6193b103984.png](https://i-blog.csdnimg.cn/blog_migrate/c316647449c8afe45445d9b366c649ff.jpeg)
#查看各个特征与生存情况的相关性
corrDf['Survived'].sort_values(ascending=False)
结果:
![4b0071e6915cacfa6e10b71f24afba54.png](https://i-blog.csdnimg.cn/blog_migrate/be17fe6713ed8adbea39147bbb9abf42.png)
#特征选择
full_x=pd.concat([titleDf,pclassdf,familydf,full['Fare'],cabindf,embarkeddf,full['Sex']],axis=1)
full_x.head()
结果:
![327ddf421f1dbcef705d85b550969ddd.png](https://i-blog.csdnimg.cn/blog_migrate/c936518f4bc6d13096180a0d885e0530.png)
print(full_x.shape)
结果:
![73c2f476b608fde5d684f9e8d441ed21.png](https://i-blog.csdnimg.cn/blog_migrate/4e33225b57fc17daeea1b59000d6a5ac.png)
#构建模型
#原始数据集有891条数据
sourceRow=891
#原始数据集特征
source_x=full_x.loc[0:sourceRow-1,:]
#原始数据集标签
source_y=full.loc[0:sourceRow-1,'Survived']
#预测数据集特征
pre_x=full_x.loc[sourceRow:,:] #取sourceRow之后的数据
source_x.head()
结果:
![3d107cd171c632c5434cea0ecf68a451.png](https://i-blog.csdnimg.cn/blog_migrate/04b30809688066e9c0aca6748246709d.png)
#建立训练数据和测试数据
from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=0.8)
#数据集大小
print('原始数据集特征',source_x.shape,
'训练数据集特征',train_x.shape,
'测试数据集特征',test_x.shape)
print('原始数据集标签',source_y.shape,
'训练数据集标签',train_y.shape,
'测试数据集标签',test_y.shape)
结果:
![7dc44ed6790acd20884bdbbdf4054c8b.png](https://i-blog.csdnimg.cn/blog_migrate/60aca590fa51a0fa71fe5f5612171494.png)
#导入机器算法
from sklearn.linear_model import LogisticRegression
model=LogisticRegression() #创建逻辑回归模型
model.fit(train_x,train_y) #训练模型
#评估模型,查看正确率
model.score(test_x,test_y)
结果:
![98637b2e7f3d34448a279f9ca1c0b928.png](https://i-blog.csdnimg.cn/blog_migrate/d391aa7a91d41089cde09f9649f46178.png)
#通过机器学习模型,对预测数据生存情况进行预测
pre_y=model.predict(pre_x)
#将预测结果转换为整数型
pre_y=pre_y.astype(int)
#乘客ID
passenger_ID=full.loc[sourceRow:,'PassengerId']
#乘客名字
passenger_Name=full.loc[sourceRow:,'Name']
#数据框:乘客ID,预测结果
preDf=pd.DataFrame({'PassengerId':passenger_ID,'Name':passenger_Name,'Survived':pre_y})
preDf.head()
结果:
![3202333b60338fd7fb9529890b3fba13.png](https://i-blog.csdnimg.cn/blog_migrate/c4710096fefbb1fed20bc51f60edff89.png)
#将文件保存到本地
preDf.to_csv('tintanic_prd.csv',index=False)
参考资料:
https://zhuanlan.zhihu.com/p/108969064
https://zhuanlan.zhihu.com/p/84353059