泰坦尼克号乘客生存情况分析之第二部分特征工程

第二部分 特征工程

继第一部分数据探索性分析,今天主要介绍下第二部分特征工程。原始数据肯定不能直接拿来分析,因为数据比较杂乱,就算分析的话,也得不到有价值的信息,所以需要进行数据处理,处理成我们想要的格式。好了,废话不多说,下面进入正文,直接开撸代码。

【注意】关于数据集下载以及项目链接可以在公众号【数分小白龙】私信获取,或者在和鲸社区找到【经典案例之泰坦尼克号乘客生存情况预测分析】即可!

 

1. 合并训练集与测试集

在进行特征工程的时候,我们不仅需要对训练数据进行处理,还需要同时将测试数据同训练数据一起处理,使得二者具有相同的数据类型和数据分布。

import pandas as pd

train = pd.read_csv('/home/mw/input/wlong9812/train.csv')
test = pd.read_csv('/home/mw/input/wlong9812/test.csv')
train_and_test = train.append(test, sort=False) # 合并训练集与测试集
PassengerId = test['PassengerId']
train_and_test.shape

2. 缺失值处理

  1. 对Embarked直接用众数填充;

  2. 对Fare用均值填充;

  3. 对Age,建立模型预测;

2.1 填充Embarked字段

mode = train_and_test['Embarked'].mode().iloc[0] # 找到众数
train_and_test['Embarked'].fillna(mode, inplace=True)
train_and_test.info()

2.2 填充船票Fare字段

Fare_mean = train_and_test['Fare'].mean()
train_and_test['Fare'].fillna(Fare_mean, inplace=True)
train_and_test.info()

2.3 填充年龄Age字段

为尽可能用多的特征去预测Age的值,先对Cabin、Embarked、Name、Sex、Ticket、Pclass等特征进行处理,模型预测见后;

3 不同特征字段的数据处理

3.1 先对Embarked、Sex以及Pclass等用dummy处理

# 对分类特征进行编码
cols = ['Embarked', 'Sex', 'Pclass']
train_and_test = pd.get_dummies(train_and_test, columns=cols, prefix_sep='__')
train_and_test.info()

3.2 票价分级处理

我们可以尝试将Fare分桶处理,使用qcut函数。qcut是根据这些值的频率来选择箱子的均匀间隔,每个箱子中含有的数的数量是相同的;

# 临时列
train_and_test['Fare_bin'] = pd.qcut(train_and_test['Fare'], 5)

#编码
train_and_test['Fare_bin_id'] = pd.factorize(train_and_test['Fare_bin'])[0]
fare_bin_dummies_df = pd.get_dummies(train_and_test['Fare_bin_id']).rename(columns=lambda x : 'Fare_' + str(x))
train_and_test = pd.concat([train_and_test, fare_bin_dummies_df], axis=1)
train_and_test.drop(['Fare_bin'], axis=1, inplace=True)

3.3 名字处理

对名字Name进行处理,提取其特征;

# 提取称呼
train_and_test['Title'] = train_and_test['Name'].apply(lambda x : x.split(',')[1].split('.')[0].strip())
# 将各式称呼进行统一化处理
# 头衔映射表
titleDict = {
    "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"
}
train_and_test['Title'] = train_and_test['Title'].map(titleDict)
# one_hot编码
train_and_test['Title'] = pd.factorize(train_and_test['Title'])[0]
title_dummies_df = pd.get_dummies(train_and_test['Title'], prefix=train_and_test[['Title']].columns[0])
train_and_test = pd.concat([train_and_test, title_dummies_df], axis=1)
# 提取长度特征
train_and_test['Name_length'] = train_and_test['Name'].apply(len)
train_and_test['Name_length']

3.4 Cabin处理

Cabin缺失值过多,将其分为有无两类,进行编码,如果缺失,即为0,否则为1;

train_and_test.loc[train_and_test.Cabin.isnull(), 'Cabin'] = 'U0'
train_and_test['Cabin'] = train_and_test['Cabin'].apply(lambda x : 0 if x == 'U0' else 1)
train_and_test['Cabin']

3.5 Ticket处理

Ticket有字母和数字之分,对于不同的字母,可能在很大程度上就意味着船舱等级或者不同船舱的位置,也会对Survived产生一定的影响,所以我们将Ticket中的字母分开,为数字的部分则分为一类。

train_and_test['Ticket_Letter'] = train_and_test['Ticket'].str.split().str[0]
train_and_test['Ticket_Letter'] = train_and_test['Ticket_Letter'].apply(lambda x : 'U0' if x.isnumeric() else x)

# 将Ticket_Letter factorize
train_and_test['Ticket_Letter'] = pd.factorize(train_and_test['Ticket_Letter'])[0]
train_and_test['Ticket_Letter']

4. 利用随机森林预测Age缺失值

from sklearn.ensemble import RandomForestRegressor  # 随机森林回归

missing_age = train_and_test.drop(['PassengerId', 'Survived', 'Name', 'Ticket'], axis=1) # 去除字符串类型的字段
missing_age_train = missing_age[missing_age['Age'].notnull()]
missing_age_test = missing_age[missing_age['Age'].isnull()]

X_train = missing_age_train.iloc[:,1:]
y_train = missing_age_train.iloc[:,0]
X_test = missing_age_test.iloc[:,1:]

rfr = RandomForestRegressor(n_estimators=1000, n_jobs=-1)
rfr.fit(X_train, y_train)
y_predict = rfr.predict(X_test)
train_and_test.loc[train_and_test['Age'].isnull(), 'Age'] = y_predict
train_and_test.info()

5. 各特征与Survived的相关系数排序

# 根据生存情况与其他各特征的相关系数,按系数倒序排序,筛选出重要特征 -- 重要特征
train_and_test.corr()['Survived'].abs().sort_values(ascending=False)

6. 保存特征处理后的数据

train_and_test.to_csv('/home/mw/input/wlong9812/经过特征工程处理后的数据.csv', index=None)

7. 小结

特征工程这一章主要做了以下工作:

(1) 合并训练集和测试集:

  1. 为了使二者具有相同的数据类型和数据分布;

(2)缺失值处理:

  1. Embarked:众数填充;

  2. Fare:平均值填充;

  3. Age:随机森林预测填充;

(3)各特征字段的数据处理:

  1. Embarked,Sex,Pclass: 直接dummy编码;

  2. Fare: 先分桶处理,再dummy编码;

  3. Name: 先提取称呼,再对称呼进行人群分类,最后dummy处理;

  4. cabin:缺失值较多,根据是否缺失划分类别,缺失为0,否则为1;

  5. Ticket:只保留其中字母,并对字母进行数字转换;

  6. 随机森林建模预测Age缺失值;

(4)对各特征与生存与否进行了相关系数大小排序;

好了,本小章节主要谈到泰坦尼克号数据的特征工程处理,后续就是建模预测部分了,建模预测打算分两部分,一部分只是简单涉及一些算法,参数全部默认;另一部分,会加些算法调参、优化以及复杂模型等,这几天就会安排上!

如果本文有存在不足的地方,欢迎大家在评论区留言,我会继续完善的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数分小白龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值