這個系列博客純粹爲了記錄一下自己學習kaggle的相關內容,也是跟着別人一步步學習。
從【Kaggle入門】Titanic: Machine Learning from Disaster----認識數據已經知道數據有缺失的情況。
根據大神們的經驗,通常遇到缺失的值會有以下幾種常用的處理方式。
- 如果缺失的樣本佔總樣本的比例極大,則直接捨棄該特徵,避免引入noise,影響最後的結果。
- 如果樣本缺失數量適中,且該屬性爲非連續值特徵屬性,就把NaN作爲一個新的類別加入到類別特徵中。
- 如果樣本缺失數量適中,且該屬性爲連續值特徵屬性,可以考慮把特徵離散化,然後將NaN作爲一個新的類別加入到類別特徵中。
- 如果樣本缺失數量較少,可以嘗試根據已有的數據擬合補充上缺失的數據。
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
現在對數據的簡單預處理就完成了。