解决ValueError: y should be a 1d array, got an array of shape (30, 3) instead. - Python Scikit-learn ROC Curve 错误
出现该错误是因为 y_prob 的维度不正确。在 SVC 模型中,decision_function 返回的结果 y_prob 是一个二维数组,每一列对应一个类别的决策函数值。而 roc_curve 函数要求 y_prob 是一个一维数组,表示正例的得分。
要解决这个问题,可以使用 decision_function 方法来获取每个类别的决策函数值,然后取正例的得分作为 y_prob。
修改后的代码如下:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, recall_score, precision_score, roc_curve, roc_auc_score
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
# 打印特征名
print('特征名:', iris.feature_names)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 创建SVC模型并进行训练
model = SVC(probability=True)
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率、召回率、精确率
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred, average='weighted')
precision = precision_score(y_test, y_pred, average='weighted')
print('准确率:', accuracy)
print('召回率:', recall)
print('精确率:', precision)
# 计算ROC曲线和AUC值
y_prob = model.decision_function(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_prob[:, 2], pos_label=2)
roc_auc = roc_auc_score(y_test, y_prob[:, 2])
print('AUC值:', roc_auc)
# 绘制ROC曲线
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc='lower right')
plt.show()
修改后的代码将使用 decision_function 方法获取每个类别的决策函数值,并将正例的得分作为 y_prob,以满足 roc_curve 函数的要求。然后计算准确率、召回率、精确率、AUC值,并绘制 ROC 曲线。
原文地址: https://www.cveoy.top/t/topic/63b 著作权归作者所有。请勿转载和采集!