我是一个相当复杂的数据集上的'm taking my baby steps with machine learning and would like to use scikit-learn' s RandomForestRegressor() . 首先要了解它,我正在尝试通过以下基本示例:
import sklearn.ensemble as se
import numpy as np
forest = se.RandomForestRegressor(n_estimators=1000)
traindata = np.arange(1000).reshape(200,5)
forest = forest.fit(traindata[0::,1::],traindata[0::,0])
此时,我认为我创建了一个200行矩阵,每行格式 [ x, x+1, x+2, x+3, x+4 ]
有5个值,其中 x
是5的倍数(例如 [0,1,2,3,4]
, [5,6,7,8,9]
等) .
我已经告诉我的森林适合 [ x+1, x+2, x+3, x+4 ]
来预测 x . 以下是我预测的情况:
forest.predict([1,2,3,4])
>> array([2.785])
这对我来说真的不直观 . 考虑到 [1,2,3,4]
的特征值是 x = 0 的训练数据,我的森林难道不能比2.785更接近预测吗?
我更进一步看到功能重要性如下:
forest.feature_importances_
>> array([0.26349716, 0.23664264, 0.23360533, 0.26625487])
对我来说,这并不意味着我所看到的方式存在重大偏差 . 我在这里想念的是什么?
4 回答
为什么不准确预测?
Short version: 由于智能Breiman提出的方法的性质 .
Longer version:
随机森林是非常有趣的学习者 .
但是,你需要一点耐心才能让它们得到调整 .
原则上,任何使用 .fit() 方法的尝试都会在场景背后做很多工作来构建一组随机的决策树,使其成为一个RandomForest,适用于您的数据集 .
.fit() 的“ quality ”表示在 .oob_score_ 中,其中显示了在给定 RandomForest 的训练结束后,已经使用的 oob -samples(Breiman方法的真正部分)中的(in)-accurate . 这有助于您估算“ well " or how " poor ”对您的训练
RandomForest
在可用数据集上的执行情况 .然而,更重要的是(或者应该), how well the learner generalises - 即,一旦看到一个看不见的例子,它的预测能力如何能够满足现实 .
这个可以通过训练有素的
RandomForest
-instance的 .score() 方法进行测试 .RandomForest是一个“多数投票” - 预测者,感觉到,尝试显示随机树的军队的内部状态:
这将显示单个树的预测投射到整个基于森林的预测的多数投票微积分 .
这意味着,除了其他内容之外, RandomForest 主要不会预测培训中存在的"visited"值范围的值"outside"(不能通过设计"extrapolate") .
如何让它变得更好?
嗯,特色工程是关键 . 如果你知道一个RandomForest对你的案例是一个可行的学习者而你觉得它是 observed predictive powers are poor ,那么首先应该归咎于特征选择 .
检查森林
检查学习者的内部状态 - 检查森林中的树木做了什么:
您可以通过以下方式更深入地了解模型:
当我尝试你的代码时,我得到
AttributeError: 'module' object has no attribute 'arrange'
所以这里是你的例子的可复制版本(一般来说,我建议明确创建单独的X和Y以避免犯一个愚蠢的错误,我在看到你的问题时首先想到的) . 如下所示,随机森林分类器在训练集中的示例上表现完美 . 随机森林回归量不会产生完美的预测 . 我不知道为什么会这样,但这是一个开始的地方 .如果您的预测性能仍然很差,您可以将训练集设置为具有相同数量的0级和1级数据,以使数据中的信号更具意义 . 有关详细说明,请参阅this link .
有几件事你做错了/次优:
你只有200行/观察,但你尝试训练N = 1000棵树 . 这是没有意义的 . 你应该没有 . 树木<<没有 . 观察结果 . N = 3-40棵树的任何地方 .
You are trying to learn a line: your data is perfectly linear (whereas RF's are intended for a normally-distributed response variable). 对于线性数据,使用更合适的分类器(如线性回归)会优于RF并提供完美的结果(事实上,您的所有四个特征都是线性相关的,您可以丢弃任意三列,回归仍然可以得到完美的结果)
然后,您正在尝试 predict at one of the endpoints ,这是一个已知会产生偏见的问题,原因如下 . 考虑到RF是1000棵树的集合,其行是随机选择的;有些树木可能会预测到最低 endpoints (如果它处于正态分布的尾部,这不会是一个问题) . 输出预测将是整体中每棵树的个体预测的平均值:
for i in range(1000): forest.estimators_[i].predict([1,2,3,4])
或:
np.hstack([ forest.estimators_[i].predict([1,2,3,4]) for i in range(1000) ])
然后你会看到许多0和5,大约10,但甚至大约15s,20s和25s . 因此,您的最终预测将是一些> 0且可能<5 .