任务二:Titanic-特征工程

任务二:特征工程
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行,提取名字结果

在这里插入图片描述

输出前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'],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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值