问:有人能解释一下出现的差异吗?
答:sklearn.ensemble.RandomForestClassifier
对象及其观察到的.oob_score_
属性值不是与错误相关的问题。
首先,基于RandomForest
的预测器{分类器|回归器}
属于所谓集成方法的特定领域,因此请注意,典型的方法,包括交叉验证,不像其他AI/ML学习者那样工作。
RandomForest
“内部”逻辑严重依赖于随机过程,其中具有已知y == {标签
(对于分类器)|目标
(对于回归器)}
的样本(数据集X
)被划分到森林生成中,其中树通过将数据集随机分成树可以看到的部分和树将无法看到的部分(从而形成内部oob子集)进行自举。
除了对过度拟合等敏感性的其他影响外,RandomForest
集成不需要进行交叉验证,因为它的设计不会过度拟合。许多论文和Breiman(伯克利)的经验证明提供了支持这种说法的证据,因为它们提供了CV-ed预测器将具有相同的.oob_score_
的证据。
import sklearn.ensemble
aRF_PREDICTOR = sklearn.ensemble.RandomForestRegressor( n_estimators = 10,
criterion = 'mse',
max_depth = None,
min_samples_split = 2,
min_samples_leaf = 1,
min_weight_fraction_leaf = 0.0,
max_features = 'auto',
max_leaf_nodes = None,
bootstrap = True,
oob_score = False,
n_jobs = 1,
random_state = None,
verbose = 0,
warm_start = False
)
aRF_PREDICTOR.estimators_
aRF_PREDICTOR.feature_importances_
aRF_PREDICTOR.oob_score_
aRF_PREDICTOR.oob_prediction_
aRF_PREDICTOR.apply( X )
aRF_PREDICTOR.fit( X, y[, sample_weight] )
aRF_PREDICTOR.fit_transform( X[, y] )
aRF_PREDICTOR.get_params( [deep] )
aRF_PREDICTOR.predict( X )
aRF_PREDICTOR.score( X, y[, sample_weight] )
aRF_PREDICTOR.set_params( **params )
aRF_PREDICTOR.transform( X[, threshold] )
需要注意的是,默认值并不是最好的选择,在任何情况下都不是最好的。在继续之前,需要关注问题领域,以提出合理的组合
参数集。
Q: 什么是良好的.oob_score_?
A: .oob_score_ 是随机的!. . . . . . ..是的,它必须是随机的
虽然这听起来有点挑衅性,但不要灰心丧气。
随机森林是一个很好的工具。一些问题可能会出现在特征(数据集X
)中的分类值中,然而一旦你不必与偏差或过度拟合斗争,处理集合的成本仍然是适当的。 这很棒,对不对?
为了能够在后续重复运行时重现相同的结果,推荐的做法是在随机过程(嵌入到每个随机森林集合的自助抽样中)之前将 numpy.random
和.set_params(random_state= ...)
设置为已知状态。这样做可以观察到基于随机森林的预测器的“去噪声”进展,从而更好地 .oob_score_
而不是由于更多集合成员(n_estimators
),树构造的限制较少(max_depth
、max_leaf_nodes
等)而仅仅是通过随机过程“更好的运气”的随机分割数据集引入了预测能力的真正改善...
向更好的解决方案靠近通常需要将更多的树放入集合中(随机森林的决策基于多数投票,因此10个评估器对高度复杂的数据集进行良好决策并不是一个很大的基础)。2000以上的数字并不罕见。可以迭代一系列尺寸(保持随机过程在状态控制下)以证明集合的“改进”。
如果 .oob_score_
的初始值大约在0.51 - 0.53左右,则您的集合比随机猜测好1%-3%
只有在将基于集合的预测器变得更好之后,才能转向其他特征工程等额外技巧。
aRF_PREDICTOR.oob_score_ Out[79]: 0.638801
aRF_PREDICTOR.oob_score_ Out[89]: 0.789612