数据来源:泰坦尼克逃生数据
知识点:特征处理和随机森林预测
主要内容:
缺失值处理
1. 对Embarked字段直接用众数填充
2. 对船票Fare字段用均值填充
3. 建立预测模型,填充年龄Age字段
不同特征字段的处理
1. 对Embarked、Sex以及Pclass等用dummy处理
2. 对票价Fare分级处理,使用qcut分桶
3. 对名字Name进行处理,提取称呼,如Mr, Mrs, Miss等;
4. 对称呼进行oner-hot编码
5. 对Cabin进行编码,Cabin缺失值过多,将其分为有无两类,进行编码,如果缺失,即为0,否则为1
6. 对Ticket处理,提取字母,得到Ticket_Letter,对Ticket_Letter进行 factorize处理
7. 利用随机森林预测Age缺失值
对相关系数排序筛选重要特征
import pandas as pd
train = pd.read_csv('/home/mw/input/titanic/train.csv')
test = pd.read_csv('/home/mw/input/titanic/test.csv')
train_and_test = train.append(test, sort=False) # 合并训练集与测试集
PassengerId = test['PassengerId']
train_and_test.shape
# 对Embarked直接用众数填充;
mode=train_and_test['Embarked'].mode().iloc[0]
train_and_test['Embarked'].fillna(mode,inplace=True)
# 对Fare用均值填充;
Fare_mean=train_and_test['Fare'].mean()
train_and_test['Fare'].fillna(Fare_mean,inplace=True)
1.对Embarked、Sex以及Pclass等用dummy处理
pd.get_dummies(train_and_test['Embarked'], # 输入的数据框
prefix='Embarked', # 列名的前缀
prefix_sep='_', # 分割符
dummy_na=False, # 增加一列空缺值
columns=['Embarked'], # 指定要实现转换的列名
sparse=False,
drop_first=False, # 删除第一个类别值
dtype=None)
# 对分类特征进行编码
cols=['Embarked','Sex','Pclass']
train_and_test=pd.get_dummies(train_and_test,columns=cols,prefix_sep='__')
2.对票价Fare进行分级
尝试将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.对称呼建立映射表进行统一化处理,并进行one-hot编码
# 对名字Name进行处理,提取其特征;
# 提取称呼
train_and_test['Title']=train_and_test['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip())
# 建立头衔映射表,将各式称呼进行统一化处理
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'}
train_and_test['Title']=train_and_test['Title'].map(title_mapDict)
# 进行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']
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']
5.提取Ticket中的字母,进行factorize
# 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']
6.利用随机森林预测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()
7.对相关系数进行排序
# 根据生存情况与其他各特征的相关系数,按系数倒序排序,筛选出重要特征 -- 重要特征
train_and_test.corr()['Survived'].abs().sort_values(ascending=False)
8.保存数据
# 保存文件到本地
df.to_csv('泰坦尼克.csv', index=False, encoding='utf-8-sig')