任务一:数据分析
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个。为了获取更多的样本,对于缺失数据采取填补的方式。
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。
输出前5行,Embarked中C、Q、S分别转化为特征向量[1,0,0],[0,1,0],[0,0,1]。
输出前5行,Pclass等级1,2,3分别转化为特征向量[1,0,0],[0,1,0],[0,0,1]。
输出前5行,Cabin分为A,B,C,D,E,F,G,T,U
字符串类型-乘客姓名(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行,提取名字结果
建立家庭人数和家庭类别
家庭人数=同代直系亲属数(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行
添加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)
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