import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_predict
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, precision_recall_curve, confusion_matrix
# 生成模拟的二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化逻辑回归模型
model = LogisticRegression()
# 使用交叉验证进行预测
y_pred_cv = cross_val_predict(model, X_train, y_train, cv=5)
# 计算评估指标
accuracy_cv = accuracy_score(y_train, y_pred_cv)
precision_cv = precision_score(y_train, y_pred_cv)
recall_cv = recall_score(y_train, y_pred_cv)
f1_cv = f1_score(y_train, y_pred_cv)
print("Cross-Validated Accuracy:", accuracy_cv)
print("Cross-Validated Precision:", precision_cv)
print("Cross-Validated Recall:", recall_cv)
print("Cross-Validated F1 Score:", f1_cv)
# 训练模型
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print("\nTest Set Accuracy:", accuracy)
print("Test Set Precision:", precision)
print("Test Set Recall:", recall)
print("Test Set F1 Score:", f1)
# 计算 ROC 曲线
y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
# 计算 PR 曲线
precision, recall, _ = precision_recall_curve(y_test, y_prob)
# 绘制 ROC 曲线
plt.figure(figsize=(8, 6))
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 (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
# 绘制 PR 曲线
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, color='blue', lw=2, label='Precision-Recall curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")
plt.show()
# 计算并绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Blues")
plt.title("Confusion Matrix")
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()
以上实验要求可以分为三个主要部分:
-
分类模型评估指标的掌握:
- 了解常见的分类模型评估指标,例如准确率、精确率、召回率、F1值等。
- 理解这些指标的含义以及如何计算它们,例如准确率为正确分类的样本数与总样本数的比率,精确率为真正例与所有预测为正例的样本数的比率等。
-
ROC曲线和PR曲线的理解:
- 了解ROC曲线(Receiver Operating Characteristic Curve)和PR曲线(Precision-Recall Curve)的概念和用途。
- 知道ROC曲线以真正例率(True Positive Rate,TPR)为纵轴,假正例率(False Positive Rate,FPR)为横轴绘制,而PR曲线以精确率(Precision)为纵轴,召回率(Recall)为横轴绘制。
- 理解ROC曲线和PR曲线之间的差异,以及在不同场景下的适用性。
-
绘制不同k值下的ROC曲线并分析:
- 使用不同的k值,例如交叉验证中的不同折数,来训练模型并得到预测结果。
- 绘制不同k值下的ROC曲线,可能是为了比较不同模型在不同数据子集上的性能。
- 对绘制的ROC曲线进行分析,可能包括比较不同模型的性能、评估模型的稳定性等方面的内容。