machine-learning - 在 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 变化如此之大。
解决方案
调整 random_state 可为您提供不同的准确度。随机状态就像将数据集随机拆分为训练和测试,而不是根据索引的升序值拆分数据集。这导致将数据点拆分为训练和测试,如果测试数据中有任何点在训练数据中不存在,那么这可能会导致准确度下降。解决此问题的最佳方法是使用交叉验证拆分。在这种方法中,将数据随机拆分为训练和测试,然后执行机器学习建模,并且此步骤重复 n 次,其中 n 是拆分数(主要是 n = 5)。然后我们取所有精度的平均值,并将该精度视为最终结果。而不是每次都更改值 random_state 可以执行交叉验证拆分
您可以在以下链接中找到对此的参考:
推荐阅读
- python - 无法将数据传递到模板 html 页面 [Django]
- angular - 构建多步骤表单 - 使用 0 高度元素的坏习惯?
- spring-kafka - 获取 java.lang.OutOfMemoryError: Java heap space when using Spring kafka to generate a message
- angular - 通过 file:/// 运行 Angular 7 spa 页面
- hyperledger-fabric - 如何配置对等节点连接到 7050 以外的另一个端口上的排序服务?
- reactjs - React ref.current 在 componentDidMount 中仅在酶测试中为空,而不是实时为空
- scala - 如果列表中不存在,则附加 xml 节点
- android - 从我的收藏中读取和写入文档时,firestore 规则不起作用
- java - 如何获取特定行的 Java 程序的堆栈跟踪
- android - 以编程方式设置时,ImageView 总是返回空白