【发布时间】:2020-08-20 16:42:24
【问题描述】:
使用监督学习方法,我们有特征(输入)和目标(输出)。如果我们有按行求和为 1 的多维目标(例如 [0.3, 0.4, 0.3]),为什么 sklearn 的 RandomForestRegressor 似乎在训练数据之和为 1 时将所有输出/预测归一化为 1?
似乎在 sklearn 的源代码中的某个地方,如果训练数据的总和为 1,它正在对输出进行规范化,但我无法找到它。我已经到了BaseDecisionTree class,它似乎被随机森林使用,但在那里看不到任何规范化。我创建了一个gist 来展示它是如何工作的。当目标的逐行总和不等于 1 时,回归器的输出总和不等于 1。但是当目标的逐行总和总和为 1 时,它似乎对其进行了归一化。这是来自 gist 的演示代码:
import numpy as np
from sklearn.ensemble import RandomForestRegressor
# simulate data
# 12 rows train, 6 rows test, 5 features, 3 columns for target
features = np.random.random((12, 5))
targets = np.random.random((12, 3))
test_features = np.random.random((6, 5))
rfr = RandomForestRegressor(random_state=42)
rfr.fit(features, targets)
preds = rfr.predict(features)
print('preds sum to 1?')
print(np.allclose(preds.sum(axis=1), np.ones(12)))
# normalize targets to sum to 1
norm_targets = targets / targets.sum(axis=1, keepdims=1)
rfr.fit(features, norm_targets)
preds = rfr.predict(features)
te_preds = rfr.predict(test_features)
print('predictions all sum to 1?')
print(np.allclose(preds.sum(axis=1), np.ones(12)))
print('test predictions all sum to 1?')
print(np.allclose(te_preds.sum(axis=1), np.ones(6)))
最后一点,我尝试在其他随机森林实现(Python 中的 H2O,R 中:rpart、Rborist、RandomForest)中运行类似的拟合,但没有找到另一个允许多个输出的实现。
我的猜测是 sklearn 代码中存在一个错误,它以某种方式混淆了分类和回归,并且输出被归一化为 1,就像分类问题一样。
【问题讨论】:
标签: python machine-learning scikit-learn random-forest