sklearn.metrics.roc_curve解析

官方网址:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics

首先认识单词:metrics:  ['mɛtrɪks] : 度量‘指标

                        curve : [kɝv]  :  曲线

这个方法主要用来计算ROC曲线面积的;

sklearn.metrics.roc_curve(y_truey_scorepos_label=Nonesample_weight=Nonedrop_intermediate=True)

Parameters

y_true : 数组,shape = [样本数]           

在范围{0,1}或{-1,1}中真正的二进制标签。如果标签不是二进制的,则应该显式地给出pos_label

y_score : 数组, shape = [样本数]            

目标得分,可以是积极类的概率估计,信心值,或者是决定的非阈值度量(在某些分类器上由“decision_function”返回)。

pos_label:int or str, 标签被认为是积极的,其他的被认为是消极的。

sample_weight: 顾名思义,样本的权重,可选择的

drop_intermediate:  boolean, optional (default=True)                

 是否放弃一些不出现在绘制的ROC曲线上的次优阈值。这有助于创建更轻的ROC曲线

Returns : 

fpr : array, shape = [>2]                增加假阳性率,例如,i是预测的假阳性率,得分>=临界值[i]

tpr : array, shape = [>2]                增加真阳性率,例如,i是预测的真阳性率,得分>=临界值[i]。  

thresholds : array, shape = [n_thresholds]            

减少了用于计算fpr和tpr的决策函数的阈值。阈值[0]表示没有被预测的实例,并且被任意设置为max(y_score) + 1

要弄明白ROC的概念可以参考 :https://www.deeplearn.me/1522.html

 

介绍ROC曲线的两个重要指标:

真阳性率 = true positive rate = TPR = TP/ (TP + FN)

可以这样理解:真阳性率就是在标准的阳性(标准的阳性就等于真阳性加假阴性=TP + FN)中,同时被检测为阳性的概率,有点绕,自行理解。

假阳性率 = false positive rate = FPR = FP / (FP+TN)

可以这样理解:假阳性就是在标准的阴性(标准的阴性就等于假阳性真阴性=FP + TN)中,被检测为阳性的概率。很好理解的,本来是阴性,检测成了阳性的概率就是假阳性率呗。

 

ROC曲线就由这两个值绘制而成。接下来进入sklearn.metrics.roc_curve实战,找遍了网络也没找到像我一样解释这么清楚的。

import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

y 就是标准值,scores 是每个预测值对应的阳性概率,比如0.1就是指第一个数预测为阳性的概率为0.1,很显然,y 和 socres应该有相同多的元素,都等于样本数。pos_label=2 是指在y中标签为2的是标准阳性标签,其余值是阴性。

所以在标准值y中,阳性有2个,后两个;阴性有2个,前两个。

接下来选取一个阈值计算TPR/FPR,阈值的选取规则是在scores值中从大到小的以此选取,于是第一个选取的阈值是0.8

scores中大于阈值的就是预测为阳性,小于的预测为阴性。所以预测的值设为y_=(0,0,0,1),0代表预测为阴性,1代表预测为阳性。可以看出,真阴性都被预测为阴性,真阳性有一个预测为假阴性了。

FPR = FP / (FP+TN) = 0 / 0 + 2 = 0

TPR = TP/ (TP + FN) = 1 / 1 + 1 = 0.5

thresholds = 0.8

我们验证一下结果

print(fpr[0],tpr[0],thresholds[0])

 

同代码结果一致,其余的就不演示了,剩下的阈值一次等于 0.4  0.35  0.1  自行验证。

 

最后结果等于

print(fpr,'\n',tpr,'\n',thresholds)

 

全部代码

 

import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
print(fpr,'\n',tpr,'\n',thresholds)

坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起成长进步~

 

``` import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.feature_selection import SelectKBest, f_classif from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report, roc_curve, auc, confusion_matrix import statsmodels.api as sm from sklearn.metrics import precision_score, roc_curve plt.style.use('ggplot') # 读取数据 file_path = r'C:\Users\29930\Desktop\插补数据.csv' data = pd.read_csv(file_path,encoding='GBK') data['性别'] = data['性别'].map({'男': 0, '女': 1}) # 编码性别列 arr = data.to_numpy() # 转换为NumPy数组 # 查看前几行数据 print(data.head()) # 检查是否有缺失值 print(data.isnull().sum()) # 填充缺失值(如果有的话) data.ffill(inplace=True) # 分离特征和目标变量 X = data.drop(columns=['慢阻肺']) # 假设第一列为COPD标签 y = data['慢阻肺'] # 标准化数值型特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 将标准化后的数据转回DataFrame格式以便后续操作 X_scaled_df = pd.DataFrame(X_scaled, columns=X.columns) # 使用SelectKBest进行单变量选择 selector = SelectKBest(score_func=f_classif, k='all') # 先全部选出来查看得分情况 fit = selector.fit(X_scaled_df, y) # 打印每个特征的重要性评分 feature_scores = pd.DataFrame(list(zip(X_scaled_df.columns, fit.scores_)), columns=['Feature','Score']) feature_scores.sort_values(by='Score', ascending=False, inplace=True) print(feature_scores) # 绘制特征重要性图 plt.figure(figsize=(10, 6)) sns.barplot(x="Score", y="Feature", data=feature_scores) plt.title('Feature Importance Scores') plt.show() # 选择最重要的几个特征 selected_features = feature_scores[feature_scores.Score >= feature_scores.Score.quantile(0.75)].Feature.tolist() # 选取前75%分位数以上的特征 X_selected = X_scaled_df[selected_features] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42) # 定义逻辑回归模型 logreg = LogisticRegression(solver='liblinear') # 超参数调优 - 这里我们只对正则化强度C做网格搜索 param_grid = {'C': [0.01, 0.1, 1, 10, 100]} grid_search = GridSearchCV(logreg, param_grid, cv=5, scoring='accuracy') grid_search.fit(X_train, y_train) # 输出最佳参数组合及对应的成绩 best_logreg = grid_search.best_estimator_ print("Best parameters:", grid_search.best_params_) print("Best CV Score:", grid_search.best_score_) # 在测试集上应用最优模型 y_pred = best_logreg.predict(X_test) # 计算性能指标 acc = accuracy_score(y_test, y_pred) report = classification_report(y_test, y_pred) conf_mat = confusion_matrix(y_test, y_pred) print(f"Accuracy: {acc:.4f}") print(report) # 绘制混淆矩阵热力图 plt.figure(figsize=(8, 6)) sns.heatmap(conf_mat, annot=True, fmt='d', cmap='Blues') plt.xlabel('Predicted Label') plt.ylabel('True Label') plt.title('Confusion Matrix Heatmap') plt.show() # ROC曲线 fpr, tpr, _ = roc_curve(y_test, best_logreg.decision_function(X_test)) roc_auc = auc(fpr, tpr) plt.figure(figsize=(8, 6)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC Curve (area = {roc_auc:.2f})') 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() # 添加常数项 X_const = sm.add_constant(X_selected) # 构建OLS线性回归模型(用于展示线性关系) model = sm.Logit(y, X_const).fit() print(model.summary()) # 获取最终模型方程 coefs = list(best_logreg.coef_[0]) + [best_logreg.intercept_[0]] features_with_intercept = ['const'] + selected_features formula_parts = [] for coef, feat in zip(coefs, features_with_intercept): formula_parts.append(f"{coef:+.4f}*{feat}") final_formula = " + ".join(formula_parts) print("\nFinal Early Screening Formula:") print(final_formula.replace('+', ' + ').replace('-', ' - '))```输出的重要特征图像中的变量标签不能显示中文
最新发布
03-28
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tina姐

我就看看有没有会打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值