背景描述
泰坦尼克号轮船的沉没是历史上最为人熟知的海难事件之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在船上的 2224 名乘客和机组人员中,共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会,从而促进了船舶安全规定的完善。造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。
数据说明
数据描述:
变量名称 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|---|---|
变量解释 | 乘客编号 | 是否存活 | 船舱等级 | 姓名 | 性别 | 年龄 | 兄弟姐妹和配偶数量 | 父母与子女数量 | 票的编号 | 票价 | 座位号 | 登船码头 |
数据来源
Titanic Competition : How top LB got their score
目录
- 背景描述
- 数据说明
- 数据来源
- 二 特征工程
- 1. 合并训练集与测试集
- 2. 缺失值处理
- 2.1 填充Embarked字段
- 2.2 填充船票Fare字段
- 2.3 填充年龄Age字段
- 3 不同特征字段的数据处理
- 3.1 先对Embarked、Sex以及Pclass等用dummy处理
- 3.2 票价分级处理
- 3.3 名字处理
- 3.4 Cabin处理
- 3.5 Ticket处理
- 4. 利用随机森林预测Age缺失值
- 5. 各特征与Survived的相关系数排序
- 6. 保存特征处理后的数据
二 特征工程
1. 合并训练集与测试集
import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
train_and_test = train.append(test, sort=False) # 合并训练集与测试集
PassengerId = test['PassengerId']
train_and_test.shape
2. 缺失值处理
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字段
train_and_test['Fare'].mean()
Fare_mean = train_and_test['Fare'].mean()
train_and_test['Fare'].fillna(Fare_mean, inplace=True)
train_and_test.info()
2.3 填充年龄Age字段
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 票价分级处理
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 名字处理
提取称呼
train_and_test['Title'] = train_and_test['Name'].apply(lambda x : x.split(',')[1].split('.')[0].strip())
train_and_test['Title']
将各式称呼进行统一化处理
头衔映射表
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.info()
提取长度特征
train_and_test['Name_length'] = train_and_test['Name'].apply(len)
train_and_test['Name_length']
3.4 Cabin处理
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处理
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('经过特征工程处理后的数据.csv', index=None)
如果本文有存在不足的地方,欢迎大家在评论区留言
更多详细内容可看