【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

現在對數據的簡單預處理就完成了。

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