对于许多分类模型,能否获得相同的交叉验证分数

时间:2018-12-17 13:07:41

标签: select classification random-forest decision-tree cross-validation

我有5列虚拟人物,代表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])

我的问题是:

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

2 个答案:

答案 0 :(得分:0)

  1. 是的,两个不同的分类器可以为您提供相同的分数。问题的可能性在很大程度上因问题而异。我的第一个直觉是质疑数据的大小。太小了,过拟合和仅学习一部分数据将很容易。

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

  3. 看起来您实际上并不是在训练数据。您直接跳起来得分。我建议您返回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的教程。对于每个分类器,您都可以调整基础模型的参数,以实现最佳分类性能。此类可帮助您找到这些内容。

答案 1 :(得分:0)

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

此外,请勿将random_state的{​​{1}}更改为train_test_split,因为它只是用于复制相同的分割以进行训练和测试。