逻辑回归

自然对数损失、精准率/召回率、ROC/AUC

Posted by 新宇 on February 20, 2020

一、概念

1. 定义

逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛。

2. 输入

3. 输出

二、损失及优化

1. 推导过程

注意:p1应该是w_T*x

2. API实现

三、分类评估方法

1. 精确率与召回率

1.1 混淆矩阵

1.2 精确率(Precision)与召回率(Recall)

  • 精确率:
    • 预测结果为正例样本中真实为正例的比例(查的准)
  • 召回率:
    • 真实为正例的样本中预测结果为正例的比例(查得全,对正样本的区分能力)
  • F1-score:
    • 精确率和召回率的调和平均数*2
    • 反映了模型的稳健型

1.3 API

  • sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None)
    • y_true:真实目标值
    • y_pred:估计器预测目标值
    • labels:指定类别对应的数字
    • target_names:目标类别名称
    • return:每个类别精确率与召回率

2. ROC曲线与AUC指标

用来衡量样本不均衡下的评估

2.1 TPR与FPR

  • TPR = TP / (TP + FN)
    • 所有真实类别为1的样本中,预测类别为1的比例
  • FPR = FP / (FP + TN)
    • 所有真实类别为0的样本中,预测类别为1的比例

2.2 ROC曲线

ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5

2.3 AUC指标

  • AUC即ROC曲线与横轴围成的面积;
  • AUC的概率意义是随机取一对正负样本,正样本预测为正的得分大于负样本预测为正的得分的概率;
  • AUC的范围在[0, 1]之间,并且越接近1越好,越接近0.5属于乱猜;
  • AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预- 测的场合,不存在完美分类器。
  • 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。

2.4 AUC计算API

  • from sklearn.metrics import roc_auc_score
    • sklearn.metrics.roc_auc_score(y_true, y_score)
      • 计算ROC曲线面积,即AUC值
      • y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
      • y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值

四、癌症预测案例

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import StandardScaler 
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report,roc_auc_score
# 1.获取数据

names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", 
    names=names
)
data.head()

# 2.数据预处理

## 2.1 删除none值

data = data.replace(to_replace='?', value=np.nan)
data = data.dropna()
## 2.2 提取特征和目标值

x = data.iloc[:,1:10]
y = data['Class']
## 2.3 切分数据

x_train,x_test,y_train,y_test = train_test_split(x, y, random_state=0)

# 3. 特征工程

## 3.1 特征标准化

transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4. 机器学习

## 4.1 训练

estimator = LogisticRegression()
estimator.fit(x_train, y_train)
## 4.2 预测&评估

y_pre = estimator.predict(x_test)
# print(y_pre)

sco = estimator.score(x_test, y_test)
print('算法准确率:', sco)

# 5. 精准率precision、召回率recall

## 精准率precision:查的准不准

## 召回率recall:差的全不全

report = classification_report(y_test, y_pre, labels=(2,4), target_names=('良性','恶性'))
print(report)

# 6. roc,auc,用来评价不均衡的二分类问题

y_test = np.where(y_test>2, 1, 0)
auc = roc_auc_score(y_test, y_pre)
print('auc指标:', auc)