这个系列博客纯粹为了记录一下自己学习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
现在对数据的简单预处理就完成了。