要建立KNN分类模型并绘制准确率、精确率、召回率和F1值随 k
变化的图,你需要先对不同的 k
值进行训练和评估,然后收集每个 k
值对应的性能指标。接着,你可以将它们可视化以确定最优的 k
值。以下是详细步骤:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer, precision_score, recall_score, f1_score
# 假设你已经有了处理过的文本数据特征X_train和标签y_train
# 设置要测试的k值范围
k_values = list(range(1, 31))
# 初始化字典来存储不同k值的性能指标
knn_scores = {
'accuracy': [],
'precision': [],
'recall': [],
'f1': []
}
for k in k_values:
# 创建KNN分类器实例
knn_clf = KNeighborsClassifier(n_neighbors=k)
# 计算准确率
accuracy = cross_val_score(knn_clf, X_train, y_train, cv=5, scoring='accuracy').mean()
# 计算精确率
precision = cross_val_score(knn_clf, X_train, y_train, cv=5, scoring=make_scorer(precision_score, average='macro')).mean()
# 计算召回率
recall = cross_val_score(knn_clf, X_train, y_train, cv=5, scoring=make_scorer(recall_score, average='macro')).mean()
# 计算F1值
f1 = cross_val_score(knn_clf, X_train, y_train, cv=5, scoring=make_scorer(f1_score, average='macro')).mean()
# 将结果存储在字典中
knn_scores['accuracy'].append(accuracy)
knn_scores['precision'].append(precision)
knn_scores['recall'].append(recall)
knn_scores['f1'].append(f1)
# 确定最优的k值(使用准确率作为示例)
optimal_k = k_values[np.argmax(knn_scores['accuracy'])]
# 绘制准确率、精确率、召回率和F1值随k值变化的图
import matplotlib.pyplot as plt
plt.figure(figsize=(14, 10))
for metric, values in knn_scores.items():
plt.plot(k_values, values, label=f'{metric} (Optimal k={optimal_k} when {metric} is maximized)')
plt.title('Performance Metrics of KNN vs. Number of Neighbors')
plt.xlabel('Number of Neighbors (k)')
plt.ylabel('Scores (Accuracy, Precision, Recall, F1)')
plt.legend()
plt.grid(True)
plt.show()
print(f"The optimal k value for KNN is {optimal_k} based on the highest accuracy.")
这段代码首先定义了一个 k
值的范围,并为每个 k
创建了一个KNN分类器实例。然后,它使用 cross_val_score
方法和不同的评分标准来计算每种性能指标的平均值。这些指标被存储在一个字典中,最后,代码通过绘制图表来展示这些性能指标随 k
值的变化,并基于准确率找出最优的 k
值。
请确保在运行此代码之前,你已经完成了数据导入、预处理、特征提取等步骤,并且成功划分了训练集。此外,根据你的具体需求和数据集的特性,你可能需要调整性能指标的计算方式,比如选择不同的 average
参数来适应你的多类分类问题。