逻辑斯谛回归(Logistic Regression)算法及Python实现

逻辑回归(Logistic Regression),又称为 logistic 回归分析,是一种广义的线性回归模型,通常用于解决分类问题。虽然名字里有“回归”,但实际上它属于机器学习中的监督学习方法。逻辑回归最初用于解决二分类问题,它也可以通过一些技巧扩展到多分类问题。在实际应用中,我们通常使用给定的训练数据集来训练模型,并在训练结束后利用测试集来评估模型的性能,以确保模型的泛化能力和预测准确性。逻辑回归因其简单、高效且易于解释的特点,在实际应用中得到了广泛的应用,特别是在医学、金融和市场营销等领域。

一、逻辑回归基础

考虑如下线性函数:

(1)y=wTx+b

输出y 为连续的实值,如何让输出成为二值来完成二分类任务?即y0,1,最理想的是单位阶跃函数即:

(2)y={0,if z<00.5,if z=01,if z>0

但是,单位阶跃函数不连续,不利于求解权值,构建模型。于是引入sigmoid函数(对数几率函数,logistic function),它单调可微,并且形似阶跃函数,其公式描述如下所示:

(3)y=11+e(wTx+b)

对数线性回归 阶跃函数和对数几率

y 表示当输入为 x 时,输出为正例的概率(可能性),即 y=P(Y=1|X=x)1y 表示当输入为 x 时,输出为反例的概率(可能性),即 1y=P(Y=0|X=x)。两者的比值 y1y 称为几率(odds),对其取对数即达到对数几率,所以logistic回归又称为对数几率回归。因此根据(2)可得对数几率回归(logistic回归)公式如下所示:

(4)logy1y=wTx+b

由式(3)可得二项逻辑斯蒂回归模型如下所示:

(5)logP(Y=1|X=x)1P(Y=1|X=x)=wTx

其中, w=(w1,w2,...,wm,b)Tx=(x1,x2,...,xm,1)学习模型的关键是对权值 w 的学习,已知的是训练样本即输入及其对应的标签,利用已知输入样本来如何学习权值?该学习过程可以转化为带约束的最优化问题,或者以极大似然函数为目标函数(策略)并使用梯度上升或者牛顿法等最优化算法。
极大似然函数的假设:训练样本出现的概率最大。换句话所就是,有些事情具有多种可能,而其中一种可能值出现,其他可能值未出现,在这个过程中,出现的可能值具有较大概率,所以才会出现。
一种学习方法的假设很重要,合理、科学的假设代表了学习方法的正确方向,在该假设条件下,得出的模型往往能够达到预期效果。设训练样本 {X,y},其中X=xjxjRnyRnyi0,1i=1,2,...,nj=1,2,...,m,则逻辑斯蒂回归输出 y^=11+e(wTx)(0,1) 为区间在0和1的连续实值(表示概率)。则 样本的似然函数为

(6)L(w)=i=1ny^iyi(1y^i)(1yi)

对数似然函数为

(7)L(w)=i=1n(yilogy^i+(1yi)log(1yi^))=i=1n(yilogy^i(1yi^)+log(1yi^))=i=1n(yiwTxilog(1+e(wTxi)))

则逻辑斯蒂回归模型学习可转化为如下最优化问题:

(8)maxwL(w)

采用梯度上升算法来求解函数的最大值(梯度下降求解函数的最小值):对式(7)对权值求偏导得如下公式:

(9)_w=[w1w2wm]=L(w)w=i=1n(yixi11+e(wTxi)e(wTx_i)xi)=i=1n(yi11+e(wTxi))xi=i=1n(yiy^i)xi=XT(yy^)

在此需注意到: yy^ 为误差向量。梯度上升算法的迭代公式如下所示:

(10)w:=w+αw

其中, α 为步长因子,需人为给定,w 的初始值一般设置为 [0.01,0.01] 之间。梯度下降算法为:

w:=wαw

二、逻辑回归理论推导

2.1 二项逻辑斯谛回归

二项逻辑斯谛回归模型定义了如下的条件概率分布:

(11)P(Y=1|x)=exp(wx+b)1+exp(wx+b)

(12)P(Y=0|x)=11+exp(wx+b)

其中xRn 是输入,Y{0,1} 是输出,wRn是权重向量参数,bR 是偏置项,wx 表示 wx 的内积。

通过将权重向量和输入向量扩充,记作 wx ,即:

w=(w(1),w(2),...,w(n),b)T

x=(x(1),x(2),...,x(n),1)

二项逻辑斯谛回归模型可以转换为:

(13)P(Y=1|x)=exp(wx)1+exp(wx)

(14)P(Y=0|x)=11+exp(wx)

2.2 多项逻辑斯谛回归

二项逻辑斯谛回归通常用于二分类问题。它可以扩展为多项逻辑斯谛回归模型,用于多分类任务。
假设离散型随机变量 Y 的取值集合为 1,2,...,K,则多项逻辑斯谛回归模型为:

(15)P(Y=k|x)=exp(wkx)1+k=1K1exp(wkx)

其中,xRn+1)(wkRn+1

2.3 优化求解

在机器学习中我们有损失函数的概念,其衡量的是模型预测错误的程度。如果取整个数据集上的平均对数似然损失,就可以得到:

J(w)=1nlnL(w)

即在逻辑回归模型中,最大化似然函数最小化损失函数实际上是等价的。求解逻辑回归的方法有非常多,主要有梯度下降和牛顿法。优化的主要目标是找到一个方向,参数朝这个方向移动之后使得损失函数的值能够减小,这个方向往往由一阶偏导或者二阶偏导各种组合求得。逻辑回归的损失函数是:

J(w)=1ni=1n[yilnp(xi)+(1yi)ln(1p(xi))]

  • 随机梯度下降

梯度下降通过 ( J(w) ) 对 ( w ) 的一阶导数来找下降方向,并且以迭代的方式更新参数,更新方式为:

gi=J(w)wi=(p(xi)yi)xi

wik+1=wikαgi

其中k 为迭代次数。每次更新参数后,可以通过比较 ||J(wk+1)J(wk)|| 小于阈值或者到达最大迭代次数来停止迭代。

  • 牛顿法

牛顿法的基本思路是在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。假设 wk 为当前的极小值估计值,那么有:

φ(w)=J(wk)+J(wk)(wwk)+12J(wk)(wwk)2

然后令 φ(w)=0,得到

wk+1=wkJ(wk)J(wk)

因此有迭代更新式:

wk+1=wkHk1gk

其中 Hk1 为海森矩阵:

Hmn=2J(w)wmwn=hw(x(i))(1pw(x(i)))xm(i)xn(i)

此外,这个方法需要目标函数是二阶连续可微的。

  • 正则化

正则化是一个通用的算法和思想,用于避免过拟合现象。在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。正则化一般会采用 L1 范式或者 L2范式,其形式分别为:

Φ(w)=||x||1Φ(w)=||x||2

L1正则化

LASSO 回归,相当于为模型添加了这样一个先验知识:w 服从零均值拉普拉斯分布。拉普拉斯分布的概率密度函数为:

f(w|μ,b)=12bexp(|wμ|b)

引入先验知识后,似然函数为:

L(w)=i=1Np(xi)yi(1p(xi))1yij=1d12bexp(|wj|b)

取对数后得到目标函数:

lnL(w)=i[yilnp(xi)+(1yi)ln(1p(xi))]+12b2j|wj|

这等价于原始损失函数后面加上了L1正则。

L2 正则化

Ridge 回归,相当于为模型添加了这样一个先验知识:( w ) 服从零均值正态分布。正态分布的概率密度函数为:

f(w|μ,σ)=12πσexp((wμ)22σ2)

引入先验知识后,似然函数为:

L(w)=i=1Np(xi)yi(1p(xi))1yij=1d12πσexp(wj22σ2)=i=1Np(xi)yi(1p(xi))1yi12πσexp(wTw2σ2)

取对数后得到目标函数:

lnL(w)=i[yilnp(xi)+(1yi)ln(1p(xi))]+12σ2wTw

这等价于原始的损失函数后面加上了L2正则。

流程图 逻辑回归思想

三、逻辑回归Python实现

3.1 案例1

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn

candidates = {'gmat': [780,750,690,710,680,730,690,720,740,690,610,690,710,680,770,610,580,650,540,590,620,600,550,550,570,670,660,580,650,660,640,620,660,660,680,650,670,580,590,690],
              'gpa': [4,3.9,3.3,3.7,3.9,3.7,2.3,3.3,3.3,1.7,2.7,3.7,3.7,3.3,3.3,3,2.7,3.7,2.7,2.3,3.3,2,2.3,2.7,3,3.3,3.7,2.3,3.7,3.3,3,2.7,4,3.3,3.3,2.3,2.7,3.3,1.7,3.7],
              'work_experience': [3,4,3,5,4,6,1,4,5,1,3,5,6,4,3,1,4,6,2,3,2,1,4,1,2,6,4,2,6,5,1,2,4,6,5,1,2,1,4,5],
              'admitted': [1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1]
              }

df = pd.DataFrame(candidates,columns= ['gmat', 'gpa','work_experience','admitted'])
df[:10]

X = df[['gmat', 'gpa','work_experience']]
y = df['admitted']
#  75%的数据用来做训练集,25%的数据用作测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)
#建模
logistic_regression= LogisticRegression()
#训练
logistic_regression.fit(X_train,y_train)
#预测
y_pred=logistic_regression.predict(X_test)

#绘制热力图
confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])
sn.heatmap(confusion_matrix, annot=True)

print('精度: ',metrics.accuracy_score(y_test, y_pred))

3.2 案例2

[Dry_Bean_Dataset.csv数据下载地址链接](https://www.kaggle.com/datasets/muratkokludataset/dry-bean-dataset)

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn
import matplotlib.pyplot as plt

# Read the dataset
data = pd.read_csv('Dry_Bean_Dataset.csv')
df = pd.DataFrame(data)

# Drop rows with missing values
df.dropna(inplace=True)

# Plotting the scatter plot
color = []
for i in df['Class'][:len(df)]:
    if i == 'SEKER':
        color.append('red')
    else:
        color.append('blue')

plt.scatter(df['MajorAxisLength'][:len(df)], df['MinorAxisLength'][:len(df)], color=color)
plt.xlabel('MajorAxisLength')
plt.ylabel('MinorAxisLength')
plt.show()

# Assuming the target column is one of the existing columns, let's choose the last column as the target
target_column = df.columns[-1]  # Assuming the last column is the target column

X = df.drop(columns=[target_column])  #去掉空值数据,数据预处理
y = df[target_column]

# Splitting the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

# Creating the logistic regression model
logistic_regression = LogisticRegression()

# Training the model
logistic_regression.fit(X_train, y_train)

# Making predictions
y_pred = logistic_regression.predict(X_test)

# Creating a confusion matrix
confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])

# Plotting the confusion matrix as a heatmap with values rounded to two decimal places
sn.heatmap(confusion_matrix, annot=True, fmt=".2f")
plt.show()

# Calculating and printing the accuracy
print('Accuracy: ', metrics.accuracy_score(y_test, y_pred))
分类展示 混淆矩阵

3.3 案例3

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

# Load the breast cancer dataset
data = load_breast_cancer()
X, y = data.data, data.target

# Standardize features
scaler = StandardScaler()
X = scaler.fit_transform(X)

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Build and train the logistic regression model
logistic_regression = LogisticRegression()
logistic_regression.fit(X_train, y_train)

# Predict
y_pred = logistic_regression.predict(X_test)

# Print accuracy
train_accuracy = logistic_regression.score(X_train, y_train) * 100
test_accuracy = logistic_regression.score(X_test, y_test) * 100
print("Training accuracy: {:.2f}%".format(train_accuracy))
print("Test accuracy: {:.2f}%".format(test_accuracy))

# Compute confusion matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# Visualize confusion matrix
sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d')
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()

总结

逻辑斯特回归(Logistic Regression)是一种常用的分类算法,尤其适用于二分类问题。该算法基于线性回归模型,但通过对输出结果应用逻辑斯特函数(Sigmoid函数)来实现输出结果在0到1之间的概率值,进而进行分类决策。以下是逻辑斯特回归的主要特点和总结:

概率建模:逻辑斯特回归通过Sigmoid函数将线性组合的输入转换为0到1之间的概率值。这种概率模型使得逻辑斯特回归可以输出样本属于某个类别的概率,而不仅仅是简单的分类结果。
线性决策边界:逻辑斯特回归基于线性回归模型,因此其决策边界是一个线性函数。这意味着它假设数据是线性可分的,因此在非线性数据集上的表现可能不佳。
参数学习:逻辑斯特回归的参数学习通常使用最大似然估计法。通过最大化样本观测到的标签概率的乘积,可以得到模型参数的最优估计。
易于解释:逻辑斯特回归的结果是概率值,可以直观地解释为样本属于某个类别的可能性。此外,模型的系数(权重)也可以解释为不同特征对分类结果的影响程度。
适用性广泛:逻辑斯特回归适用于许多应用场景,包括医学诊断、金融风控、自然语言处理等。它的简单性和可解释性使得它成为了许多实际问题的首选算法之一。

参考资料

  1. 数据挖掘术语解析
  2. logistic回归算法原理及python实现
  3. 逻辑回归(Logistic Regression)详解
  4. 统计学习方法笔记(八)-逻辑斯谛回归(LogisticRegression)原理及python实现
posted @   郝hai  阅读(1712)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2023-05-11 车辆路径问题——CVRP的Python实现
点击右上角即可分享
微信分享提示