机器学习——Logistic回归

目录

简介

预备知识

线性模型与回归

最小二乘法与参数求解

Sigmoid函数

Logit函数

决策边界

线性决策边界

非线性决策边界

决策边界与分类阈值

梯度下降

梯度下降的数学表示

梯度下降的类型

学习率的选择

收敛性

logistic回归

1. 收集数据

2. 数据预处理

3. 定义模型

4. 损失函数

5. 优化算法

6. 训练模型

7. 评估模型

8. 超参数调优

9. 模型测试


简介

Logistic回归是一种广泛应用于分类问题的统计方法,尤其是在二分类问题中。它是一种预测分析算法,用于预测一个数据点属于某个类别的概率。在Logistic回归中,我们不像线性回归那样直接预测数值,而是预测概率,这个概率值会通过一个逻辑函数(logistic function)被映射到0和1之间。

预备知识

线性模型与回归

线性模型是统计学和机器学习中最基本和广泛使用的模型之一,它假设输入变量(特征)和输出变量(目标)之间存在线性关系。在回归问题中,线性模型试图找到一组权重系数,使得这些权重与特征变量的线性组合尽可能接近目标变量的实际值。

线性回归模型可以表示为:

  • y 是目标变量。
  • x1​,x2​,…,xn​ 是特征变量。
  • β0​,β1​,…,βn​ 是模型参数,其中 β0​ 是截距项,β1​ 到 βn​ 是与各个特征变量相对应的权重。
  • ϵ 是误差项,代表了除了特征变量以外影响目标变量的其他因素。

在实际应用中,线性回归模型可以通过多种方法进行估计,最常见的是最小二乘法(Ordinary Least Squares, OLS),它的目标是最小化误差项的平方和:

其中,n 是样本数量,m 是特征数量。

线性模型有许多优点,包括模型简单、易于理解和解释、计算效率高。但是,它也有缺点,比如无法捕捉变量之间的非线性关系,这在实际问题中可能会限制其预测能力。

为了解决线性模型的这一局限性,可以采用以下方法:

多项式回归:通过引入特征的高次项来增加模型的复杂度,从而捕捉非线性关系。

变换:对特征或者目标变量进行数学变换(如对数、平方根等)。

添加交互项:在模型中引入特征之间的交互项,以捕捉变量之间的相互作用。

正则化:通过添加正则化项(如L1、L2惩罚)来防止过拟合,并可能提高模型的泛化能力。

在分类问题中,线性模型也可以被用来预测类别,但通常需要通过一个链接函数(如Logistic回归中的Sigmoid函数)将线性模型的输出映射到一个概率分布上。这样的模型称为广义线性模型(Generalized Linear Models, GLMs)。

最小二乘法与参数求解

最小二乘法(Ordinary Least Squares, OLS)是在回归分析中用于估计线性模型参数的一种方法。它的核心思想是找到一组参数,使得模型预测值与实际观测值之间的残差平方和最小。

假设有一个线性模型:

其中,y 是一个n×1的向量,表示目标变量(依赖变量);X 是一个n×(p+1)的矩阵,表示特征变量(自变量),通常包含一个全为1的列作为截距项;β 是一个p+1)×1的向量,表示模型参数(包括权重和截距);ϵ 是一个n×1的向量,表示模型误差项。

最小二乘法的目标是最小化残差平方和(RSS):

为了找到最小化RSS的参数β,我们对RSS关于β求导,并令导数等于0:

解这个方程,可以得到β的最小二乘估计:

Sigmoid函数

Sigmoid函数是一个在机器学习中常用的激活函数,特别是在Logistic回归模型中。它的数学形式如下:

其中,z 是输入变量,e 是自然对数的底数(约等于2.71828)。Sigmoid函数的输出范围在0到1之间,这使得它非常适合用来表示概率。

Sigmoid函数的几个关键特性包括:

平滑性:Sigmoid函数是连续的,并且其导数也是连续的。

输出范围:函数值始终处于0和1之间,这意味着它可以用来表示概率或者作为二分类问题的输出。

非线性:Sigmoid函数是非线性函数,这使得它可以用在神经网络中作为激活函数,帮助网络捕捉复杂的数据结构。

饱和性:当输入值非常大或非常小的时候,函数的梯度接近于0,这种情况被称为饱和。在神经网络中,这可能会导致梯度消失问题,从而影响模型的训练。

在Logistic回归中,Sigmoid函数被用来将线性方程z=wTx+b的结果转换成一个介于0和1之间的概率值,其中w是权重向量,b是偏置项,x是输入特征向量。通过这种方式,Logistic回归模型能够进行概率预测,并根据设定的阈值来分类。

Logit函数

Logit函数是Sigmoid函数的逆函数,用于将概率值转换为对数几率(log-odds),也就是概率的对数比。在统计学中,Logit函数常用于Logistic回归模型,它将概率p映射到实数域上,使得可以使用线性模型来预测概率的对数几率。Logit函数的数学表达式如下:

其中,p表示事件发生的概率,ln⁡ln表示自然对数。

在Logistic回归中,我们通常假设特征x与目标变量y之间的关系可以通过对数几率来表达,即:

这里,p(y=1∣x)表示给定特征x时,y=1的概率,w是权重向量,b是偏置项,wTx是特征和权重的线性组合。

从Logit函数可以推导出Sigmoid函数,因为如果我们将上述的对数几率公式解析为p,就会得到:

这正是Sigmoid函数的形式。因此,在Logistic回归中,我们首先计算特征的线性组合,然后通过Sigmoid函数将其转换为概率,这个过程实际上是在应用Logit函数的逆过程。通过这种方式,Logistic回归能够将线性模型的输出映射到(0,1)(0,1)区间内,作为二分类问题中“成功”或“失败”(即y=1或y=0)的概率预测。

决策边界

决策边界是在特征空间中定义的一个边界,它将数据点分为不同的类别。在分类问题中,模型的任务就是通过学习得到这样一个边界,以便对新的数据点进行正确的分类。

线性决策边界

对于线性模型(比如线性支持向量机或者Logistic回归),决策边界是特征空间中的一个超平面。在二维空间中,这个边界是一条直线,在三维空间中,它是一个平面,更高维度则是超平面。

例如,在Logistic回归中,决策边界可以由以下方程给出:

其中,1,2,…,w1​,w2​,…,wn​ 是模型的权重,b 是偏置项,1,2,…,x1​,x2​,…,xn​ 是特征。当我们有两个特征时,决策边界可以在二维平面上绘制出来。

非线性决策边界

对于非线性模型(比如核支持向量机或神经网络),决策边界可以是曲线或曲面,甚至是更复杂的形状。这些模型能够捕捉特征之间复杂的关系,因此在特征空间中划分出的区域可能具有各种各样的形态。

决策边界与分类阈值

在某些模型中,比如Logistic回归,决策边界还与分类阈值有关。Logistic回归通过Sigmoid函数输出一个介于0和1之间的概率值,通常我们使用0.5作为分类阈值:

  • 如果σ(wTx+b)≥0.5,则预测类别为1。
  • 如果σ(wTx+b)<0.5,则预测类别为0。

这个阈值对应于Logit函数的0点,也就是wTx+b=0时的决策边界。

梯度下降

梯度下降是一种优化算法,广泛用于机器学习和深度学习中以最小化一个函数。这个函数通常是损失函数(loss function),它衡量模型预测值与真实值之间的差异。梯度下降的目标是找到能够使损失函数值最小的参数。

梯度下降的数学表示

设f(θ)是需要最小化的损失函数,θ表示模型的参数。梯度下降通过以下迭代公式来更新θ:

其中:

  • θnext​ 是参数的新值。
  • η 是学习率,它控制我们在梯度指示的方向上前进的步长大小。
  • ∇f(θ) 是损失函数f(θ)关于θ的梯度,它给出了f(θ)在当前θ点上最陡峭上升的方向。梯度的负方向即为最陡峭下降的方向。

梯度下降的类型

  1. 批量梯度下降(Batch Gradient Descent)

    • 在每次更新参数时使用全部训练数据计算损失函数的梯度。
    • 更新可能比较缓慢,但方向准确。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD)

    • 在每次更新参数时只随机选择一个训练样本来计算梯度。
    • 更新速度快,但方向变化大,有一定随机性。
  3. 小批量梯度下降(Mini-batch Gradient Descent)

    • 结合了批量梯度下降和随机梯度下降的优点,在每次更新中使用一小部分训练样本计算梯度。
    • 通常能获得更稳定的收敛过程,且可以利用矩阵运算的高效性。

学习率的选择

学习率η是梯度下降中非常重要的超参数。如果学习率设置得太大,可能会导致参数更新过头,甚至发散,从而无法收敛到最小值。如果学习率设置得太小,虽然能保证收敛性,但收敛速度会非常慢,需要很多次迭代。

收敛性

在某些条件下,比如当损失函数是凸函数时,梯度下降可以保证收敛到全局最小值。对于非凸函数(如深度学习中常见的情形),梯度下降可能只能保证收敛到局部最小值或鞍点。

logistic回归

Logistic回归是一种广泛使用的统计模型,尤其适用于二分类问题。它通过使用logit函数(或称为sigmoid函数)将线性模型的输出映射到(0,1)区间内,使其可以解释为概率。

以下是使用Logistic回归进行模型训练和预测的一般步骤:

1. 收集数据

首先,需要收集包含特征和目标变量的数据集。目标变量应该是二元的,通常编码为0和1。

2. 数据预处理

  • 特征选择:选择与目标变量相关性较高的特征。
  • 缺失值处理:对于缺失的数据,可以选择填充、删除或估算等策略。
  • 特征缩放:对特征进行标准化或归一化,以便模型更容易收敛。
  • 类别特征编码:将类别特征转换为数值形式,例如使用独热编码(One-Hot Encoding)。

 

# 2. 数据预处理
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

3. 定义模型

定义Logistic回归模型的数学表达式。对于一个实例x,模型预测的概率y^​可以表示为:

其中,w是权重向量,b是偏置项,σ(⋅)是Sigmoid函数,定义为:

#3. 创建自定义逻辑回归模型
logreg = SGDClassifier(loss=custom_loss, optimizer=CustomOptimizer(), max_iter=1000)

4. 损失函数

定义损失函数来衡量模型的性能。对于Logistic回归,通常使用对数损失函数(又称为交叉熵损失),对于单个样本,损失函数表示为:

对于整个训练集,损失函数是所有样本损失的平均值。

#4. 自定义损失函数
def custom_loss(y_true, y_pred):
    # 自定义损失函数,例如交叉熵
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

5. 优化算法

选择一个优化算法来最小化损失函数,通常使用梯度下降或其变体(如随机梯度下降、小批量梯度下降)。

#5. 自定义优化算法,例如随机梯度下降
class CustomOptimizer:
    def __init__(self, learning_rate=0.01):
        self.learning_rate = learning_rate
    
    def update(self, w, grad_w):
        return w - self.learning_rate * grad_w

6. 训练模型

使用选定的优化算法迭代地更新权重w和偏置b。在每次迭代中,执行以下步骤:

  • 计算当前参数下模型的输出y^​。
  • 计算损失函数的值。
  • 计算损失函数相对于参数的梯度。
  • 使用梯度下降法更新参数。
# 6. 训练模型
logreg.fit(X_train, y_train)

7. 评估模型

使用验证集或交叉验证方法来评估模型的性能。常用的评估指标包括准确率、精确率、召回率和F1分数。

# 7. 评估模型
y_pred = logreg.predict(X_test)
print("Classification Report:")
print(classification_report(y_test, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

8. 超参数调优

根据模型在验证集上的表现,可能需要调整超参数(如学习率、正则化系数等)来提高模型的性能。

# 8. 超参数调优
# 使用GridSearchCV来寻找最佳的超参数C(正则化强度)
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}
grid_search = GridSearchCV(LogisticRegression(max_iter=10000), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best parameters from grid search: ", grid_search.best_params_)

9. 模型测试

在保持模型固定后,使用独立的测试集来最终评估模型的性能。

# 9. 模型测试
# 使用最佳参数的模型进行测试
best_logreg = grid_search.best_estimator_
y_test_pred = best_logreg.predict(X_test)
print("Test Set Classification Report:")
print(classification_report(y_test, y_test_pred))
print("Test Set Confusion Matrix:")
print(confusion_matrix(y_test, y_test_pred))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值