【Kaggle入门】Titanic: Machine Learning from Disaster----简单数据处理


这个系列博客纯粹为了记录一下自己学习kaggle的相关内容,也是跟着别人一步步学习。


【Kaggle入门】Titanic: Machine Learning from Disaster----认识数据已经知道数据有缺失的情况。

根据大神们的经验,通常遇到缺失的值会有以下几种常用的处理方式。

  1. 如果缺失的样本占总样本的比例极大,则直接舍弃该特征,避免引入noise,影响最后的结果。
  2. 如果样本缺失数量适中,且该属性为非连续值特征属性,就把NaN作为一个新的类别加入到类别特征中。
  3. 如果样本缺失数量适中,且该属性为连续值特征属性,可以考虑把特征离散化,然后将NaN作为一个新的类别加入到类别特征中。
  4. 如果样本缺失数量较少,可以尝试根据已有的数据拟合补充上缺失的数据。

Embarked仅缺失两个样本。

em_null = data_train[data_train.Embarked.isnull()].as_matrix()
em_null

因为S口岸登船人数最多,因此这里我决定之间把这两个缺失的值设为S应该也不会影响最后的结果。

data_train.loc[ (data_train.Embarked.isnull()), 'Embarked' ] = 'S'
data_train.info()

可以看到Embarked缺失数据已经补上了,并且全部不为null

em_null = data_train[data_train.Embarked.isnull()].as_matrix()
em_null

Age属性样本缺失较少,可以用已有的数值型特征拟合来补充。

from sklearn.ensemble import RandomForestRegressor

def set_missing_ages(df):
    age_df = df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]
    
    age_notnull = age_df[age_df.Age.notnull()].as_matrix()
    age_isnull = age_df[age_df.Age.isnull()].as_matrix()
    
    y = age_notnull[:, 0]
    X = age_notnull[:, 1:]
    
    model = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
    model.fit(X, y)
    
    predictions = model.predict(age_isnull[:, 1:])
    df.loc[df.Age.isnull(), 'Age'] = predictions
    
    return df

data_train = set_missing_ages(data_train)
data_train.info()

Age的缺失数据已经补充上了。

Cabin的缺失数据很多,这里可以按照有无cabin信息将其重新赋予两中类型,有cabin:yes,无cabin:no。

def set_cabin_type(df):
    df.loc[df.Cabin.notnull(), 'Cabin'] = 'Yes'
    df.loc[df.Cabin.isnull(), 'Cabin'] = 'No'
    
    return df

data_train = set_cabin_type(data_train)
data_train.info()

现在所有缺失数据都已经补上了。

但是,逻辑回归建模需要输入数值型数据,但是目前我们的数据还有一部分是非数值型的,需要对类目型的特征进行因子化。

Pandas的get_dummies可以实现。

dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix='Cabin')
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')
dummies_Sex = pd.get_dummies(data_train['Sex'], prefix='Sex')
dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')

df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
df

但是有些属性的数值变化范围大,不利于梯度下降。所以需要把这种范围范围大的属性值做归一化。

import sklearn.preprocessing as preprocessing

scaler = preprocessing.StandardScaler()
np_data_age = np.array(data_train['Age']).reshape(-1, 1)
age_scale_param = scaler.fit(np_data_age)
data_train['Age_scaled'] = scaler.fit_transform(np_data_age, age_scale_param)
np_data_fare = np.array(data_train['Fare']).reshape(-1, 1)
fare_scale_param = scaler.fit(np_data_fare)
data_train['Fare_scaled'] = scaler.fit_transform(np_data_fare, fare_scale_param)
data_train

现在对数据的简单预处理就完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章