逻辑回归阈值_LR (Logistic Regression) 逻辑回归

LR是一种机器学习中的一种分类模型,算法简单高效,在实际中应用非常广泛,本文会从以下几个方面进行介绍

  • LR算法的数学模型
  • 参数求解方法
  • tensorflow实现
  • 逻辑回归与贝叶斯分类的关系

逻辑回归

分类问题

实际工作中,经常会遇到一些问题,如某句话是正面情绪还是负面情绪,一个邮件是垃圾邮件还是非垃圾游戏,一个用户是男是女等,这些问题都可以看作是分类问题,更准确的说是而分类问题。要解决这些问题,通常会用到一些分类算法,如SVM、LR等,他们都属于有监督学习(在进行训练前必须收集一批标注好的数据),数据可以转换为一组数值表示,我们称为该数据的特征。特征集x和lable集y构成训练数据

4c0d5c2e0612544311958317d9dfbf97.png

其中是x(i) 一个m维向量

7277374ec7d2e53c0644524518a292c5.png

y 二分类时取值为{0 , 1}

分类问题可以简化为,如何找到一个函数 y *= f(x) ,使它能最好的拟合当前的训练集,并在未知数据集上表现足够好。那么如何评价该函数是否足够好?由此需要引入loss 函数,对于分类问题,我们可以用分类错误率(当然也可以使用准确率、召回率、auc等指标)

91264b81d0cb4d9df5fe22fb0582acba.png

通常模型效果往往与所用特征密切相关,LR的效果极其以来与特征工程的质量

数学模型

sigmoid

介绍模型前,我们先了解下sigmoid函数, sigmoid函数是一个取值在[0, 1]之间的函数,其在远离的0的地方会很快接近0和1, 并且其具有很好的单调性,这些性质能够方便我们将预测结果映射为概率。 sigmoid函数:

逻辑回归阈值_LR (Logistic Regression) 逻辑回归_第1张图片

其函数图像为:

逻辑回归阈值_LR (Logistic Regression) 逻辑回归_第2张图片

决策函数

机器学习模型实际上是把角色函数限定在某一条件下,这组条件决定了模型的映射空间。LR的模型假设为:

259518a619070ce998ba6c8b8ae4ef73.png

这里的g(x) 即为sigmoid。 该模型可以描述为,在该假设下寻找一组参数θ,使得训练集上的正样本被识别的概率P最大。对应的决策函数为:

90f291f6f2d701c2007c8cf28ffd39a6.png

此处0.5作为阈值知识一般的方法,实际使用可以选择不同的阈值。

参数求解

模型的数学形式确定后,剩下的就是求模型中的参数θ,统计学中最常用的方法是最大似然估计(尚不清楚的同学请自行查阅)。即寻找一组参数,使得数据的似然度最大。在LR模型中,似然度为:

f81a2bc03668b58ad8ce8abd9272704e.png

为了便于计算,将L(θ) 转化为对数似然度 ln(L(θ)), 此时对数似然度为:

b5b0c4ec7d9c45657cc407284434b8fe.png

计算机要求得最大的一组参数,需要给模型设计Loss函数,使得其能最快收敛到一组参数使得loss最小(L(θ)最大)。常用的损失函数有0-1损失, log损失, hinge损失等

分类边界

LR本质上是一个线性模型,在二维空间中为一条直线,在三维空间中为一个平面,在高维空间中是一个超平面。LR不止能解决线性可分的数据集,我们可以通过特征变换的方式,将低维空间转换到高维空间,在低维空间中不可分的数据在高维空间中可能的几率会更高

Tensorflow实现

线性回归

import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow import losses
from tensorflow.keras import optimizers
from tensorflow import initializers as init
from tensorflow import data as tfdata

# 生成模拟数据
num_samples = 1000
num_dim = 2

# 真实参数
w_real = [2, -3.4]
b_real = 4.2

# 生成特征数据,符合正态分布,且增加噪声数据
features = tf.random.normal((num_samples, num_dim), stddev=1)
lables = features[:, 0]*w_real[0] + features[:, 1]*w_real[1] + b_real
lables += tf.random.normal(lables.shape, stddev=0.01)

# 设置网络结构,只使用一层全链接层,随机初始化模型参数
model = keras.Sequential()
model.add(layers.Dense(1, kernel_initializer=init.RandomNormal(stddev=0.01)))

# loss函数使用 MSE
loss = losses.MeanSquaredError()

# 优化器使用梯度下降 SGD
trainer = optimizers.SGD(learning_rate=0.03)

# 设置数据集和batch_size
batch_size = 20
dataset = tfdata.Dataset.from_tensor_slices((features, lables))
dataset = dataset.shuffle(len(features)).batch(batch_size)

# 设置迭代次数
num_epoch = 3

for epoch in range(1, num_epoch+1):
    # 取最小batch进行计算
    for (batch, (X, y)) in enumerate(dataset):
        with tf.GradientTape() as tape:
            # 计算loss
            l = loss(model(X, training=True), y)
        # 计算梯度并更新参数
        grads = tape.gradient(l, model.trainable_variables)
        trainer.apply_gradients(zip(grads, model.trainable_variables))
    
    # 一轮迭代后的总loss
    l = loss(model(features), lables)
    print("epoch: %d t loss: %f" %(epoch, l.numpy().mean()))

# 输出模型参数
print

逻辑回归模型

逻辑回归只需在最后的输出层增加一个sigmod层即可,对于多分类则需要增加一个softmax

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4,input_shape(3,),activation='relu'))
model.add(tf).keras.layers.Dense(1, activation='sigmod')

你可能感兴趣的:(逻辑回归阈值)