文章目录

  • 基础
  • 代码
  • 填充众数(add)
  • 代码


基础

随机森林由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)