【问题标题】:sklearn random forest sample_weight in fit()sklearn 随机森林 sample_weight in fit()
【发布时间】:2020-01-16 05:15:06
【问题描述】:

在 sklearn 的 RF 拟合函数(或大多数 fit() 函数)中,可以传入“sample_weight”参数来衡量不同的点。默认情况下,所有点的权重相等,如果我将 1 的数组作为 sample_weight 传递,它确实匹配没有参数的原始模型。

但是,如果我将 0.1s 或 1/len(array) 的数组作为 sample_weight 传递,它会改变模型(现在的预测不同),尽管点仍然是同等权重。这是令人不安的,因为体重缩放似乎很重要。那么缩放的正确方法是什么,以便我有一个独特的解决方案?

下面的例子:

import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
boston = datasets.load_boston()

X = boston.data
y = boston.target

reg = RandomForestRegressor(random_state=1, n_estimators=10)
reg.fit(X, y)

reg_eq = RandomForestRegressor(random_state=1, n_estimators=10)
reg_eq.fit(X, y, sample_weight=np.full(len(y),1))

reg_eq_bad = RandomForestRegressor(random_state=1, n_estimators=10)
reg_eq_bad.fit(X, y, sample_weight=np.full(len(y),0.1))


xt = X[:20]
print(reg.predict(xt))
print(reg_eq.predict(xt))
print(reg_eq_bad.predict(xt))

np.testing.assert_array_almost_equal(reg.predict(xt),reg_eq.predict(xt))
np.testing.assert_array_almost_equal(reg.predict(xt),reg_eq_bad.predict(xt)) # 75% mismatch

【问题讨论】:

标签: scikit-learn random-forest


【解决方案1】:

如果您将randomForestRegressor 替换为简单的DecisionTreeRegressor,您会发现预测结果确实相等。

但是对于随机森林,如果您使用sample_weight 参数来欺骗输入数据,由于这些模型引入的随机性/不确定性,没有什么可以确保预测将保持不变。

虽然,如果模型正常工作,差异应该不会很大......

【讨论】:

  • 您提到的随机性实际上是由于“random_state”参数而固定的。所以它不应该是差异的根源。否则,为什么 reg_eq 会与原始匹配?
  • mmh,是的,你也许是对的...我尝试使用 DecisionTreeRegressor 和参数 splitter="random",因为它是 RandomForestRegressor 实际使用的拆分器,结果证明所有预测值都与不同的sample_weight 相同(如您所料)。所以要么random_state在树的并行处理过程中被严重传播,要么我错过了一些东西。
猜你喜欢
  • 2016-07-23
  • 2015-08-28
  • 2014-09-04
  • 2019-03-14
  • 2017-04-28
  • 2018-01-18
  • 2016-04-18
  • 2019-08-02
  • 2019-07-22
相关资源
最近更新 更多