如何将下方代码中的性能指标从准确率改为精确率、召回率和其他指标?

作为scikit-learn的新手,我在尝试对鸢尾花数据集进行分类时,遇到了scoring='accuracy'调整为其他指标(如精确率、召回率、f1等)的问题,特别是在交叉验证步骤中。以下是# Test options and evaluation metric开始的完整代码示例(足以从这里开始)。

# Load librariesimport pandasfrom pandas.plotting import scatter_matriximport matplotlib.pyplot as pltfrom sklearn import model_selection # for command model_selection.cross_val_scorefrom sklearn.metrics import classification_reportfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import accuracy_scorefrom sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVC# Load dataseturl = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']dataset = pandas.read_csv(url, names=names)# Split-out validation datasetarray = dataset.valuesX = array[:,0:4]Y = array[:,4]validation_size = 0.20seed = 7X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)# Test options and evaluation metricseed = 7scoring = 'accuracy'#Below, we build and evaluate 6 different models# Spot Check Algorithmsmodels = []models.append(('LR', LogisticRegression()))models.append(('LDA', LinearDiscriminantAnalysis()))models.append(('KNN', KNeighborsClassifier()))models.append(('CART', DecisionTreeClassifier()))models.append(('NB', GaussianNB()))models.append(('SVM', SVC()))# evaluate each model in turn, we calculate the cv-scores, ther mean and std for each model# results = []names = []for name, model in models:    #below, we do k-fold cross-validation    kfold = model_selection.KFold(n_splits=10, random_state=seed)    cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)    results.append(cv_results)    names.append(name)    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())    print(msg)

现在,除了scoring='accuracy'外,我想为这个多类别分类问题评估其他性能指标。但当我使用scoring='precision'时,它会引发:

ValueError: Target is multiclass but average='binary'. Please choose another average setting.

我的问题是:

1) 我猜上面发生的情况是因为scikit-learn中precisionrecall仅定义为二分类问题 – 这是正确的吗?如果是,那么应该用哪些命令替换上面的scoring='accuracy'

2) 如果我想在执行k折交叉验证时计算每个折的混淆矩阵、精确率和召回率,我应该输入哪些命令?

3) 为了实验,我尝试了scoring='balanced_accuracy',结果发现:

ValueError: 'balanced_accuracy' is not a valid scoring value.

为什么会这样,当模型评估文档(https://scikit-learn.org/stable/modules/model_evaluation.html)明确指出balanced_accuracy是一种评分方法时?我在这里相当困惑,因此展示如何评估其他性能指标的实际代码将不胜感激!提前感谢!!


回答:

1) 我猜上面发生的情况是因为scikit-learn中precisionrecall仅定义为二分类问题 – 这是正确的吗?

不是。精确率和召回率当然也适用于多类别问题 – 请查看precisionrecall的文档。

如果是,那么应该用哪些命令替换上面的scoring='accuracy'

问题出现是因为,正如我上面提供的文档链接所示,这些指标的默认设置是针对二分类问题(average='binary')。在您的多类别分类情况下,您需要指定您感兴趣的特定指标的具体“版本”(有多个);请查看scikit-learn文档的相关页面,但您scoring参数的一些有效选项可能是:

'precision_macro''precision_micro''precision_weighted''recall_macro''recall_micro''recall_weighted'

上面的文档链接中甚至包含了使用'recall_macro'和鸢尾花数据的示例 – 请务必查看。

2) 如果我想在执行k折交叉验证时计算每个折的混淆矩阵、精确率和召回率,我应该输入哪些命令?

这并不完全是简单的,但您可以在我的回答中看到一种方法,关于scikit-learn中每个数据分割的交叉验证指标

3) 为了实验,我尝试了scoring='balanced_accuracy',结果发现:

   ValueError: 'balanced_accuracy' is not a valid scoring value.

这是因为您可能使用的是较旧版本的scikit-learn。balanced_accuracy在v0.20版本才可用 – 您可以验证它在v0.18中不可用。升级您的scikit-learn到v0.20,您应该没问题了。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注