【逻辑回归+实战】
原文:https://blog.csdn.net/didiaopao/article/details/126483343
回归和分类区别
回归:
举个例子,输入一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来预测一个人的体重,一个人的体重的值可以有无限个值。所以预测的结果是无限的、不确定的连续数值。这样的机器学习任务就是回归任务,如线性回归我们用平方差损失函数。
分类:
如果利用一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来判断这个人的身体状况是否健康,那么最终的判断的结果就只有两种健康和不健康。这样的输出结果为离散值,预测的结果也是一个有限的数值来代表种类,如逻辑回归分类我们用交叉熵损失函数。
逻辑回归
虽然有回归,但他是来做二分类的任务,逻辑回归模型通过一个线性组合
y
=
x
0
w
0
+
x
1
w
1
+
x
2
w
2
+
⋅
⋅
⋅
+
x
n
w
n
+
b
y=x_0w_0+x_1w_1+x_2w_2+···+x_nw_n+b
y=x0w0+x1w1+x2w2+⋅⋅⋅+xnwn+b
即
y
=
W
T
X
+
b
y=W^TX+b
y=WTX+b
其中x为样本某一特征取值, wT及b为输入参数。
上式输出的值是可以小于0或者大于1的。但我们希望逻辑回归输出一个0到1的数。可以借助Sigmoid函数来将输出映射到0到1:
先来学习下sigmoid函数
g
(
y
)
=
1
1
+
e
−
y
g(y)=\frac{1}{1+e^{-y}}
g(y)=1+e−y1
即当z趋近于负无穷时值 g ( z ) g(z) g(z)无限趋近于0,当z趋近于正无穷时值 g ( z ) g(z) g(z)无限趋近于1,也就是说它可以将自变量约束到0和1间
模型公式推导
因此,逻辑回归模型可以用如下的公式来表达:
g
(
y
)
=
1
1
+
e
−
W
T
X
+
b
g(y)=\frac{1}{1+e^{-W^TX+b}}
g(y)=1+e−WTX+b1
因此对于一个二分类的的问题,此时正例和反例的函数表达式就如下式所示:
预测结果为正例的表达式:
p
(
y
=
1
∣
X
)
=
1
1
+
e
−
W
T
X
+
b
p(y = 1|X) =\frac{1}{1+e^{-W^TX+b}}
p(y=1∣X)=1+e−WTX+b1
可以理解为模型预测结果 y为1的概率,例如我们通过这个模型预测完的y=0.95,也就是说预测结果 y为1的概率为95%,那么预测为0的概率呢,当然是100%-95%,即如下
预测结果为反例的表达式:
p
(
y
=
0
∣
X
)
=
e
−
W
T
X
+
b
1
+
e
−
W
T
X
+
b
=
1
−
p
(
y
=
1
∣
X
)
p(y = 0|X) =\frac{e^{-W^TX+b}}{1+e^{-W^TX+b}}=1-p(y = 1|X)
p(y=0∣X)=1+e−WTX+be−WTX+b=1−p(y=1∣X)
在函数的计算推导过程中,如果分别考虑正反两例情况,计算起来就特别麻烦,
因此可以将上述两个例子合并起来得到如下公式:
故模型公式为
p
(
y
∣
X
)
=
p
(
y
∣
X
)
y
[
1
−
p
(
y
∣
X
)
]
1
−
y
p(y|X)=p(y|X)^y[1-p(y |X)] ^{1-y}
p(y∣X)=p(y∣X)y[1−p(y∣X)]1−y
也就是当y为0时是后项,为1时为前项
损失函数
小写希腊字母:
α
,
β
,
γ
,
δ
,
ϵ
,
ζ
,
η
,
θ
,
ι
,
κ
,
λ
,
μ
,
ν
,
ξ
,
π
,
ρ
,
σ
,
τ
,
υ
,
ϕ
,
χ
,
ψ
,
ω
\alpha, \beta, \gamma, \delta, \epsilon, \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi, \pi, \rho, \sigma, \tau, \upsilon, \phi, \chi, \psi, \omega
α,β,γ,δ,ϵ,ζ,η,θ,ι,κ,λ,μ,ν,ξ,π,ρ,σ,τ,υ,ϕ,χ,ψ,ω
大写希腊字母:
Γ
,
Δ
,
Θ
,
Λ
,
Ξ
,
Π
,
Σ
,
Υ
,
Φ
,
Ψ
,
Ω
\Gamma, \Delta, \Theta, \Lambda, \Xi, \Pi, \Sigma, \Upsilon, \Phi, \Psi, \Omega
Γ,Δ,Θ,Λ,Ξ,Π,Σ,Υ,Φ,Ψ,Ω
上面引入的sigmoid函数仅仅起分类0到1的作用,z函数是预测的模型函数,那么损失函数是什么呢
前面的逻辑回归模型也有了,利用该模型可以对输入的数据特征进行分类判断。但是模型的
判断能力的好坏取决于模型中的参数𝑤和𝑏,因此我们需要从提供的数据样本中不断学习,从
而更新参数𝑤和𝑏使得预测出的结果全部正确的概率最大,简单来讲就是所有的样本的预测正
确的概率相乘得到数值是最大的,按这样的要求得到数据表达式如下所示,该式就是逻辑回归
的损失函数。
L
(
w
,
b
)
=
∏
i
=
1
m
p
(
1
∣
X
)
y
i
(
1
−
p
(
1
∣
X
)
)
1
−
y
i
L(w, b) =\prod_{i=1}^{m} p(1|X)^{y_i}(1-p(1 |X))^{1-{y_i}}
L(w,b)=i=1∏mp(1∣X)yi(1−p(1∣X))1−yi
这里我的理解是当在数据集中某个样本
X
1
X_1
X1的y为1,通过模型预测出来的结果为0.8(即为1的概率为80%),某个样本
X
2
X_2
X2的y为1,通过模型预测出来的结果为0.85(即为1的概率为85%),某个样本
X
3
X_3
X3的y为0,通过模型预测出来的结果为0.9(即为0的概率为90%),我们把每个预测出来的结果求积,要让积最大,也就是为正确的概率最大
L
(
w
,
b
)
=
∏
i
=
1
m
(
σ
(
W
T
x
i
+
b
)
)
y
i
(
1
−
σ
(
W
T
x
i
+
b
)
)
1
−
y
i
L(w, b) =\prod_{i=1}^{m} (\sigma(W^Tx_i+b))^{y_i}(1-\sigma(W^Tx_i+b))^{1-{y_i}}
L(w,b)=i=1∏m(σ(WTxi+b))yi(1−σ(WTxi+b))1−yi
相对连乘运算,连加运算计算起来要比连乘要简单许多,因此可以利用两边同时取log的形式让连乘变成连加。此时就变成如下式所示:
l
(
w
,
b
)
=
log
L
(
w
,
b
)
l(w, b)=\log L(w,b)
l(w,b)=logL(w,b)
l
(
w
,
b
)
=
∑
i
=
1
m
[
y
i
log
σ
(
W
T
x
i
+
b
)
+
(
1
−
y
i
)
log
(
1
−
σ
(
W
T
x
i
+
b
)
)
]
l(w, b) =\sum_{i=1}^{m} \left[ y_i \log \sigma(W^Tx_i+b)+ (1 - y_i) \log (1 - \sigma(W^Tx_i+b)) \right]
l(w,b)=i=1∑m[yilogσ(WTxi+b)+(1−yi)log(1−σ(WTxi+b))]
此时我们只需要找到一组参数𝑤和𝑏使得𝑙 𝑤, 𝑏 最大即可,但是在机器学习中通常希望把上升问题转化为下降问题,因此将该函数取相反数即可。得到下式:
J
(
w
,
b
)
=
−
1
m
l
(
w
,
b
)
J(w,b)=-\frac{1}{m}l(w, b)
J(w,b)=−m1l(w,b)
除以m是取平均,J (w,b)这个函数就是逻辑回归最终的损失函数
两个知识点:
①sigmoid的导数如:
g
′
(
z
)
=
g
(
z
)
(
1
−
g
(
z
)
)
g'(z)=g(z)(1-g(z))
g′(z)=g(z)(1−g(z))
②: l o g ′ x = 1 x log'x=\frac{1}{x} log′x=x1
梯度下降
此时,只要利用梯度下降法进行参数更新就能通过数据样本不断学习更新参数了,梯度下降法的步骤如下:
步骤1,利用损失函数求解对应参数的偏导数:
w参数的偏导数的计算步骤如下所示:
①:参数w的更新
∂
J
(
w
,
b
)
∂
w
=
1
m
∑
i
=
1
m
(
σ
(
w
T
x
i
+
b
)
−
y
i
)
x
i
\frac{\partial J(w,b)}{\partial w}=\frac{1}{m}\sum_{i=1}^{m} (\sigma(w^Tx_i+b)-y_i)x_i
∂w∂J(w,b)=m1∑i=1m(σ(wTxi+b)−yi)xi
②:参数b的更新
∂
J
(
w
,
b
)
∂
b
=
1
m
∑
i
=
1
m
σ
(
w
T
x
i
+
b
)
−
y
i
\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum_{i=1}^{m} \sigma(w^Tx_i+b)-y_i
∂b∂J(w,b)=m1∑i=1mσ(wTxi+b)−yi
所以
w
=
w
−
∂
J
(
w
,
b
)
∂
w
w=w-\frac{\partial J(w,b)}{\partial w}
w=w−∂w∂J(w,b)
b
=
b
−
∂
J
(
w
,
b
)
∂
b
b=b-\frac{\partial J(w,b)}{\partial b}
b=b−∂b∂J(w,b)
代码
import numpy as np
import pandas as pd
# 不像上一章需要我们手打算法,这里直接用sklearn定义好的算法
# 导入数据集划分的,就是划分训练集,测试集和验证集
from sklearn.model_selection import train_test_split
# 导入数据集预处理的MinMaxScaler,它主要用于将特征缩放到给定的最小值和最大值之间,通常是 0 和 1,
# 但也可以是其他范围。这种缩放方法对于许多机器学习算法来说是非常有用的,
# 特别是那些基于距离的算法(如 K-近邻、K-均值聚类等)和需要梯度下降优化的算法(如神经网络)。
# 说白了就是归一化,因为不管是机器学习模型还是深度学习模型总是认为数值量级越大越重要
# 同时归一化后主要由每个特征的w决定权重,并且训练速度也大大加快了
from sklearn.preprocessing import MinMaxScaler
# 导入逻辑回归模型
from sklearn.linear_model import LogisticRegression
# 导入模型评估的函数,如精确率,F1,召回率等等
from sklearn.metrics import classification_report
##############################数据预处理###################################
# 读取数据
dataset = pd.read_csv("breast_cancer_data.csv")
# ctrl+?快速注释
# print(dataset)
# 提取特征x
X = dataset.iloc[:, :-1] # 选择除了最后一列之外的所有列
# print(X)
# 提取标签y
Y = dataset["target"] # 选择除了最后一列之外的所有列
# print(Y)
# 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.2)
# 进行数据的归一化
sc = MinMaxScaler(feature_range=(0,1))
x_train = sc.fit_transform(x_train)
x_test = sc.fit_transform(x_test)
##############################################逻辑回归模型搭建####################################################
lr = LogisticRegression()
lr.fit(x_train,y_train)
# 打印模型的参数
# print("w=", lr.coef_)
# print("b=", lr.intercept_)
# 利用训练好的模型进行推理
pre_reslut = lr.predict(x_test)
# print(pre_reslut)
# 打印预测结果的概率
pre_reslut_proba = lr.predict_proba(x_test)
# print(pre_reslut_proba)
# 获取恶性肿瘤的概率
pre_list = pre_reslut_proba[:,1]
# print(pre_list)
# 设置阈值,大于 30%的认为是恶心肿瘤
thresholds = 0.3
# 设置保存结果的列表
reslut = []
reslut_name = []
for i in range(len(pre_list)):
if pre_list[i] > thresholds:
reslut.append(1)
reslut_name.append("恶性肿瘤")
else:
reslut.append(0)
reslut_name.append("良性肿瘤")
# print(reslut)
# print(reslut_name)
##############################################模型预测结果评估####################################################
# 输出结果的精确率,召回率,F1
report = classification_report(y_test,reslut,labels = [0,1],target_names=["良性肿瘤","恶性肿瘤"])
print(report)