Titanic生还预测

任务一:数据分析
1.导入数据

import pandas as pd
trainDF=pd.read_csv('train.csv',encoding='gbk')
testDF=pd.read_csv('test.csv',encoding='gbk')

合并数据集,对两个数据集同时清洗

integDF = pd.concat([trainDF,testDF],axis = 0,ignore_index = True)

2.查看数据内容

pd.set_option('display.max_columns', None)   #显示所有的列
print(integDF.head())  #查看前5行
print(integDF.info())  #查看列表信息

输出列表信息:共1309组数据,Age缺失263个,Cabin缺失1014个,Embarked缺失2个,Fare缺失1个。为了获取更多的样本,对于缺失数据采取填补的方式。
Titanic生还预测_第1张图片
3.数据预处理:缺失填补

#数值类数据采用平均值填补
integDF['Age'] = integDF['Age'].fillna(integDF['Age'].mean())
integDF['Fare'] = integDF['Fare'].fillna(integDF['Fare'].mean())
integDF.info()
#Embarked填补频次最高的“S”
integDF['Embarked'].value_counts()
integDF['Embarked'] = integDF['Embarked'].fillna('S')
integDF.head()
#Cabin缺失较多,用“U”填补表示未知
integDF['Cabin'] = integDF['Cabin'].fillna('U')
integDF.head()

任务二:特征工程
4.数据类型转换

#性别转化为0,1
sex_map={'male':1,'female':0}
integDF['Sex'] = integDF['Sex'].map(sex_map)
integDF['Sex'].head()

#Embarked使用get_dummies进行one-hot编码,存放登船港口信息
embarkedDf = pd.DataFrame()
embarkedDf = pd.get_dummies( integDF['Embarked'] , prefix='Embarked' )

#Pclass使用get_dummies进行one-hot编码,存放客舱等级信息
pclassDf = pd.DataFrame()
pclassDf = pd.get_dummies( integDF['Pclass'] , prefix='Pclass' )

#Cabin使用get_dummies进行one-hot编码,存放客舱号信息
cabinDf = pd.DataFrame()
integDF[ 'Cabin' ] = integDF[ 'Cabin' ].map( lambda c : c[0] ) #取首字母
cabinDf = pd.get_dummies( integDF['Cabin'] , prefix = 'Cabin' )

转化结果:
输出前5行,男性、女性分别转化为1,0。
Titanic生还预测_第2张图片
输出前5行,Embarked中C、Q、S分别转化为特征向量[1,0,0],[0,1,0],[0,0,1]。
Titanic生还预测_第3张图片
输出前5行,Pclass等级1,2,3分别转化为特征向量[1,0,0],[0,1,0],[0,0,1]。
Titanic生还预测_第4张图片
输出前5行,Cabin分为A,B,C,D,E,F,G,T,U
Titanic生还预测_第5张图片

字符串类型-乘客姓名(Name)

注意到在乘客名字(Name)中,有一个非常显著的特点:
乘客头衔每个名字当中都包含了具体的称谓或者说是头衔,将这部分信息提取出来后可以作为非常有用一个新变量,可以帮助我们进行预测。

#从姓名中获取头衔
def getTitle(name):
    str1=name.split( ',' )[1] #Mr. Owen Harris
    str2=str1.split( '.' )[0]#Mr
    #strip() 方法用于移除字符串头尾指定的字符(默认为空格)
    str3=str2.strip()
    return str3
#存放提取后的特征
titleDf = pd.DataFrame()
#map函数:对Series每个数据应用自定义的函数计算
titleDf['Title'] = integDF['Name'].map(getTitle)
print(titleDf.head())
#姓名中头衔字符串与定义头衔类别的映射关系
title_mapDict = {
                    "Capt":       "Officer",
                    "Col":        "Officer",
                    "Major":      "Officer",
                    "Jonkheer":   "Royalty",
                    "Don":        "Royalty",
                    "Sir" :       "Royalty",
                    "Dr":         "Officer",
                    "Rev":        "Officer",
                    "the Countess":"Royalty",
                    "Dona":       "Royalty",
                    "Mme":        "Mrs",
                    "Mlle":       "Miss",
                    "Ms":         "Mrs",
                    "Mr" :        "Mr",
                    "Mrs" :       "Mrs",
                    "Miss" :      "Miss",
                    "Master" :    "Master",
                    "Lady" :      "Royalty"
                    }
#map函数:对Series每个数据应用自定义的函数计算
titleDf['Title'] = titleDf['Title'].map(title_mapDict)
#使用get_dummies进行one-hot编码
titleDf = pd.get_dummies(titleDf['Title'])

输出前5行,提取名字结果

Titanic生还预测_第6张图片

输出前5行,
Titanic生还预测_第7张图片

建立家庭人数和家庭类别

家庭人数=同代直系亲属数(Parch)+不同代直系亲属数(SibSp)+乘客自己
(因为乘客自己也是家庭成员的一个,所以这里加1)
家庭类别:
小家庭Family_Single:家庭人数=1
中等家庭Family_Small: 2<=家庭人数<=4
大家庭Family_Large: 家庭人数>=5

#存放家庭信息
familyDf = pd.DataFrame()
familyDf[ 'FamilySize' ] = integDF[ 'Parch' ] + integDF[ 'SibSp' ] + 1
#if 条件为真的时候返回if前面内容,否则返回0
familyDf[ 'Family_Single' ] = familyDf[ 'FamilySize' ].map( lambda s : 1 if s == 1 else 0 )
familyDf[ 'Family_Small' ]  = familyDf[ 'FamilySize' ].map( lambda s : 1 if 2 <= s <= 4 else 0 )
familyDf[ 'Family_Large' ]  = familyDf[ 'FamilySize' ].map( lambda s : 1 if 5 <= s else 0 )
familyDf.head()

输出前5行
Titanic生还预测_第8张图片
添加one-hot编码产生的虚拟变量(dummy variables)到泰坦尼克号数据集,并删除对应的原始列。

integDF = pd.concat([integDF,embarkedDf,pclassDf,cabinDf,titleDf,familyDf],axis=1)

integDF.drop(['Embarked','Pclass','Cabin','Name','Parch','SibSp'],axis=1,inplace=True)
print(integDF.head())

5 特征选择

相关系数法:计算各个特征的相关系数。相关系数的绝对值越大,相关性越强,相关系数越接近于1和-1,相关度越强,相关系数越接近于0,相关度越弱。

#相关性矩阵,查看各个特征与生成情况(Survived)的相关系数,ascending=False表示按降序排列
corrDf = integDF.corr()
corrDf['Survived'].sort_values(ascending =False)
print(corrDf['Survived'].sort_values(ascending =False))

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

头衔(前面所在的数据集titleDf)、客舱等级(pclassDf)、家庭大小(familyDf)、船票价格(Fare)、船舱号(cabinDf)、登船港口(embarkedDf)、性别(Sex)
Titanic生还预测_第9张图片

integDF_X = pd.concat( [titleDf,#头衔
                     pclassDf,#客舱等级
                     familyDf,#家庭大小
                     integDF['Fare'],#船票价格
                     cabinDf,#船舱号
                     embarkedDf,#登船港口
                     integDF['Sex']#性别
                    ] , axis=1 )

输出CSV格式数据

integDF_X.to_csv('E:/Jenny/data/TT/integDF_X.csv',index=True,header=True)

参考资料:https://blog.csdn.net/sundy_l/article/details/80614779
https://www.jianshu.com/p/06c2ee7e5c68

你可能感兴趣的:(Titanic生还预测)