这个错误提示 ValueError: Found input variables with inconsistent numbers of samples: [1672, 3900]
表示在计算性能指标时,真实的标签 y_train
和通过交叉验证预测得到的标签 cross_val_predictions
具有不一致的样本数量。
cross_val_predict
返回的预测结果是基于训练集的,而 precision_recall_fscore_support
需要与测试集的真实标签进行比较以计算性能指标。因此,我们应该使用测试集的真实标签来计算性能指标而不是训练集的标签。
要解决这个问题,你需要首先使用你之前分割出来的测试集 X_test
和 y_test
来进行模型测试,并计算性能指标。以下是修正后的代码:
# ... [省略了之前的代码]
# 初始化一个空字典来存储每个 k 的评分和其他性能指标
k_values = range(1, 31) # 从 k=1 到 k=30
metrics_scores = {
'accuracy': [],
'precision': [],
'recall': [],
'f1': []
}
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=5, scoring='accuracy')
metrics_scores['accuracy'].append(scores.mean())
# 对每个 k 值训练模型并使用测试集进行评估
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
# 计算并收集性能指标
precision, recall, f1, _ = precision_recall_fscore_support(y_test, y_pred, average='macro')
metrics_scores['precision'].append(precision)
metrics_scores['recall'].append(recall)
metrics_scores['f1'].append(f1)
# ... [省略了绘图部分的代码]
在这个修正中,我们对每个 k 值分别训练模型,并使用 predict
方法而非 cross_val_predict
来获取测试集上的预测结果。然后我们使用这些预测结果来计算性能指标。
如果你希望使用交叉验证来评估模型性能,并且能够可视化性能指标随 k 值变化的情况,那么你应该使用另一个变量来存储交叉验证的结果,但是请注意这些指标是针对训练数据的,并不反映模型在未知数据上的表现。在实际应用中,通常我们会保留一部分数据作为测试集,以评估模型在未见过的数据上的性能。
修改代码后,请重新运行以确保问题得到解决。如果还有疑问或需要进一步的帮助,请告诉我。