文章目录
逻辑回归介绍
逻辑回归(Logistic Regression)虽然叫回归,其实是分类模型。逻辑回归用于解决二分类问题。
- 应用场景:
- 判断是否为垃圾邮件
- 是否患病
逻辑回归的原理:
-
输入:(线性回归的输出)
h ( w ) = w 1 x 1 + w 2 x 2 + w 3 x 3 … + b h(w)=w_{1} x_{1}+w_{2} x_{2}+w_{3} x_{3} \ldots+\mathrm{b} h(w)=w1x1+w2x2+w3x3…+b -
激活函数(sigmoid函数,用于将线性回归的输出映射到[0,1]上):
g ( w T , x ) = 1 1 + e − h ( w ) = 1 1 + e − w T x g\left(w^{T}, x\right)=\frac{1}{1+e^{-h(w)}}=\frac{1}{1+e^{-w^{T} x}} g(wT,x)=1+e−h(w)1=1+e−wTx1
流程:
- (1)样本特征值输入
- (2)经过线性回归计算(成为逻辑回归的输入)
- (3)利用激活函数(sigmoid函数)把整体的值映射到[0,1]上
逻辑回归的损失和优化:
-
损失:
cost ( h θ ( x ) , y ) = { − log ( h θ ( x ) ) if y = 1 − log ( 1 − h θ ( x ) ) if y = 0 \operatorname{cost}\left(h_{\theta}(x), y\right)=\left\{\begin{array}{ll} -\log \left(h_{\theta}(x)\right) & \text { if } \mathrm{y}=1 \\ -\log \left(1-h_{\theta}(x)\right) & \text { if } \mathrm{y}=0 \end{array}\right. cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x)) if y=1 if y=0- (1)对数似然损失;
- (2)无论啥时候,我们都希望损失函数数值越小越好;
- (3)当y=1时,我们希望h (x)值越⼤越好;
- (4)当y=0时,我们希望h (x)值越⼩越好;
-
优化:
- 提升原本属于1类别的概率,降低原本是0类别的概率
逻辑回归api介绍
- sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=‘l2’, C = 1.0)
- solver可选参数:{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’}:
- 默认: ‘liblinear’;⽤于优化问题的算法。
- 对于⼩数据集来说,“liblinear”是个不错的选择,⽽“sag”和’saga’对于⼤型数据集会更快
- 对于多类问题,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类
- penalty:正则化的种类
- C:正则化⼒度
- solver可选参数:{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’}:
LogisticRegression⽅法相当于 SGDClassifier(loss=“log”, penalty=" "),SGDClassifier实现了⼀个普通的随机梯度下降学习。⽽使⽤LogisticRegression(实现了SAG)
案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
基本步骤
- (1)获取数据
- (2)基本数据处理
- 2.1 缺失值处理
- 2.2 确定特征值,⽬标值
- 2.3 分割数据
- (3)特征⼯程(标准化)
- (4)机器学习(逻辑回归)
- (5)模型评估
代码实现
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
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 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()
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 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1000025 | 5 | 1 | 1 | 1 | 2 | 1 | 3 | 1 | 1 | 2 |
1 | 1002945 | 5 | 4 | 4 | 5 | 7 | 10 | 3 | 2 | 1 | 2 |
2 | 1015425 | 3 | 1 | 1 | 1 | 2 | 2 | 3 | 1 | 1 | 2 |
3 | 1016277 | 6 | 8 | 8 | 1 | 3 | 4 | 3 | 7 | 1 | 2 |
4 | 1017023 | 4 | 1 | 1 | 3 | 2 | 1 | 3 | 1 | 1 | 2 |
# 2.基本数据处理
# 2.1 缺失值处理
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=22)
# 3.特征⼯程(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.机器学习(逻辑回归)
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 5.模型评估
y_predict = estimator.predict(x_test)
y_predict
print("模型评估:",estimator.score(x_test, y_test))
模型评估: 0.9766081871345029
注意:
- 在很多分类场景当中我们不⼀定只关注预测的准确率,在很多分类场景当中我们不⼀定只关注预测的准确率。
- 如果数据中有缺失值,⼀定要对其进⾏处理
分类评估方法
除了准确率,还有以下的分类评估方法;
- 精确率和召回率
- roc曲线和auc指标
精确率(Precision)和召回率(Recall)
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适⽤于多分类)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgIiNmCu-1660046313392)(attachment:image.png)]
- 准确率(对不对):
- (TP+TN)/(TP+TN+FN+FP)
- 精确率(查的准不准):
- TP/(TP+FP)
- 召回率(查的全不全):
- TP/(TP+FN)
- F1-score(反映模型的稳健性):
F 1 = 2 T P 2 T P + F N + F P = 2 ⋅ 精准率 ⋅ 召回率 精准率 + 召回率 F 1=\frac{2 T P}{2 T P+F N+F P}=\frac{2 \cdot \text { 精准率 } \cdot \text { 召回率 }}{\text { 精准率 }+\text { 召回率 }} F1=2TP+FN+FP2TP= 精准率 + 召回率 2⋅ 精准率 ⋅ 召回率
分类评估报告api
- sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
- y_true:真实⽬标值
- y_pred:估计器预测⽬标值
- labels:指定类别对应的数字
- target_names:⽬标类别名称
- return:每个类别精确率与召回率
from sklearn.metrics import classification_report
ret = classification_report(y_test, y_predict, labels=(2,4), target_names=("良性", "恶性"))
print(ret)
precision recall f1-score support
良性 0.98 0.98 0.98 111
恶性 0.97 0.97 0.97 60
accuracy 0.98 171
macro avg 0.97 0.97 0.97 171
weighted avg 0.98 0.98 0.98 171
ROC曲线与AUC指标
AUC指标(ROC曲线的面积)
这个指标主要⽤于评价不平衡的⼆分类问题(例如训练样本中正例的比例远远大于反例)
- AUC的概率意义是随机取⼀对正负样本,正样本得分⼤于负样本得分的概率
- AUC的范围在[0, 1]之间,并且越接近1越好,越接近0.5属于乱猜
- AUC=1,完美分类器,采⽤这个预测模型时,不管设定什么阈值都能得出完美预测。绝⼤多数预测的场合,不存在完美分类器。
- 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
- 注意:
- AUC只能⽤来评价⼆分类
- AUC⾮常适合评价样本不平衡中的分类器性能
AUC计算API
- from sklearn.metrics import roc_auc_scor
- sklearn.metrics.roc_auc_score(y_true, y_score)
- 计算ROC曲线⾯积,即AUC值
- y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
- y_score:预测得分,可以是正类的估计概率、置信值或者分类器⽅法的返回值
from sklearn.metrics import roc_auc_score
# 0.5~1之间,越接近于1越好
#先将数据化为0和1
y_test = np.where(y_test > 2.5, 1, 0)
print("AUC指标:", roc_auc_score(y_test, y_predict))
AUC指标: 0.9743243243243243
ROC曲线
- TPR = TP / (TP + FN)
- 所有真实类别为1的样本中,预测类别为1的⽐例
- FPR = FP / (FP + TN)
- 所有真实类别为0的样本中,预测类别为1的⽐例
ROC曲线的横轴就是FPRate,纵轴就是TPRate,当⼆者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5(即纯属瞎猜)
其实AUC的意思是——Area Under roc Curve,就是ROC曲线的积分,也是ROC曲线下⾯的⾯积。
绘制ROC曲线的意义很明显,不断地把可能分错的情况扣除掉,从概率最⾼往下取的点,每有⼀个是负样本,就会导致分错排在它下⾯的所有正样本,所以要把它下⾯的正样本数扣除掉(1-TPR,剩下的正样本的⽐例)。总的ROC曲线绘制出来了,AUC就定了,分对的概率也能求出来了。
解决类别不平衡数据方法
关于类别不平衡的问题,主要有两种处理方式:
- 过采样方法:
- 增加数量较少那一类样本的数量,使得正负样本比例均衡。
- 欠采样方法:
- 减少数量较多那一类样本的数量,使得正负样本比例均衡。
参考
b站 黑马程序员 机器学习