from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_score, *, average='macro', sample_weight=None,
max_fpr=None, multi_class='raise', labels=None)
计算曲线ROC的面积
- Parameters(参数)
y_true : array-like of shape (n_samples,) or (n_samples, n_classes)
真实数据
二分类和多分类需要带有shape (n_samples)的标签,而多标签情况需要带有shape (n_samples, n_classes)
的二进制标签。
y_score : array-like of shape (n_samples,) or (n_samples, n_classes)
预测结果数据
1.在二分类的情况下,它对应于形状数组(n_samples,),可以提供概率估计和非阈值决策值
概率估计值对应于具有更大标签的类别的概率,即estimator.classes_ [1],
因此是estimator.predict_proba(X,y)[:, 1]。
决策值对应于estimator.decision_function(X,y)的输出。
2.在多分类情况下,它对应于由predict_proba方法提供的概率估计的形状数组(n_samples,n_classes)
每个sample概率估计值为1;此外,每一个sample的概率估计值的顺序必须与y_true中标签的顺序相对应。
3.在多标签情况下,它对应于一个形状数组(n_samples,n_classes)。
概率估计由predict_proba方法提供,非阈值决策值由decision_function方法提供。
average : {‘micro’, ‘macro’, ‘samples’, ‘weighted’} or None, default=’macro’
当y_true是二进制时,这个参数将被忽略
'macro':简单地计算 binary metrics (二分指标)的平均值,赋予每个类别相同的权重
'micro':给每个 sample-class pair (样本类对)对 overall metric (总体指数)
(sample-class 权重的结果除外) 等同的贡献。除了对每个类别的 metric 进行求和之外,这
个总和构成每个类别度量的 dividends (除数)和 divisors (除数)计算一个整体商。 在
multilabel settings (多标签设置)中,Micro-averaging 可能是优先选择的,包括要忽略
majority class (多数类)的 multiclass classification (多类分类)
'weighted': 通过计算其在真实数据样本中的存在来对每个类的 score 进行加权的 binary metrics (二分指标)
的平均值来计算类不平衡。
'samples':仅适用于多标签问题。它不计算每个类别的 measure,而是计算评估数据中的每个样本
的真实和预测类别的 metric (指标),并返回 (sample_weight-weighted) 加权平均。
sample_weight :array-like of shape (n_samples,), default=None
样品权重
sample_weight : array-like of shape (n_samples,), default=None
如果不为None,则返回范围为[0,max_fpr]的标准化部分AUC
对于多分类情况,max_fpr应该等于None或1.0
multi_class:{‘raise’, ‘ovr’, ‘ovo’}, default=’raise’
仅用于多分类,默认值会引发错误,因此必须显式传递'ovr'或'ovo'
'ovr':一对多
'ovo':一对一
这两个概念想了解的参考为2.逻辑回归部分
labels : array-like of shape (n_classes,), default=None
仅用于多分类,标签列表索引了y_score中的类,如果为None,则使用y_true中标签的数字或字典顺序
- 返回
AUC值
二分类情况
>>> from sklearn.datasets import load_breast_cancer
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.metrics import roc_auc_score
>>> X, y = load_breast_cancer(return_X_y=True)
>>> clf = LogisticRegression(solver="liblinear", random_state=0).fit(X, y)
>>> roc_auc_score(y, clf.predict_proba(X)[:, 1])
0.99...
>>> roc_auc_score(y, clf.decision_function(X))
0.99...
多分类情况
>>> from sklearn.datasets import load_iris
>>> X, y = load_iris(return_X_y=True)
>>> clf = LogisticRegression(solver="liblinear").fit(X, y)
>>> roc_auc_score(y, clf.predict_proba(X), multi_class='ovr')
0.99...
多标签情况
>>> from sklearn.datasets import make_multilabel_classification
>>> from sklearn.multioutput import MultiOutputClassifier
>>> X, y = make_multilabel_classification(random_state=0)
>>> clf = MultiOutputClassifier(clf).fit(X, y)
>>> # get a list of n_output containing probability arrays of shape
>>> # (n_samples, n_classes)
>>> y_pred = clf.predict_proba(X)
>>> # extract the positive columns for each output
>>> y_pred = np.transpose([pred[:, 1] for pred in y_pred])
>>> roc_auc_score(y, y_pred, average=None)
array([0.82..., 0.86..., 0.94..., 0.85... , 0.94...])
>>> from sklearn.linear_model import RidgeClassifierCV
>>> clf = RidgeClassifierCV().fit(X, y)
>>> roc_auc_score(y, clf.decision_function(X), average=None)
array([0.81..., 0.84... , 0.93..., 0.87..., 0.94...])
import numpy as np
# 模型评估
from sklearn import metrics
if __name__ == '__main__':
y = np.array([0, 0, 1, 1])
y_pred = np.array([0.1, 0.5, 0.3, 0.8])
# 返回三个数组结果分别是fpr(假正率),tpr(召回率),threshold(阈值)
# 参数为真实结果数据、预测结果数据(可以是标签数据也可以是概率值)
fpr, tpr, threshold = metrics.roc_curve(y, y_pred)
# 计算AUC的值
auc = metrics.auc(fpr, tpr)
print(auc)
print(metrics.roc_auc_score(y, y_pred))
0.75
0.75
当碰到多分类情况时,可以使用one-hot编码,在进行ravel()展平操作,来使用
auc = roc_auc_score(y_one_hot.ravel(), y_score.ravel())
如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!