逻辑斯谛回归(Logistic Regression)算法及Python实现
逻辑回归(Logistic Regression),又称为 logistic 回归分析,是一种广义的线性回归模型,通常用于解决分类问题。虽然名字里有“回归”,但实际上它属于机器学习中的监督学习方法。逻辑回归最初用于解决二分类问题,它也可以通过一些技巧扩展到多分类问题。在实际应用中,我们通常使用给定的训练数据集来训练模型,并在训练结束后利用测试集来评估模型的性能,以确保模型的泛化能力和预测准确性。逻辑回归因其简单、高效且易于解释的特点,在实际应用中得到了广泛的应用,特别是在医学、金融和市场营销等领域。
一、逻辑回归基础
考虑如下线性函数:
输出 为连续的实值,如何让输出成为二值来完成二分类任务?即,最理想的是单位阶跃函数即:
但是,单位阶跃函数不连续,不利于求解权值,构建模型。于是引入sigmoid函数(对数几率函数,logistic function),它单调可微,并且形似阶跃函数,其公式描述如下所示:
对数线性回归 | 阶跃函数和对数几率 |
---|---|
![]() |
![]() |
令 表示当输入为 时,输出为正例的概率(可能性),即 ; 表示当输入为 时,输出为反例的概率(可能性),即 。两者的比值 称为几率(odds),对其取对数即达到对数几率,所以logistic回归又称为对数几率回归。因此根据(2)可得对数几率回归(logistic回归)公式如下所示:
由式(3)可得二项逻辑斯蒂回归模型如下所示:
其中, 学习模型的关键是对权值 的学习,已知的是训练样本即输入及其对应的标签,利用已知输入样本来如何学习权值?该学习过程可以转化为带约束的最优化问题,或者以极大似然函数为目标函数(策略)并使用梯度上升或者牛顿法等最优化算法。
极大似然函数的假设:训练样本出现的概率最大。换句话所就是,有些事情具有多种可能,而其中一种可能值出现,其他可能值未出现,在这个过程中,出现的可能值具有较大概率,所以才会出现。
一种学习方法的假设很重要,合理、科学的假设代表了学习方法的正确方向,在该假设条件下,得出的模型往往能够达到预期效果。设训练样本 ,其中,则逻辑斯蒂回归输出 为区间在0和1的连续实值(表示概率)。则 样本的似然函数为:
对数似然函数为:
则逻辑斯蒂回归模型学习可转化为如下最优化问题:
采用梯度上升算法来求解函数的最大值(梯度下降求解函数的最小值):对式(7)对权值求偏导得如下公式:
在此需注意到: 为误差向量。梯度上升算法的迭代公式如下所示:
其中, 为步长因子,需人为给定, 的初始值一般设置为 之间。梯度下降算法为:
二、逻辑回归理论推导
2.1 二项逻辑斯谛回归
二项逻辑斯谛回归模型定义了如下的条件概率分布:
其中 是输入, 是输出,是权重向量参数, 是偏置项, 表示 和 的内积。
通过将权重向量和输入向量扩充,记作 和 ,即:
二项逻辑斯谛回归模型可以转换为:
2.2 多项逻辑斯谛回归
二项逻辑斯谛回归通常用于二分类问题。它可以扩展为多项逻辑斯谛回归模型,用于多分类任务。
假设离散型随机变量 的取值集合为 ,则多项逻辑斯谛回归模型为:
其中,。
2.3 优化求解
在机器学习中我们有损失函数的概念,其衡量的是模型预测错误的程度。如果取整个数据集上的平均对数似然损失,就可以得到:
即在逻辑回归模型中,最大化似然函数和最小化损失函数实际上是等价的。求解逻辑回归的方法有非常多,主要有梯度下降和牛顿法。优化的主要目标是找到一个方向,参数朝这个方向移动之后使得损失函数的值能够减小,这个方向往往由一阶偏导或者二阶偏导各种组合求得。逻辑回归的损失函数是:
- 随机梯度下降
梯度下降通过 ( J(w) ) 对 ( w ) 的一阶导数来找下降方向,并且以迭代的方式更新参数,更新方式为:
其中 为迭代次数。每次更新参数后,可以通过比较 小于阈值或者到达最大迭代次数来停止迭代。
- 牛顿法
牛顿法的基本思路是在现有极小点估计值的附近对做二阶泰勒展开,进而找到极小点的下一个估计值。假设 为当前的极小值估计值,那么有:
然后令 ,得到
因此有迭代更新式:
其中 为海森矩阵:
此外,这个方法需要目标函数是二阶连续可微的。
- 正则化
正则化是一个通用的算法和思想,用于避免过拟合现象。在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。正则化一般会采用 范式或者 范式,其形式分别为:
正则化
LASSO 回归,相当于为模型添加了这样一个先验知识: 服从零均值拉普拉斯分布。拉普拉斯分布的概率密度函数为:
引入先验知识后,似然函数为:
取对数后得到目标函数:
这等价于原始损失函数后面加上了正则。
正则化
Ridge 回归,相当于为模型添加了这样一个先验知识:( w ) 服从零均值正态分布。正态分布的概率密度函数为:
引入先验知识后,似然函数为:
取对数后得到目标函数:
这等价于原始的损失函数后面加上了正则。
流程图 | 逻辑回归思想 |
---|---|
![]() |
![]() |
三、逻辑回归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之间的概率值。这种概率模型使得逻辑斯特回归可以输出样本属于某个类别的概率,而不仅仅是简单的分类结果。
线性决策边界:逻辑斯特回归基于线性回归模型,因此其决策边界是一个线性函数。这意味着它假设数据是线性可分的,因此在非线性数据集上的表现可能不佳。
参数学习:逻辑斯特回归的参数学习通常使用最大似然估计法。通过最大化样本观测到的标签概率的乘积,可以得到模型参数的最优估计。
易于解释:逻辑斯特回归的结果是概率值,可以直观地解释为样本属于某个类别的可能性。此外,模型的系数(权重)也可以解释为不同特征对分类结果的影响程度。
适用性广泛:逻辑斯特回归适用于许多应用场景,包括医学诊断、金融风控、自然语言处理等。它的简单性和可解释性使得它成为了许多实际问题的首选算法之一。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2023-05-11 车辆路径问题——CVRP的Python实现