目录
简介
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表示事件发生的概率,lnln表示自然对数。
在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(θ)在当前θ点上最陡峭上升的方向。梯度的负方向即为最陡峭下降的方向。
梯度下降的类型
-
批量梯度下降(Batch Gradient Descent):
- 在每次更新参数时使用全部训练数据计算损失函数的梯度。
- 更新可能比较缓慢,但方向准确。
-
随机梯度下降(Stochastic Gradient Descent, SGD):
- 在每次更新参数时只随机选择一个训练样本来计算梯度。
- 更新速度快,但方向变化大,有一定随机性。
-
小批量梯度下降(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))