我有以下代码
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(...)
函数,这个函数运行得很好。决策树分类器似乎也有这个函数,但当我尝试像这样使用它时,我得到了一个错误:
trainScore=score(trainData, trainPrediction)
我得到的错误是:TypeError: 'numpy.float64' object is not callable
文档显示这是score(X, y[, sample_weight])
,但我猜我并不真正理解这个
我使用cross_val_score(...)
的原因是因为他们在决策树的文档中使用了它:https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
注意
我也尝试使用:accuracy_score(…) 像这个例子中一样:
但这不起作用,因为这个函数不是这个分类器的一部分
回答:
sklearn.model_selection.cross_val_score
为您提供了通过交叉验证评估的分数,这意味着它使用K折交叉验证来拟合和预测输入数据。因此,结果是一个包含k
个分数的数组,这些分数来自每个折叠。你有一个包含5
个值的数组,因为cv
默认使用这个值,但你可以修改为其他值。
这里有一个使用鸢尾花数据集的例子:
from sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.datasets import load_irisX, 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_test
和y_test
。