用python语言编程,基于鸢尾花数据集,计算并绘制 LR 及 SVM 模型的 P-R 曲线及 ROC 曲线
时间: 2025-03-13 07:15:14 浏览: 52
### 训练LR和SVM模型并绘制P-R曲线与ROC曲线
对于鸢尾花数据集,可以采用逻辑回归(Logistic Regression, LR)和支持向量机(Support Vector Machine, SVM)两种方法来构建二分类器,并通过`scikit-learn`库实现模型训练。为了评估这些模型的表现,可以通过计算预测概率并使用`matplotlib`和`sklearn.metrics`模块下的函数来绘制Precision-Recall(P-R)曲线和接收者操作特性(ROC)曲线。
#### 数据预处理
由于原始的鸢尾花数据集中有三个类别,在此仅选取两个类别的样本作为正负样本来进行二分类任务。此外,还需要标准化特征值以便更好地适应某些类型的机器学习算法的要求[^2]。
```python
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[(iris.target == 0) | (iris.target == 1)] # 只取前两类
y = iris.target[(iris.target == 0) | (iris.target == 1)]
# 特征缩放
scaler = StandardScaler().fit(X)
X_scaled = scaler.transform(X)
# 划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.3, random_state=42, stratify=y)
```
#### 构建LR和SVM模型
接下来创建逻辑回归和支持向量机实例,并调用`.fit()`方法完成模型拟合过程;之后再利用`.predict_proba()`获取各条记录属于某一特定类别的可能性分数,这一步骤对于后续绘图至关重要[^4]。
```python
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
lr_clf = LogisticRegression(random_state=42).fit(X_train, y_train)
svm_clf = SVC(probability=True, kernel='linear', C=1e5, random_state=42).fit(X_train, y_train)
probas_lr = lr_clf.predict_proba(X_test)
probas_svm = svm_clf.predict_proba(X_test)
```
#### 绘制P-R曲线
根据得到的概率估计值,借助于`precision_recall_curve`工具函数可方便地获得精确率(precision)-召回率(recall)之间的关系变化情况,并最终形成直观可视化的图形表示形式。
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, auc
def plot_pr_curve(y_true, probas_pred, model_name):
precisions, recalls, _ = precision_recall_curve(y_true, probas_pred[:, 1])
pr_auc = auc(recalls, precisions)
plt.figure(figsize=(8,6))
plt.plot(recalls, precisions, label=f'{model_name} PR curve (area={pr_auc:.2f})')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f'Precision-Recall Curve ({model_name})')
plt.legend(loc="best")
plt.show()
plot_pr_curve(y_test, probas_lr, 'Logistic Regression')
plot_pr_curve(y_test, probas_svm, 'SVM')
```
#### 绘制ROC曲线
同样地,也可以应用类似的思路去展示真正例率(TPR)随假正例率(FPR)增长的趋势,即所谓的ROC曲线。这里会额外引入一个参数——曲线下面积(Area Under the Curve,AUC),它用来衡量整个分类系统的整体性能优劣程度[^3]。
```python
from sklearn.metrics import roc_curve, RocCurveDisplay
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
for clf, name in zip([lr_clf, svm_clf], ['Logistic Regression', 'SVM']):
RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax[0], name=name)
ax[0].set_title("Receiver Operating Characteristic Curves")
plt.tight_layout()
plt.show()
```
上述代码展示了如何基于Python环境中的`scikit-learn`框架快速搭建起针对鸢尾花数据集上执行二元分类任务所需的全部流程,包括但不限于数据准备、模型建立、评价指标可视化等方面的工作内容。
阅读全文
相关推荐









