我正在尝试使用
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)
为什么会出现这种情况?
这似乎是新版本
scikit-learn
特有的问题。
上面的代码在 v1.1.3
版本中按预期工作,但在 v1.2.2
中则不然
您遇到的错误 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)