逻辑回归算法

逻辑回归介绍

  逻辑回归(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+eh(w)1=1+ewTx1

流程:

  • (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(1hθ(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:正则化⼒度

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 numberClump ThicknessUniformity of Cell SizeUniformity of Cell ShapeMarginal AdhesionSingle Epithelial Cell SizeBare NucleiBland ChromatinNormal NucleoliMitosesClass
010000255111213112
1100294554457103212
210154253111223112
310162776881343712
410170234113213112
# 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站 黑马程序员 机器学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MATLAB中可以使用逻辑回归算法进行分类任务。下面是一个简单的逻辑回归算法代码示例: ```matlab % 准备训练数据 X = [1 1; 1 2; 2 1; 2 2; 3 3; 4 4]; % 特征矩阵 y = [0; 0; 0; 1; 1; 1]; % 标签向量 % 添加偏置项 X = [ones(size(X,1),1) X]; % 初始化参数 theta = zeros(size(X,2),1); % 定义逻辑回归假设函数 hypothesis = @(theta, x) sigmoid(x * theta); % 定义sigmoid函数 sigmoid = @(z) 1 ./ (1 + exp(-z)); % 定义代价函数 costFunction = @(theta, X, y) (-y' * log(hypothesis(theta, X)) - (1 - y') * log(1 - hypothesis(theta, X))) / size(X,1); % 定义梯度下降函数 gradientDescent = @(theta, X, y, alpha, num_iters) { for iter = 1:num_iters theta = theta - (alpha / size(X,1)) * X' * (hypothesis(theta, X) - y); end }; % 设置学习率和迭代次数 alpha = 0.01; num_iters = 1000; % 运行梯度下降算法 gradientDescent(theta, X, y, alpha, num_iters); % 输出训练后的参数 disp('训练后的参数:'); disp(theta); % 预测新样本 newX = [1 5; 2 3]; newX = [ones(size(newX,1),1) newX]; predictions = round(hypothesis(theta, newX)); % 输出预测结果 disp('预测结果:'); disp(predictions); ``` 这段代码实现了逻辑回归算法的训练和预测过程。首先,准备训练数据,其中`X`是特征矩阵,`y`是标签向量。然后,添加偏置项,并初始化参数。接下来,定义逻辑回归的假设函数、sigmoid函数、代价函数和梯度下降函数。然后,设置学习率和迭代次数,并运行梯度下降算法进行训练。最后,输出训练后的参数和预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈大愚

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值