首页 > 解决方案 > 在 sklearn 方法中更改 random_state(在调整超参数之后)提供不同的准确性

问题描述

我正在学习统计学习/机器学习课程,目前正在做一个包括分类任务的项目,并且我有一些关于 random_state 参数的新手问题。我的模型的准确性会根据 random_state 发生很大变化。我目前正在使用逻辑回归(来自 sklearn.linear_model.LogisticRegression())。我尝试使用 GridSearchCV 方法调整超参数。

问题:我得到不同的预测精度,这取决于我使用的 random_state。

我尝试过的:我尝试将 random_state 参数设置为全局状态(使用 np.random.seed(randomState) 并将 randomState 设置为脚本顶部的整数)。此外,我使用

train_test_split(X, y, test_size=0.2, random_state=randomState)

具有相同的(全局)整数 randomState。此外,我想执行 GridSearchCV 来调整超参数。因此,我指定了一个 param_grid 并在其上执行 GridSearchCV。从中,我找到了最好的估计器并选择它作为我的模型。然后,我使用我的模型进行预测并打印结果的分类报告。我通过更改 randomState 来取 10 次运行的平均值。

示例:我使用 randomState=1 执行此过程,并从 GridSearchCV 中找到最佳模型:model_1。我得到了 84% 的准确率。如果我更改为 randomState = 2,...,10 并且仍然使用 model_1,则平均准确率变为 80.5%。我使用 randomState=42 执行此过程,并从 GridSearchCV 中找到最佳模型:model_42。我得到了 77% 的准确率。如果 Im 更改为 randomState = 41, 40, 39,..,32 并且仍然使用 model_42,则平均准确率变为 78.7%。

我很困惑为什么精度会根据 random_state 变化如此之大。

标签: machine-learningscikit-learnrandom-seed

解决方案


调整 random_state 可为您提供不同的准确度。随机状态就像将数据集随机拆分为训练和测试,而不是根据索引的升序值拆分数据集。这导致将数据点拆分为训练和测试,如果测试数据中有任何点在训练数据中不存在,那么这可能会导致准确度下降。解决此问题的最佳方法是使用交叉验证拆分。在这种方法中,将数据随机拆分为训练和测试,然后执行机器学习建模,并且此步骤重复 n 次,其中 n 是拆分数(主要是 n = 5)。然后我们取所有精度的平均值,并将该精度视为最终结果。而不是每次都更改值 random_state 可以执行交叉验证拆分

您可以在以下链接中找到对此的参考:

https://machinelearningmastery.com/k-fold-cross-validation/#:~:text=Cross%2Dvalidation%20is%20a%20resampling,k%2Dfold%20cross%2Dvalidation


推荐阅读