机器学习之随机森林填补缺失值和众数填补缺失值

基础

随机森林由Leo Breiman(2001)提出的一种分类算法,它通过自助法(bootstrap)重采样技术,从原始训练样本集N中有放回地重复随机抽取n个样本生成新的训练样本集合训练决策树,然后按以上步骤生成m棵决策树组成随机森林,新数据的分类结果按分类树投票多少形成的分数而定。其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于独立抽取的样本。

    单棵树的分类能力可能很小,但在随机产生大量的决策树后,一个测试样本可以通过每一棵树的分类结果经统计后选择最可能的分类。
重复下面步骤 K 次,即生成K棵决策树,形成随机森林:
 
  第一步:从训练集 T 中有放回抽样的方式,取样N 次形成一个新子训练集 D;
 
  第二步:随机选择 m 个特征,其中 m < M;
 
  第三步:使用新的训练集 D 和 m 个特征,学习出一个完整的决策树(一般是CART);

代码



X_missing = pd.DataFrame(X_missing, columns=boston.feature_names)
X_missing.head(3)


#我们首先需要对每个特征进行排序,依照含有的缺失值数量。关键要看谁有最少的缺失值

X_missing_reg = X_missing.copy()
X_missing_reg.isnull().sum(axis=0) # 这样可以得到每一列的缺失值的数量
np.argsort(X_missing_reg.isnull().sum(axis=0)).values # 得到从小到大排序顺序所对应的索引
sort_index = np.argsort(X_missing_reg.isnull().sum(axis=0)).values



for i in sort_index:
    
    
    # 构建新特征矩阵和新标签
    df = X_missing_reg
    
    fillc = df.iloc[:,i] #即将被填充的特征,视为新目标变量

    df = pd.concat([df.iloc[:, :i], df.iloc[:, i+1:], pd.DataFrame(y_full)], axis=1)
     #把新目标变量剔除,然后把原始标签进新特征矩阵
    

    # 在新特征矩阵中,对含有缺失值的列,用0进行填补。得到最终版特征矩阵
    df_0 = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0).fit_transform(df)
    
    
    # 找出能够用来训练的资料 以及 将要进行填补的资料
    ytrain = fillc[fillc.notnull()]
    ytest = fillc[fillc.isnull()]
    Xtrain = df_0[ytrain.index, :]
    Xtest = df_0[ytest.index, :]
    

    # 随机森林训练以及预测
    rfr = RandomForestRegressor(n_estimators=1000)
    rfr = rfr.fit(Xtrain, ytrain)
    ypredict = rfr.predict(Xtest)
    

    # 将填补结果放回数据集
    X_missing_reg.iloc[X_missing_reg.iloc[:,i].isnull(),i] = ypredict


填充众数(add)

对每一列的缺失值,填充当列的众数。
由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

代码

train_data.fillna(train_data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
features_mode = {}
for f in features:
    print f,':', list(train_data[f].dropna().mode().values)
    features_mode[f] = list(train_data[f].dropna().mode().values)[0]
train_data.fillna(features_mode,inplace=True)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tomorrowave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值