我有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])
我的问题是:
- 这个结果可能吗?如果是,我如何知道该选择哪种型号
- 当我在test_train_split中更改随机状态时,有时我可以为不同的模型获得不同的分数,但这种情况很少发生,我不知道应该选择哪个随机状态
- 为什么我在第3次到第5次采样时得到相同的分数,即0.777777778
-
是的,两个不同的分类器可能会给你相同的分数。这种可能性随着问题的不同而发生巨大变化。我的第一直觉是质疑你的数据的大小。太小,很容易过度填充,只学习数据的一个子集。
-
通常,您不需要指定随机状态。当您希望能够在给定相同数据和分类器的情况下在每次运行中重现结果时,请保留此选项。你不应该选择最好的随机状态。
-
看起来你实际上并不是在训练数据。你直接跳到测试集得分。我建议你回到sklearn文档,再阅读一些教程,但基本上你会想要这样的东西:
x_train,x_test,y_train,y_test=train_testrongplit(x,y,testrongize=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
的教程。对于每个分类器,都有底层模型的参数,您可以对这些参数进行调整,以实现最佳的分类性能。这门课可以帮助你找到这些。
使用训练集x_train
查看不同模型的分数是否发生变化。使用x_test
作为训练集来运行交叉验证将不会有更多的行来训练估计器。
此外,不要将random_state
更改为train_test_split
,因为它只是用于为训练和测试复制相同的分割。