一.RandomForestClassifier
n_estimator
- 这是森林中树木的数量,即基评估器的数量
- n_estimator越大,模型的效果往往越好,需要的计算量和内存也越大,训练的时间也会越来越长
random_state
- 当random_state固定时,随机森林中生成的是一组固定的树,但每棵树依然是不一致的。这是用“随机挑选特征进行分枝”的方法得到的随机性,当这种随机性越大的时候,袋装法的效果一般会越来越好
bootstrap & oob_score
- bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常这个参数不会被我们设置为False
- 如果希望用袋外数据来测试,则需要在实例化时就将oob_score这个参数调整为True,训练完毕之后,我们可以用随机森林的另外一个重要属性:oob_score_来查看在袋外数据上测试的结果
二.RandomForestRegressor
所有的参数,属性和接口,全部和随机森林分类器一致,还是apply,fit,predict和score最为核心。仅有的不同就是回归树与分类树不纯度的指标,参数criterion不一致
随机森林没有predict_proba这个接口
criterion
- 输入“mse”使用均方误差,这种方法通过使用叶子节点的均值来最小化L2损失
- 输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差
- 输入“mae”使用绝对平均误差,这种指标使用叶子节点的中值来最小化L1损失
在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,回归树的接口score返回的是R平方,并不是MSE,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算“负均方误差”
三.案例:使用随机森林填补缺失值
对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵,那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,这就是我们需要预测的部分
- 特征T不缺失的值对应的其它n-1个特征 + 本来的标签:X_train
- 特征T不缺失的值:Y_train
- 特征T缺失的值对应的其它n-1个特征 + 本来的标签:X_test
- 特征T缺失的值:未知,我们需要预测的Y_test
这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用
那如果数据中除了特征T之外,其他特征也有缺失值怎么办?
- 遍历所有的特征,从缺失最少的开始进行填补(因为填补却是最少的特征所需要的准确信息最少)
- 填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补却是最多的特征
- 遍历所有特征后,数据就完整,不再有缺失值了
sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values
for i in sortindex:
#构建我们的新特征矩阵和新标签
df = X_missing_reg
fillc = df.iloc[:,i]
df = pd.concat([df.iloc[:,df.columns != i],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,:]
#用随机森林回归来填补缺失值
rfc = RandomForestRegressor(n_estimators=100)
rfc = rfc.fit(Xtrain,Ytrain)
Ypredict = rfc.predict(Xtest)
#将填补好的特征返回到我们的原始的特征矩阵中
X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict