为什么cross_val_score返回几个分数?

时间:2020-10-15 15:55:21

标签: python machine-learning decision-tree

我有以下代码

tree = DecisionTreeClassifier(max_depth=4, random_state=0)
trainPrediction=tree.predict(trainData)
score=cross_val_score(tree, trainData, trainPrediction)

使用上面的代码,我得到的分数看起来像这样:

[0.96052632 0.93421053 0.89473684 0.94736842 0.92      ]

我期望分数只是一个数字,而不是数组。我如何阅读此代码,哪个代码将被视为得分?

我尝试过的其他一些分类器(例如SVM)具有score(...)函数,效果很好。 Decisiontree分类器似乎也具有此功能,但是当我尝试使用它时出现错误:

trainScore=score(trainData, trainPrediction)

我得到的错误是:TypeError: 'numpy.float64' object is not callable

文档显示了这个score(X, y[, sample_weight]),但我猜我不太明白

我之所以使用cross_val_score(...)是因为他们在DecisionTree的文档中使用了它: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

注意

我还尝试使用:precision_score(...),如本例所示:

Accuracy score of a Decision Tree Classifier

但这不起作用,因为此函数不属于此分类器

1 个答案:

答案 0 :(得分:1)

sklearn.model_selection.cross_val_score为您提供通过交叉验证评估的分数,这意味着它使用K折交叉验证来拟合和使用输入数据进行预测。因此,结果是每个折叠产生的k个分数数组。您有一个5值数组,因为cv默认为该值,但您可以将其修改为其他值。

以下是使用虹膜数据集的示例:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)

tree = DecisionTreeClassifier(max_depth=4, random_state=0)
cls = tree.fit(X_train, y_train)
y_pred = cls.predict(X_test)

现在使用默认设置:

score = cross_val_score(cls, X_test, y_test)
score
# array([1., 1., 1., 1., 1.])

或三折:

score = cross_val_score(cls, X_test, y_test, cv=3)
score
# array([1., 1., 1.])

还请注意,cross_val_score期望X和目标变量来尝试预测,而不是预测值。因此,您应该将其喂入X_testy_test