是否有可能为许多分类模型获得相同的交叉验证分数

Posted

技术标签:

【中文标题】是否有可能为许多分类模型获得相同的交叉验证分数【英文标题】:Is it possible to get the same cross validation score for many classification model 【发布时间】:2019-05-17 20:38:18 【问题描述】:

我有 5 列 dummy 代表 5 个类别。我运行了 3 个分类模型,但得到了相同的交叉验证分数平均值。我想知道这是否可能?

我的代码如下,

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=1/3, random_state=88888)

cvL = cross_val_score(LogisticRegression(), x_test, y_test,cv=5)

cvD = cross_val_score(DecisionTreeClassifier(max_depth=5), x_test, y_test,cv=5)

cvF = cross_val_score(RandomForestClassifier(n_estimators=10), x_test, y_test,cv=5)

I get the same score for all 3 model, which is

array([0.78125   , 0.78125   , 0.77777778, 0.77777778, 0.77777778])

我的问题是:

    这种结果可能吗?如果是,我怎么知道该选择哪种型号? 当我在 test_train_split 中更改随机状态时,有时我可能会为不同的模型获得不同的分数,但这种情况很少发生,我不知道应该选择哪个随机状态。 为什么我在第 3 到第 5 次采样时得到相同的分数,即 0.7777777778

【问题讨论】:

尝试在模型中添加一个数值变量(可以补),看看分数是否保持不变。 【参考方案1】:

    是的,两个不同的分类器可以给你相同的分数。这种情况的可能性因问题而异。我的第一个直觉是质疑您的数据大小。太小,很容易过拟合,只学习数据的一个子集。

    通常,您不需要指定随机状态。当您希望能够在给定相同数据和分类器的情况下在每次运行时重现结果时,请保留此选项。您不必选择最佳的随机状态。

    看起来您实际上并没有在训练数据。您直接跳到对测试集进行评分。我建议您返回 sklearn 文档并阅读更多教程,但基本上您需要类似以下内容:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=1/3, random_state=88888)

logreg = LogisticRegression()
logreg.fit(x_train, y_train)

cvL = cross_val_score(logreg, x_test, y_test, cv=5)

当然,交叉验证的一个主要特点是能够选择最佳超参数。我建议在 sklearn 的 GridSearchCV 上找到一个教程。对于每个分类器,您可以调整基础模型的参数以实现最佳分类性能。本课程可帮助您找到这些。

【讨论】:

【参考方案2】:

使用训练集x_train 查看不同模型的分数是否发生变化。使用x_test 进行交叉验证毫无意义,因为训练集将有更多行来训练估计器。

另外,不要将random_state 更改为train_test_split,因为这只是用于重现训练和测试的相同拆分。

【讨论】:

以上是关于是否有可能为许多分类模型获得相同的交叉验证分数的主要内容,如果未能解决你的问题,请参考以下文章

python 查看分类问题的交叉验证分数

为啥 scikit-learn SVM 分类器交叉验证这么慢?

在 Scikit 中保存交叉验证训练的模型

使用交叉验证为 k-最近邻分类器找到正确的 k 值

为啥交叉验证 RF 分类的性能比没有交叉验证的差?

Scikit-learn 使用朴素贝叶斯进行 10 折交叉验证的多类分类