Bar*_*ian 1 python random machine-learning random-forest scikit-learn
在使用 Scikit-learn 调整随机森林模型时,我注意到即使我使用相同的 RandomForestClassifier 实例和相同的数据作为输入,但在不同的运行后其准确度分数也不同。我尝试了谷歌搜索和 stackExchange 搜索功能,但我能找到与此模糊相似的唯一情况是这篇文章,但问题是在没有适当随机状态的情况下实例化分类器,这不是我的问题的情况。
我正在使用以下代码:
clf = RandomForestClassifier( n_estimators=65, max_features = 9, max_depth= 'sqrt', random_state = np.random.RandomState(123) )
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state = np.random.RandomState(159) )
clf.fit(X_train, y_train)
y_pred=clf.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
X和y是我的数据和相应的标签,但我发现数据集并没有影响问题。当我运行 train_test_split 行时,我每次都会得到相同的分割,因此没有随机性。使用相同的拟合模型运行 Predict() 每次也会给出相同的结果,这表明我的问题与我上面链接的帖子不同。然而,每次运行 fit() 后,predict() 都会给出不同的预测!即使我不碰 X_train 和 y_train 也会发生这种情况。所以只需运行这两行
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
每次都会给出不同的结果。据我从文档中可以看出 .fit() 不应该做任何随机的事情。如果没有可重复的输出,就不可能调整模型,所以我很确定某个地方存在错误。我缺少什么?以前有人遇到过这种情况,或者有人知道为什么会发生这种情况吗?
RandomState
如果您要重新运行拟合并期望得到相同的结果,请不要使用 numpy对象。仅使用整数random_state
代替。
来自 sklearn 的词汇表,使用 numpy RandomState
:
多次调用该函数将重用同一个实例,并会产生不同的结果。
该RandomState
对象被播种(使用您的 123),但随后每次调用 时都会持续存在fit
,继续获取新的随机数,而不会被重置。
快速检查:
clf = RandomForestClassifier(random_state=314)
preds = {}
for i in range(10):
preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i+1]) for i in range(9))
# > True
clf = RandomForestClassifier(random_state=np.random.RandomState(314))
preds = {}
for i in range(10):
preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i+1]) for i in range(9))
# > False
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1214 次 |
最近记录: |