“热启动”与新数据相结合会导致随机森林预测时出现广播错误

问题描述 投票:0回答:2

我正在尝试使用

sklearn
训练随机森林模型。我有一些原始数据(
x
y
),我最初用它们来训练 RF。

from sklearn.ensemble import RandomForestClassifier
import numpy as np
x = np.random.rand(30,20)
y = np.round(np.random.rand(30))
rf = RandomForestClassifier()
rf.fit(x,y)

现在我得到了一些新数据,我想用它们来重新训练模型,但我想保持

rf
中已经存在的树不变。所以我设置了
warm_start=True
并添加了额外的树。

x_new = np.random.rand(5,20)
y_new = np.round(np.random.rand(5))
rf.n_estimators +=100
rf.warm_start = True
rf.fit(x_new,y_new)

到目前为止一切顺利。一切正常。 但是当我做出预测时,我得到了一个错误:

rf.predict(x)
>>> ValueError: non-broadcastable output operand with shape (30,1) doesn't match the broadcast shape (30,2)

为什么会出现这种情况?

python machine-learning scikit-learn random-forest
2个回答
0
投票

这似乎是新版本

scikit-learn
特有的问题。 上面的代码在
v1.1.3
版本中按预期工作,但在
v1.2.2

中则不然

0
投票

您遇到的错误 ValueError: 形状为 (30,1) 的不可广播输出操作数与广播形状 (30,2) 不匹配,与 rf.predict(x) 的输出形状有关手术。出现此错误是因为 RandomForestClassifier 中的类数量在热启动过程中发生了变化。

这就是发生这种情况的原因:

最初,您使用二元分类训练随机森林模型 (rf),其中 y 有两个类(0 和 1)。

在热启动过程中,您向模型中添加了 100 棵树 (rf.n_estimators += 100),并使用新数据(x_new 和 y_new)对其进行训练,这些数据可能具有不同的类或类标签。

现在,当您调用 rf.predict(x) 时,模型会尝试使用具有可能不同的类的新配置进行预测。

要解决此问题,如果您打算更改类或类标签的数量,则应该重新初始化射频模型并从头开始训练。具体方法如下:

from sklearn.ensemble import RandomForestClassifier
import numpy as np

# Initial training
x = np.random.rand(30, 20)
y = np.round(np.random.rand(30))
rf = RandomForestClassifier()
rf.fit(x, y)

# New training with a different dataset
x_new = np.random.rand(5, 20)
y_new = np.round(np.random.rand(5))
rf = RandomForestClassifier()  # Reinitialize the model
rf.fit(x_new, y_new)

# Predictions
predictions = rf.predict(x)
© www.soinside.com 2019 - 2024. All rights reserved.