逻辑回归 算法推导与基于Python的实现详解

1 逻辑回归概述

image.png

逻辑回归(Logistic Regression)是一种用于分类问题的统计学习方法。它基于线性回归的原理,通过将线性函数的输出值映射到[0,1]区间上的概率值,从而进行分类。

逻辑回归的输入是一组特征变量,它通过计算每个特征与对应系数的乘积,加上截距项得到线性函数,然后将该函数的输出值经过sigmoid函数的映射,得到概率值。

逻辑回归常用于二分类问题,即将样本分为两类,如判断一封邮件是否为垃圾邮件。逻辑回归还可以扩展到多分类问题,如将样本分为三类或更多类别。

逻辑回归具有简单、高效、易于理解等优点,在实际应用中被广泛使用,如金融风控、医学诊断、推荐系统等领域。

2 逻辑回归公式推导与求解

2.1 公式推导

P

(

y

=

1

x

)

=

1

1

+

e

(

β

0

+

β

1

x

1

+

β

2

x

2

+

.

.

.

+

β

p

x

p

)

P(y=1|x) = frac{1}{1+e^{-(beta_0+beta_1x_1+beta_2x_2+...+beta_px_p)}}

P(y=1∣x)=1+e(β0+β1x1+β2x2+...+βpxp)1
逻辑回归的公式大家可能很熟悉,但并不知道推导过程,事实上这一推导过程也十分简单。

给定输入特征

x

mathbf{x}

x,逻辑回归模型的输出

y

y

y 可以表示为:

y

=

P

(

y

=

1

x

)

=

σ

(

w

T

x

)

y = P(y=1|mathbf{x}) = sigma(mathbf{w}^T mathbf{x})

y=P(y=1∣x)=σ(wTx)

其中,

σ

(

z

)

sigma(z)

σ(z) 表示 sigmoid 函数,定义为:

σ

(

z

)

=

1

/

(

1

+

e

z

)

sigma(z) = 1 / (1 + e^{-z})

σ(z)=1/(1+ez)。这一函数在之后的深度学习中也会经常用到。

至于什么使用sigmoid函数,原因也很简单,很多教材都把这个重要的思考环节忽略了,博主在此进行补充。
我们希望找到一个函数的值域在[0,1]的函数,但是这种函数并不容易找到,线性回归使用的公式

y

=

θ

x

y=theta x

y=θx的值域是(-∞,+∞)。因此,我们引入了odds(几率)的概念。

o

d

d

s

=

P

1

P

odds=frac{P}{1-P}

odds=1PPodds的取值为(0,+∞),而对于log函数,其定义域刚好为(0,+∞),值域为(-∞,+∞)。因此,我们便可以构造一个函数

log

(

P

1

P

)

=

θ

x

log(frac{P}{1-P})=theta x

log(1PP)=θx对P进行求解,即得到了逻辑回归的基本形式

P

=

1

1

+

e

x

P=frac{1}{1+e^{-x}}

P=1+ex1也就是我们所常说的sigmoid函数。

2.2公式求解

为了方便推导,我们假设训练数据集包含

m

m

m 个样本,每个样本有

n

n

n 个特征,即

X

R

m

×

n

mathbf{X} in mathbb{R}^{mtimes n}

XRm×n,标签为

y

{

0

,

1

}

m

y in {0, 1}^m

y{0,1}m。为了构建模型,我们需要使用训练数据集求解模型参数

w

mathbf{w}

w

我们使用最大似然估计来求解模型参数。最大似然估计的目标是找到一组模型参数

w

mathbf{w}

w,使得训练数据集出现的概率最大。设训练数据集中的第

i

i

i 个样本的输入特征为

x

i

mathbf{x}_i

xi,输出为

y

i

y_i

yi,其概率表示为:

P

(

y

i

x

i

;

w

)

=

σ

(

w

T

x

i

)

y

i

(

1

σ

(

w

T

x

i

)

)

1

y

i

P(y_i|mathbf{x}_i; mathbf{w}) = sigma(mathbf{w}^T mathbf{x}_i)^{y_i} (1 - sigma(mathbf{w}^T mathbf{x}_i))^{1-y_i}

P(yixi;w)=σ(wTxi)yi(1σ(wTxi))1yi

训练数据集的概率可以表示为:

P

(

y

X

;

w

)

=

i

P

(

y

i

x

i

;

w

)

=

i

σ

(

w

T

x

i

)

y

i

(

1

σ

(

w

T

x

i

)

)

1

y

i

P(y|mathbf{X}; mathbf{w}) = prod_i P(y_i|mathbf{x}_i; mathbf{w}) = prod_i sigma(mathbf{w}^T mathbf{x}_i)^{y_i} (1 - sigma(mathbf{w}^T mathbf{x}_i))^{1-y_i}

P(yX;w)=iP(yixi;w)=iσ(wTxi)yi(1σ(wTxi))1yi

对数似然函数为:

L

(

w

)

=

log

P

(

y

X

;

w

)

=

i

[

y

i

log

(

σ

(

w

T

x

i

)

)

+

(

1

y

i

)

log

(

1

σ

(

w

T

x

i

)

)

]

L(mathbf{w}) = log P(y|mathbf{X}; mathbf{w}) = sum_i [y_i log(sigma(mathbf{w}^T mathbf{x}_i)) + (1-y_i) log(1 - sigma(mathbf{w}^T mathbf{x}_i))]

L(w)=logP(yX;w)=i[yilog(σ(wTxi))+(1yi)log(1σ(wTxi))]

我们的目标是最大化对数似然函数

L

(

w

)

L(mathbf{w})

L(w)。使用梯度上升算法来求解最优参数

w

mathbf{w}

w。对

L

(

w

)

L(mathbf{w})

L(w) 求导,得到:

L

(

w

)

w

=

i

(

σ

(

w

T

x

i

)

y

i

)

x

i

frac{partial L(mathbf{w})}{partial mathbf{w}} = sum_i(sigma(mathbf{w}^T mathbf{x}_i) - y_i)mathbf{x}_i

wL(w)=i(σ(wTxi)yi)xi 使用梯度上升算法,每次更新

w

mathbf{w}

w 的值为:

w

w

+

α

i

(

σ

(

w

T

x

i

)

y

i

)

x

i

mathbf{w} leftarrow mathbf{w} + alpha sum_i (sigma(mathbf{w}^T mathbf{x}_i) - y_i)mathbf{x}_i

ww+αi(σ(wTxi)yi)xi 其中,

α

alpha

α 是学习率。

3 基于Python的实现

3.1可接收参数

在Python中,使用Scikit-learn库中的LogisticRegression类可以创建逻辑回归模型。

下面是LogisticRegression类的主要参数和方法:

参数:

  • penalty: 惩罚项,可以是‘l1’、‘l2’、‘elasticnet’、‘none’中的一种,默认为‘l2’。
  • C: 正则化系数,用于控制模型的复杂度,C值越小,模型越简单,默认为1.0。
  • solver: 用于优化问题的算法,可以是‘newton-cg’、‘lbfgs’、‘liblinear’、‘sag’、‘saga’中的一种,默认为‘lbfgs’。
  • max_iter: 最大迭代次数,用于控制优化算法的迭代次数,默认为100

3.2 完整代码示例

我们使用sklearn自带的威斯康辛州乳腺癌数据集,进行模型的训练和预测。

  1. 首先导入sklearn等必要的包与数据:
import pandas as pd  
from sklearn.datasets import load_breast_cancer  
from sklearn.linear_model import LogisticRegression  
from sklearn.model_selection import train_test_split  
import matplotlib.pyplot as plt  
import matplotlib as mpl  
  
## 设置字符集,防止中文乱码  
mpl.rcParams['font.sans-serif'] = [u'simHei']  
mpl.rcParams['axes.unicode_minus'] = False  
  
# 加载数据集  
data = load_breast_cancer()  
# 转换为DataFrame  
df = pd.DataFrame(data.data, columns=data.feature_names)  
df['target'] = pd.Series(data.target)

此处skearn自带的数据已经是清洗后的版本,如果使用的是原始威斯康辛州乳腺癌数据集或者其他个人数据集,需要对数据进行查看、清洗与特征初筛。比如特征集可能包含患者的身份ID等无用信息,将此类信息直接删除即可。

同时可以使用常用的函数查看数据集状态,比如

# 检测非数据类型与缺失值  
print(df.info())
# 检查异常值  
print(df.describe())

这里官方的数据运行结果如下,可以看到已经不需要做什么修改了。其输出如下:
image.png
如果Type中出现object,通常意味着这一类的某一行存在非数值类型,此时可以使用

df['A'] = pd.to_numeric(df['A'], errors='coerce').astype(float)

这段函数可以将df的A列转为float类型,并将不能转换的数值变为空值。之后与其他缺失值共同使用dropna删除即可。
2. 模型建立与拟合

# 分割数据集  
X = df.drop('target', axis=1)  
y = df['target']  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)  
  
# 创建逻辑回归模型  
clf = LogisticRegression(max_iter=100)  
  
# 拟合模型  
clf.fit(X_train, y_train)

建立模型时,通常不用修改超参数,也可根据数据集的实际特点或拟合后的一些警告(比如函数最终没有收敛)进行超参数的调整。
3. 模型预测与绘图

# 预测  
y_pred = clf.predict(X_test)  
  
# 评估  
accuracy = clf.score(X_test, y_test)  
  
print("预测结果:", y_pred)  
print("准确率:", accuracy)  
  
plt.plot(range(len(X_test)), y_test, 'ro', markersize=4, zorder=3, label=u'真实值')  
plt.plot(range(len(X_test)), y_pred, 'go', markersize=10, zorder=2, label=u'预测值')  
plt.legend()  
plt.show()

从图片上可以看出,红色圈与绿色圈同时出现的点为预测正确的数据,二者单独出现的点位为预测错误的数据。此处对预测结果的判断,是基于概率大于0.5和小于0.5来分割的。如果我们想达到当大于0.8的概率为0才视为0时(降低漏诊概率),可以使用下面的方法。
image.png

  1. 自定义阈值
print(clf.predict_proba(X_test)[:,0]>0.8)

clf.predict_proba(X_test)用于输出不同类别的概率,其输出型输入下:
image.png
如果想要获取分类为0的可能性大于0.8的数据,提取粗该列的数值加以判断即可。

本篇文章代码可点此下载

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>