【问题标题】:Classification report changes with each run每次运行时分类报告都会发生变化
【发布时间】:2021-02-11 04:47:33
【问题描述】:

我用下面的代码得到了分类模型的confusion matrixclassification report,但是每次运行结果都会变化!为什么会发生,我该如何解决?

import pandas as pd
import numpy as np
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix

bankdata = pd.read_csv("bill_authentication.csv")

X = bankdata.drop('Class', axis=1)
y = bankdata['Class']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)

svclassifier = SVC(kernel='rbf')
svclassifier.fit(X_train, y_train)
y_pred = svclassifier.predict(X_test)

print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

【问题讨论】:

  • 你能指定“运行”吗?你每次跑步都会重新训练吗?
  • @gtancev 是的,我每次跑步都会训练。我想知道分类准确度到底是多少,以便与其他模型进行比较。
  • 除非您出示minimal reproducible example,否则无法为您提供帮助
  • 请查看版本。

标签: python scikit-learn classification confusion-matrix


【解决方案1】:

您需要为train_test_split 设置random_states。如果不设置它,每次运行都会获得不同的随机状态。导致不同的火车测试拆分。从而导致分类器的输入不同,这可能(在您的情况下是)导致结果不同。

因此,例如,如果您将 random_state 设置为固定值,您将在两次运行之间得到相同的结果,因此请更改为这行代码。您设置的精确值 random_state 无关紧要,只要它在两次运行之间相同即可。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)

您也可以为SVC 设置random_state,但这仅在probability 参数设置为True 时起作用。默认设置为False,因此它不会影响您的情况。

【讨论】:

  • 现在结果已修复,谢谢。但在之前的许多实验中,我达到了 100%。有什么办法可以找到最佳的随机状态?
  • random_state 不是一个适合调整的超参数。 see this question at crossvalidated。但是,如果您真的愿意,您可以在 for 循环中运行分类器的训练测试拆分/训练,并使用一系列 random_state 值,然后选择一个准确率达到 100% 的结果。
猜你喜欢
  • 2016-05-24
  • 1970-01-01
  • 2012-05-18
  • 2018-07-12
  • 2020-02-03
  • 2012-11-29
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多