Python自动探索性数据分析库入门第2期:Jupyter notebook演示:使用ROC曲线对比模型表现
在第1期中,我们安装了Anaconda并用它打开了Jupyter notebook和Jupyterlab。在第2期中,我们将使用Anaconda为我们准备好的Jupyter notebook对几个常用的分类模型对一组数据的预测表现进行比较。
ROC曲线
ROC 曲线(Receiver Operating Characteristic Curve,受试者工作特征曲线)是一种用于评估二分类模型性能的图形工具。它通过展示不同阈值下的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)的变化情况,帮助我们直观地了解模型的分类能力。
真阳性率 (TPR):
也称为敏感度(Sensitivity)或召回率(Recall)。 公式:TPR = TP / (TP + FN) 表示在所有实际为正例的样本中,被正确预测为正例的比例。
假阳性率 (FPR):
也称为1-特异度(1-Specificity)。 公式:FPR = FP / (FP + TN) 表示在所有实际为负例的样本中,被错误预测为正例的比例。
AUC (Area Under Curve):
ROC 曲线下面积。 AUC 值越接近 1,模型性能越好;AUC 值为 0.5 表示模型没有分类能力,相当于随机猜测。
模型简介
Logistic Regression
逻辑回归是一种用于二分类问题的统计方法,通过将线性回归的输出映射到概率空间(0到1之间)来进行分类。其基本思想是通过学习输入特征与输出标签之间的关系,来预测新样本属于某一类别的概率。
优点:
简单易懂,容易实现。 计算速度快,适合高维数据。 可以输出样本属于某一类别的概率。
缺点:
适用于线性可分的数据,对于非线性可分的数据效果较差。 对异常值敏感。
Naive Bayes
Naive Bayes是一类简单但非常有效的概率分类算法,基于贝叶斯定理(Bayes' Theorem)与“独立特征假设”(即假设特征之间是独立的)。尽管这个假设在实际应用中往往不成立,Naive Bayes 仍然表现出色,尤其在文本分类等任务中。
优点:
实现简单,计算效率高。 对小规模数据表现良好。 对高维数据具有良好的性能。
缺点:
特征独立性的假设在实际数据中往往不成立,影响分类效果。 对于特征之间有强相关性的情况效果较差。
Random Forest
Random Forest(随机森林)是一种集成学习算法,通过构建多个决策树并结合它们的结果来提高模型的预测性能和稳定性。它在分类和回归任务中表现出色,尤其在处理高维数据和防止过拟合方面具有显著优势。
优点:
在许多数据集上表现良好,鲁棒性强。 可以处理高维数据和缺失值。 有效防止过拟合。
缺点:
计算复杂度较高,训练和预测时间较长。 对于非常高维的稀疏数据,效果可能不如其他方法。
K-nearest-neighbour
K-Nearest Neighbors(KNN,K近邻)是一种简单且直观的非参数监督学习算法,用于分类和回归任务。KNN 基于特征空间中的相似性度量进行预测,核心思想是“相似的对象具有相似的结果”。KNN 通过在特征空间中找到距离最近的 K 个邻居来进行预测。对于分类任务,它采用多数投票法来决定数据点所属的类别;对于回归任务,它返回邻居的平均值作为预测结果。
优点:
简单易懂,无需训练过程。 适用于小数据集和多分类问题。
缺点:
计算复杂度高,对于大数据集效率低。 对噪声和异常值敏感。 不适合高维数据。
Support Vector Machine
支持向量机(Support Vector Machine,简称SVM)是一种用于分类和回归分析的监督学习模型及相关的学习算法。SVM在处理高维空间中的数据时表现出色,并且在分类边界明确的情况下效果尤为显著。
优点:
在高维空间中表现良好。 对于边界明确的分类问题效果较好。 可以处理非线性分类问题(使用核函数)。
缺点:
对于大数据集,训练时间较长。 对噪声和缺失数据较为敏感。 参数选择和核函数选择需要一定经验。
数据介绍
我们今天的演示将使用一组蘑菇辨别数据完成。数据集54036个样本,每个样本含有包括帽色,帽直径,季节等8个特征如下图所示。
使用jupyter notebook
让我们的打开Anaconda Navigator,在从菜单里打开jupyter notebook:
让我们创建我们的第一个项目:
代码讲解
导入环境
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import label_binarize
from sklearn.datasets import make_classification
from sklearn.metrics import roc_curve, auc, confusion_matrix, precision_score, recall_score, f1_score
数据组准备
data = pd.read_csv('/mushroom_cleaned.csv')
data = data.iloc[:12000, :]
X = data.drop('class', axis=1)
y = data['class']
# Split into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
pd.read_csv('/content/mushroom_cleaned.csv')
:从指定路径读取CSV文件。data.iloc[:12000, :]
:选择前12000行数据。data.drop('class', axis=1)
:删除标签列class,保留特征。data['class']
:提取标签列class。train_test_split(X, y, test_size=0.3, random_state=42)
:将数据集按70%训练集和30%测试集分割,random_state=42确保结果可重复。
搭建模型
models = {
"Logistic Regression": LogisticRegression(),
"Random Forest": RandomForestClassifier(),
"Naive Bayes": GaussianNB(),
"K-Nearest Neighbors": KNeighborsClassifier(),
"Support Vector Machine": SVC(probability=True)
}
定义一个字典,包含5种不同的分类模型。每个键是模型名称,每个值是对应的模型实例。
计算参数
# Fit the models and plot ROC curves
plt.figure(figsize=(10, 8))
for model_name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, lw=2, label=f'{model_name} (AUC = {roc_auc:.2f})')
# Calculate confusion matrix
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
# Calculate additional metrics
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
# Print the performance information
print(f'{model_name} Performance:')
print(f' True Positives: {tp}')
print(f' True Negatives: {tn}')
print(f' False Positives: {fp}')
print(f' False Negatives: {fn}')
print(f' Precision: {precision:.2f}')
print(f' Recall: {recall:.2f}')
print(f' F1 Score: {f1:.2f}')
print(f' AUC: {roc_auc:.2f}')
model.fit(X_train, y_train)
:使用训练数据训练模型。y_pred = model.predict(X_test)
:对测试数据进行预测。y_prob = model.predict_proba(X_test)[:, 1]
:预测每个样本为正类的概率。fpr, tpr, _ = roc_curve(y_test, y_prob)
:计算假阳性率(FPR)和真阳性率(TPR)。roc_auc = auc(fpr, tpr)
:计算AUC值。plt.plot(fpr, tpr, lw=2, label=f'{model_name} (AUC = {roc_auc:.2f})')
:绘制ROC曲线。tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
:计算混淆矩阵并展开为TN、FP、FN、TP。precision = precision_score(y_test, y_pred)
:计算精确率。recall = recall_score(y_test, y_pred)
:计算召回率。f1 = f1_score(y_test, y_pred)
:计算F1分数。输出模型的性能指标,包括真阳性、真阴性、假阳性、假阴性、精确率、召回率、F1分数和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()
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
:绘制对角线作为基线。plt.xlim([0.0, 1.0])
:设置x轴范围。plt.ylim([0.0, 1.05])
:设置y轴范围。plt.xlabel('False Positive Rate')
:设置x轴标签。plt.ylabel('True Positive Rate')
:设置y轴标签。plt.title('Receiver Operating Characteristic (ROC) Curve')
:设置图表标题。plt.legend(loc="lower right")
:设置图例位置。plt.show()
:显示图表。
本文作者:徐可
现在:
长按扫码关注:科研生信充电宝
10元赞赏本文,即喜欢作者~
即可直接解锁:
《Jupyter notebook演示:使用ROC曲线对比模型表现》对应资源哦~
看到这里你还不心动吗?
赶紧关注、转发、点赞、分享,领取你的专属福利吧~
好啦,以上就是今天推文的全部内容啦!
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。
如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。