第二部分 特征工程

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

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

1. 合并训练集与测试集

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

import pandas as pdtrain = 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)对各特征与生存与否进行了相关系数大小排序;

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

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

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

  1. 泰坦尼克号乘客生存情况分析第一部分

    第一部分 数据读取及探索性分析 哈喽,各位小伙伴.今晚是平安夜,就先祝大家平安夜快乐,永远平安健康.泰坦尼克号相信很多人都不陌生,今天呢,主要聊一聊之前做过的一个小项目,预测下泰坦尼克号乘客的生存情况 ...

  2. 泰坦尼克号乘客生存情况预测分析之第三部分建模及模型评价

    第三部分建模及模型评价 前面两部分我们已经对泰坦尼克号的数据进行了一些处理,感兴趣的小伙伴可以看看前面两篇文章,本篇主要介绍预测分析的第三部分,也就是建模和模型评价.数据处理完了,接下来就来看看在默认 ...

  3. 【决策树算法】泰坦尼克号乘客生存预测

    泰坦尼克号乘客生存预测 1. 案例背景 2. 步骤分析 3. 代码实现 4. 决策树可视化 4.1 保存树的结构到dot文件 4.2 网站显示结构 5. 决策树总结 6. 小结 1. 案例背景 泰坦尼 ...

  4. 泰坦尼克号乘客生存预测(XGBoost)

    泰坦尼克号乘客生存预测(XGBoost) 1. 案例背景 2. 步骤分析 3. 代码实现 1. 案例背景 泰坦尼克号沉没是历史上最臭名昭着的沉船之一.1912年4月15日,在她的处女航中,泰坦尼克号在 ...

  5. 机器学习项目(一):泰坦尼克号乘客生存概率分析

    机器学习项目(一):泰坦尼克号乘客生存概率分析 文章目录 机器学习项目(一):泰坦尼克号乘客生存概率分析 项目背景: 项目的目的: 数据集: 读取数据: 导入数据: 检查是否有缺失值 查看数据规模 查 ...

  6. 机器学习决策树算法泰坦尼克号乘客生存预测

    目录 1 决策树算法api 2 泰坦尼克号乘客案例背景 2.1 步骤分析 2.2 代码实现 2.3 决策树可视化 2.3.1 保存树的结构到dot文件 2.3.2 网站显示结构 3 决策树总结 4 小 ...

  7. 泰坦尼克号乘客生存预测

    泰坦尼克号乘客获救预测 1. 案例背景 泰坦尼克号沉船事故是世界上最著名的沉船事故之一.1912年4月15日,在她的处女航期间,泰坦尼克号撞上冰山后沉没,造成2224名乘客和机组人员中超过1502人的 ...

  8. 决策树算法实现:泰坦尼克号乘客生存预测 (python实现)

    目录 1 案例背景 2 决策树算法api 3. 代码实现 3.1 代码部分分析 3.2 完整代码 4 决策树可视化 4.1 保存树的结构到dot文件 4.2 网站显示结构 4.2.1效果 5 决策树总 ...

  9. 数据分析实战之决策树(泰坦尼克号乘客生存预测)

    本文利用已给特征属性和存活与否标签的训练集和只包含特征信息测试集数据,通过决策树模型来预测测试集数据乘客的生存情况 数据集来源为https://github.com/cystanford/Titani ...

  10. 基于用Hive泰坦尼克号乘客信息存储与分析

    实现以下任务: 创建数据库taitan 创建乘客信息表 导入数据到表中 统计获救与死亡情况 统计舱位分布情况 统计港口登船人数分布情况 统计性别与生存率的关系 统计客舱等级与生存率的关系 统计登船港口 ...

最新文章

  1. Xamarin.Forms探索--使用 Xamarin.Forms 来创建跨平台的用户界面
  2. request对象_java学习之web基础(2):Request
  3. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
  4. jqGrid 中的editrules来自定义colModel验证规则
  5. 1019. 链表中的下一个更大节点
  6. mysql 多表 update sql语句总结
  7. 3.Python配套习题
  8. 前端抱怨API响应慢,怎么办?
  9. 燃烧我的卡路里 ---- Flutter瘦内存瘦包之图片组件
  10. Tensorflow——Tensorflow的用途、安装、数据流图
  11. mysql导出导入数据
  12. 推荐两个适合代码的字体
  13. 直接播放H264视频流的方法或工具
  14. 线性调频信号及仿真[python]
  15. python 导入自定义包
  16. The remote device or resource won't accept the connect
  17. 【基础理论】介绍一个概率分布:柯西分布
  18. win7安装vmware+ubuntu16.04
  19. Java面向可复用性和可维护性的设计模式
  20. Python语法之文件操作思维导图

热门文章

  1. ZeroTier 和 FRP 速度对比实验(附搭建方法)
  2. 修真院java_【修真院JAVA小課堂】JMeter的簡單介紹
  3. python0309
  4. 使用useSelector、useDispatch替代connect
  5. 商业智能bi是什么意思?
  6. 一招教你解决Win10屏幕模糊问题
  7. vue源码解析:vue生命周期方法$mount方法的实现原理
  8. JavaScript 销毁对象
  9. 利用Blast比对基因
  10. 2022最新可用免费天气预报API接口