作为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中precision
和recall
仅定义为二分类问题 – 这是正确的吗?如果是,那么应该用哪些命令替换上面的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中
precision
和recall
仅定义为二分类问题 – 这是正确的吗?
不是。精确率和召回率当然也适用于多类别问题 – 请查看precision
和recall
的文档。
如果是,那么应该用哪些命令替换上面的
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,您应该没问题了。