我在相同的数据上运行了随机森林,得到了不同的结果。根据这篇文章,原因是:
由于学习算法的性质,在相同的数据上运行相同的算法时,可能会得到不同的结果。有些算法是不确定的;相反,它们是随机的。这意味着他们的行为包含了随机性的元素。
然后提到我们可以通过以下方式处理:
您设置了伪随机数生成器使用的种子,以确保每次运行算法时,都能获得相同的随机性。
我不确定在这种情况下如何控制伪随机数?此外,我在对数据帧进行混洗时使用了随机状态,因此将确保每次都以相同的方式进行混洗,但这与通过seudorand随机数生成器控制模型无关。正确的
df = df.sample(frac=1,random_state = 524).reset_index(drop=True)
要获得可重复的结果,您应该在不同阶段修复random_state
:
- 拆分数据集时
- 初始化随机林时
这里有一个玩具示例:
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
diabetes = load_diabetes(as_frame = True)
X = diabetes['data']
y = diabetes['target']
# control randomness when splitting
X_train,X_test, y_train, y_test = train_test_split(X, y,test_size = 0.1, random_state = 42)
# control randomness at initialisation
rfr = RandomForestRegressor(random_state = 42)
rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)
如果要多次重新运行此单元格,则y_pred
将始终相同。
有三个随机元素。前两个是算法的一部分。las取决于数据。
当你声明你的分类器时,在RandomForestClassifier
中有:
- 训练新树时数据的混洗
- 构建每个节点时随机拾取的特征的混洗
这两个是通过在拟合模型之前设置随机种子来控制的:RandomForestClassifier(random_state=123)
当您拟合数据时:3.您传递给.fit()
的训练数据
你已经控制了随机性的第三个来源。因此,设置一个random_state
,使两个模型收敛到完全相同的结果。
我认为您的问题与此处所述的问题相同:Python sklearn RandomForestClassifier不可复制的结果
因此,您可以通过添加来获得可重复的结果
random.seed(1234)
(括号之间有您想要的任何值(运行随机林分类器。
此外,在机器学习中取得不同的结果并不重要。你应该检查一下你是否得到了一致的结果,也许可以估计一个误差幅度(通过模拟(。