通过N折交叉验证及分类模型性能指标,选择最优的k值,并画出ROC曲线
时间: 2024-05-16 19:14:31 浏览: 83
分类器的ROC曲线
3星 · 编辑精心推荐
好的,这里是一份Python的代码示例,演示如何使用Scikit-learn库进行K折交叉验证和分类模型的性能评估,以及绘制ROC曲线。
```python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, auc
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 定义特征和标签
X = data.drop('label', axis=1)
y = data['label']
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 定义k值
k_values = range(1, 30)
# 用交叉验证来评估模型性能
cv_scores = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
cv_scores.append(scores.mean())
# 找到最优k值
optimal_k = k_values[cv_scores.index(max(cv_scores))]
print("最优的k值为:", optimal_k)
# 训练最优的KNN模型
knn = KNeighborsClassifier(n_neighbors=optimal_k)
knn.fit(X_train, y_train)
# 预测测试集结果
y_pred = knn.predict(X_test)
# 评估模型性能
print("准确率:", accuracy_score(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))
# 绘制ROC曲线
y_score = knn.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
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()
```
这份代码首先读取数据,并将其分为特征和标签。然后,将数据集划分为训练集和测试集,使用KNN算法进行分类模型训练和测试。使用10折交叉验证来评估不同k值的模型性能,选择性能最好的k值进行训练。最后,评估模型性能并绘制ROC曲线。
在使用这份代码时,需要将数据文件命名为"data.csv",并将其与代码文件放在同一目录下。
阅读全文