本篇博客的知识和代码全都来源于此:寒小阳的博客:泰坦尼克哈之灾
一、这里先说一下通常处理缺失值的几种方法:
i)如果缺失的样本占总数极大,我们可能就直接舍弃了;因为如果作为特征加入的话,可能反倒带入噪音,影响最后的结果
ii)如果缺值的样本适中,且为非连续值特征属性,我们可以把nan作为一个新类别,加入到类别特征中
iii)如果缺值的样本适中,且为连续值特征属性,有时候可以考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把nan作为一个type加到属性类目中
iv)如果缺失值得个数不是特别多,那我们也可以试着根据已有得值,拟合一下数据,补充上去
二、我以kaggle上的经典入门题目:泰坦尼克号之灾为例来分享一下用随机森林来补全缺失值的方法。
1)先来描述一下数据,数据共有12个特征如下:
其中5个对象型特征,7个数值型特征;7个数值型特征中PassengerId和Survived特征暂时派不上用场,所以最后放到随机森林里的特征也就是剩下的5个:‘Age’,‘Fare’,‘Parch’,‘SibSp’,‘Pclass’。
2)代码如下:
from sklearn.ensemble import RandomForestRegressor
def set_missing_ages(df):
#把数值型特征都放到随机森林里面去
age_df=df[['Age','Fare','Parch','SibSp','Pclass']]
known_age = age_df[age_df.Age.notnull()].as_matrix()
unknown_age = age_df[age_df.Age.isnull()].as_matrix()
y=known_age[:,0]#y是年龄,第一列数据
x=known_age[:,1:]#x是特征属性值,后面几列
rfr=RandomForestRegressor(random_state=0,n_estimators=2000,n_jobs=-1)
#根据已有数据去拟合随机森林模型
rfr.fit(x,y)
#预测缺失值
predictedAges = rfr.predict(unknown_age[:,1:])
#填补缺失值
df.loc[(df.Age.isnull()),'Age'] = predictedAges
return df,rfr