我有一个项目,需要在csv文件中使用kNN算法并展示选定的指标。但当我尝试展示一些指标时,出现了几个错误。
当尝试使用以下指标时:
- 敏感度 – print(metrics.recall_score(y_test, y_pred_class))
- F1分数 – print(metrics.f1_score(y_test, y_pred_class))
- 精确度 – print(metrics.precision_score(y_test, y_pred_class))
Pycharm抛出了以下错误:
ValueError: Target is multiclass but average=’binary’. Please choose another average setting
尝试打印ROC曲线时,错误略有不同:
ValueError: multiclass format is not supported
数据集
数据集链接: https://www.dropbox.com/s/yt3n1eqxlsb816n/Testfile%20-%20kNN.csv?dl=0
程序
import matplotlibimport pandas as pdimport numpy as npimport mathimport matplotlib.pyplot as pltfrom matplotlib.dviread import Textfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.neighbors import KNeighborsClassifier#测试工具from sklearn import metricsfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import f1_scorefrom sklearn.metrics import accuracy_scoredef main(): dataset = pd.read_csv('filetestKNN.csv') X = dataset.drop(columns=['Label']) y = dataset['Label'].values X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.34) Classifier = KNeighborsClassifier(n_neighbors=2, p=2, metric='euclidean') Classifier.fit(X_train, y_train) y_pred_class = Classifier.predict(X_test) y_pred_prob = Classifier.predict_proba(X_test)[:, 1] accuracy = Classifier.score(X_test, y_test) confusion = metrics.confusion_matrix(y_test, y_pred_class) print() print("准确率") print(metrics.accuracy_score(y_test, y_pred_class)) print() print("分类错误率") print(1 - metrics.accuracy_score(y_test, y_pred_class)) print() print("混淆矩阵") print(metrics.confusion_matrix(y_test, y_pred_class)) #错误 print(metrics.recall_score(y_test, y_pred_class)) #错误 print(metrics.roc_curve(y_test, y_pred_class)) #错误 print(metrics.f1_score(y_test, y_pred_class)) #错误 print(metrics.precision_score(y_test, y_pred_class))
我只是想在屏幕上显示算法的指标。
回答:
您需要为这些sklearn.metrics
函数设置average
关键字参数。例如,请查看f1_score
的文档。以下是关于average
关键字参数的部分内容:
average : string, [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]
对于多类/多标签目标,此参数是必需的。如果为None,则返回每个类的分数。否则,这决定了对数据执行的平均类型:
'binary': 仅报告由pos_label指定的类的结果。这仅适用于目标(y_{true,pred})为二元的情况。'micro': 通过计算总的真阳性、假阴性和假阳性来全局计算指标。'macro': 为每个标签计算指标,并找到它们的非加权平均值。这不考虑标签不平衡。'weighted': 为每个标签计算指标,并找到它们的平均值,按支持(每个标签的真实实例数)加权。这会调整'macro'以考虑标签不平衡;它可能导致F分数不在精确度和召回率之间。'samples': 为每个实例计算指标,并找到它们的平均值(仅在多标签分类中与accuracy_score不同时有意义)。
我们可以看到,这描述了如何在您的多类任务中对不同标签的结果进行聚合。我不确定您想使用哪一个,但micro
看起来不错。以下是您对f1_score
的调用在选择此选项时的样子:
print(metrics.f1_score(y_test, y_pred_class, average='micro'))
您可以类似地调整其他指标。希望这对您有帮助。