一、概念
1.1简介
逻辑回归是一种用于解决分类问题的统计学习方法。尽管名字中含有"回归"一词,但逻辑回归实际上是一种分类算法,用于预测输入变量与离散输出变量之间的关系。逻辑回归通过将输入特征的加权和与一个逻辑函数(如sigmoid函数)进行组合,从而得出一个介于0和1之间的概率值,表示样本属于某个类别的可能性。当概率大于0.5时,通常将样本归为正类;当概率小于0.5时,则归为负类。逻辑回归常用于二元分类问题,但也可以通过修改模型来处理多类别分类。它被广泛应用于医学、社会科学、金融等领域,在实践中表现出良好的性能和解释性。
1.2处理的数据
逻辑回归是用来进行分类的,下面我将给出一个简单的例子来解释。
我们给出一个人的 [身高,体重] 这两个指标,然后判断这个人是属于”胖“还是”瘦“这一类。对于这个问题,我们可以先测量n个人的身高、体重以及对应的指标”胖“,"瘦”,把胖和瘦分别用0和1来表示,把这n组数据输入模型进行训练。训练之后再把待分类的一个人的身高、体重输入模型中,看这个人是属于“胖”还是“瘦”。
如果数据是有两个指标,可以用平面的点来表示数据,其中一个指标为x轴,另一个为y轴;如果数据有三个指标,可以用空间中的点表示数据;如果是p维的话(p>3),就是p维空间中的点。
二、逻辑回归
2.1定义
逻辑回归是一种统计学习方法,用于解决分类问题。它假设因变量(输出)为二分类变量,即取值为0或1。逻辑回归通过线性回归模型的结果经过一个逻辑函数(如sigmoid函数)来预测输入特征与输出变量之间的关系。
数学上,逻辑回归可以表示为:
其中,y表示输出变量的取值(0或1),x1,x2,...,xn表示输入特征,w1,w2,...,wn表示模型参数,e为自然对数的底。
2.2线性回归函数
将上述公式转换为向量形式:
2.3sigmoid函数
sigmoid函数是一种常见的激活函数,通常用于将实数映射到0到1之间的区间。
其数学表达式为:
其中,e表示自然对数的底。sigmoid函数的图像呈S形状,具有以下特点:
当x趋向正无穷时,g(x)趋近于1;
当x趋向负无穷时,g(x)趋近于0;
在原点处取得最大斜率。
sigmoid函数在逻辑回归中经常被用作激活函数,将线性模型的输出映射到0到1之间,表示某一类别的概率。此外,sigmoid函数也在人工神经网络等领域广泛应用,因为它具有连续、可导和非线性的特性,适合用于构建深度学习模型的隐藏层。
图像如下:
2.4损失函数
2.5最小二乘法
最小二乘法(least square method): 基于均方误差最小化来进行模型求解的方法称为最小二乘法。
均方误差具有非常好的几何意义,它对应了常用的欧几里得距离(欧氏距离)。
参数估计(parameter estimation): 求解w和b使均方误差最小化的过程,称为对线性回归模型的最小二乘“参数估计”。
三、方法实现
3.1梯度下降法
对于如何估计w和b?我们总是希望预测值ŷ尽可能地拟合样本值y,损失函数描述了这种拟合关系,在逻辑回归中,使用交叉熵损失函数:
我们可以将前面两个关系式代入,得到一个关于w和b的式子,而对于每一个样本都可以得到一个损失函数,设有m个样本,对这些损失函数求和得到一个成本函数:
接下来问题变成了如何找到一组w和b,使得这个成本函数尽可能地小,可以形象地将其表示为一个“找碗底”的过程。
从初始点开始,每一次迭代都使用如下公式更新w和b,使得成本函数总是沿着最接近“碗底”的方向下降:
其中α为学习率,用以控制每一次梯度下降的步长
关于初始化w和b,几乎是任意的初始化方法都有效,因为成本函数是凸函数,无论在哪里初始化,使用梯度下降法都应该能达到”碗底“或其附近,这也是为什么选择交叉熵作为损失函数的原因,它总能得到或接近一个全局最优解
下面我们只关注w,忽略b,具体来看看梯度下降法为什么能够”找到碗底“。
由上图可以看到,无论怎样初始化w,梯度下降法总是使w朝着成本函数减少的方向移动的。
3.2牛顿法
牛顿迭代法的原理较为复杂,因此不在这里写出来。对比这牛顿法方法与梯度下降法的参数更新公式可以发现,两种方法不同在于牛顿法中多了一项二阶导数,这项二阶导数对参数更新的影响主要体现在 改变参数更新方向上。
如图所示,红色是牛顿法参数更新的方向,绿色为梯度下降法参数更新方向,因为牛顿法考虑了二阶导数,因而可以找到更优的参数更新方向,在每次更新的步幅相同的情况下,可以比梯度下降法节省很多的迭代次数。
迭代过程:
四、代码案例
4.1生成示例数据
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
y = [0] * 20 + [1] * 20
4.2数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
4.3拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
4.4训练逻辑回归模型
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)
4.5预测
y_pred = model.predict(X_test)
4.6绘制决策边界和数据散点图
plt.scatter(X[:20, 0], X[:20, 1], color='blue', marker='o', label='class 0')
plt.scatter(X[20:, 0], X[20:, 1], color='red', marker='x', label='class 1')
4.7绘制决策边界
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_proba(grid)[:, 1].reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='black')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend()
plt.show()
图示:
在这个示例中,我们首先生成了一些示例数据,并使用matplotlib库绘制了数据的散点图。然后,我们定义了sigmoid函数和损失函数,并且使用scikit-learn库的LogisticRegression来训练逻辑回归模型。最后,我们使用matplotlib库绘制了决策边界,以可视化模型的分类效果。
****** 下面代码示例展示了如何使用最小二乇法、牛顿法和梯度下降法来求解逻辑回归模型的参数。可以根据需要调整参数、数据集和迭代次数来进行实验和理解不同方法的性能和收敛速度。
1.最小二乘法
import numpy as np
# 最小二乘法求解逻辑回归参数
def least_squares(X, y):
X_b = np.c_[np.ones((len(X), 1)), X] # 添加偏置项
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
return theta_best
# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])
# 使用最小二乘法求解参数
theta_best = least_squares(X, y)
print("Theta best (Least Squares):", theta_best)
2.牛顿法
import numpy as np
# sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 牛顿法求解逻辑回归参数
def newton_method(X, y, max_iter=100, tol=1e-6):
m, n = X.shape
X_b = np.c_[np.ones((m, 1)), X] # 添加偏置项
theta = np.zeros(n + 1)
for _ in range(max_iter):
h = sigmoid(X_b.dot(theta))
gradient = 1/m * X_b.T.dot(h - y)
hessian = 1/m * X_b.T.dot(np.diag(h*(1-h))).dot(X_b)
delta = np.linalg.inv(hessian).dot(gradient)
theta -= delta
if np.linalg.norm(delta) < tol:
break
return theta
# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])
# 使用牛顿法求解参数
theta_best = newton_method(X, y)
print("Theta best (Newton's method):", theta_best)
3.梯度下降法
import numpy as np
# sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 梯度下降法求解逻辑回归参数
def gradient_descent(X, y, learning_rate=0.01, max_iter=1000, tol=1e-6):
m, n = X.shape
X_b = np.c_[np.ones((m, 1)), X] # 添加偏置项
theta = np.zeros(n + 1)
for _ in range(max_iter):
h = sigmoid(X_b.dot(theta))
gradient = 1/m * X_b.T.dot(h - y)
theta -= learning_rate * gradient
if np.linalg.norm(learning_rate * gradient) < tol:
break
return theta
# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])
# 使用梯度下降法求解参数
theta_best = gradient_descent(X, y)
print("Theta best (Gradient Descent):", theta_best)
五、优、缺点
1、优点
(1)适合分类场景
(2)计算代价不高,容易理解实现。
(3)不用事先假设数据分布,这样避免了假设分布不准确所带来的问题。
(4)不仅预测出类别,还可以得到近似概率预测。
(5)目标函数任意阶可导。
2、缺点
(1)容易欠拟合,分类精度不高。
(2)数据特征有缺失或者特征空间很大时表现效果并不好。
六、结论
逻辑回归是一种用于解决分类问题的机器学习算法。以下是关于逻辑回归的总结:
-
逻辑回归是一种基于概率的分类算法,通常用于解决二分类问题,即将数据分为两个类别。
-
逻辑回归通过将特征的加权和与偏置项进行线性组合,并经过一个sigmoid函数(也称为logistic函数)来预测输出为正类的概率。
-
训练逻辑回归模型的目标是最大化似然函数,即最大化模型预测样本标签的概率。
-
逻辑回归模型通常使用梯度下降等优化算法来最小化损失函数,例如对数损失函数。
-
逻辑回归可以处理线性可分和线性不可分的情况,但在处理非线性问题时通常需要进行特征工程或使用多项式特征。
-
逻辑回归的优点包括计算速度快、易于解释和实现、适用于大规模数据集;缺点包括对特征之间相关性敏感、容易受到异常值的影响。
总的来说,逻辑回归是一种简单而有效的分类算法,在许多实际应用中都取得了不错的效果。