python数据分析--综合案例3

数据来源:泰坦尼克逃生数据
知识点:特征处理和随机森林预测
主要内容:

  • 缺失值处理
    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') 

你可能感兴趣的:(学记笔记,python,数据分析,随机森林)