目录
一、Logistic回归简介
Logistic回归(Logistic Regression)是一种广泛应用于统计学和机器学习领域的分类算法,尤其适合于二分类问题。它的目的是找到一个能够预测目标变量的概率分布的模型。
1.线性回归基础
逻辑回归于线性回归的区别
逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。
Logistic回归虽然名为“回归”,但实际上是用来解决分类问题的。它在核心上利用线性回归的思想,将特征的线性组合映射到一个预测值上。
Logistic回归通过一个线性组合来整合输入特征:
其中:
是权重向量(( w_1, w_2, ..., w_n ))。
是特征向量(( x_1, x_2, ..., x_n ))。
是偏差项,也称为截距。
是线性组合的结果。
2.Sigmoid函数
为了将线性回归的输出映射到0和1之间,Logistic回归使用了Sigmoid函数(或称为Logistic函数)。Sigmoid函数的数学表达式为:
其中,( z )是特征的线性组合,即( z = w_1x_1 + w_2x_2 + ... + w_nx_n + b ),( w_i )是权重,( b )是偏差项。
在Logistic回归中,Sigmoid函数的输出被解释为样本属于正类(通常编码为1)的概率。如果这个概率大于0.5,我们可以将样本分类为正类;否则分类为负类(通常编码为0)。
3.损失函数
为了训练模型,需要定义一个损失函数来度量预测值与实际值之间的差距。Logistic回归通常使用对数损失函数(也称为交叉熵损失),对于单个样本,其损失函数可以表示为:
其中,( )是真实标签,(
)是预测概率。
4.Logistic回归的优缺点:
优点:
- 简单易懂,计算代价不高,速度快。
- 输出结果是概率,可以直观地理解模型输出的不确定性。
- 由于其简单性,它不需要很高的计算资源,因此适用于实时系统。
- 容易使用正则化方法来避免过拟合。
缺点:
- 容易欠拟合,分类精度可能不高。
- 主要用于线性可分的数据集,对于非线性问题需要转换特征空间。
- 对于数据集中特征之间复杂的关系可能无法很好地捕捉。
二、参数估计方法
在统计学和机器学习中,参数估计是指确定模型参数的过程,以便模型能够最好地拟合数据。常见的参数估计方法包括最大似然估计(Maximum Likelihood Estimation, MLE)、最小二乘估计(Least Squares Estimation, LSE)等。在Logistic回归中,我们通常使用最大似然估计(MLE)来估计参数。
最大似然估计是一种在给定观测数据的条件下,寻找使得观测数据概率最大化的参数值的方法。在逻辑回归中,MLE尤为重要,因为逻辑回归模型的输出被解释为事件发生的概率。
逻辑回归中的MLE:
- 逻辑回归模型的似然函数是所有样本分类正确的概率的乘积。
- 对数似然函数通常被用来简化计算,因为连乘操作在对数变换后变成了求和操作。
- 通过最大化对数似然函数,可以得到逻辑回归模型的参数估计。
- 通常使用梯度下降法、牛顿法或拟牛顿法等优化算法来求解最大似然估计问题。
由于逻辑回归模型的非线性特性,最小二乘估计不适用于直接估计逻辑回归的参数。但是,有时候在逻辑回归的线性部分也可以使用类似最小二乘的方法进行参数初始化或者近似计算。
此外还有其他参数估计方法,例如贝叶斯估计、岭回归(Ridge Regression)和LASSO(Least Absolute Shrinkage and Selection Operator)以及弹性网(Elastic Net)等
参数优化:
梯度上升法
梯度上升法是一种用于求解最优化问题的迭代算法,特别是在机器学习和深度学习中广泛应用于参数估计。它与梯度下降法类似,但目标是最大化目标函数,而不是最小化损失函数。在逻辑回归等模型中,通常使用梯度上升法来最大化对数似然函数,从而找到最佳参数。
梯度上升法的原理:
梯度上升法基于这样一个观察:如果目标函数在点
处可微,那么
在
点沿着其梯度方向
增长最快。因此,可以通过在当前位置沿梯度方向前进一小步来增加
的值。
算法步骤
1.初始化:选择一个初始参数值和学习率(步长)
。
2.迭代更新:对于第( k )次迭代,参数的更新规则为:其中,
是目标函数在
点的梯度。
3.收敛判断:重复迭代更新直到满足收敛条件,例如梯度的大小小于某个阈值,或者迭代次数达到预设的上限。
学习率(步长)
学习率决定了每次迭代中参数更新的幅度。如果学习率过大,可能会导致更新过度,使得算法无法收敛或者在最优点附近震荡。如果学习率过小,算法的收敛速度会非常慢,需要更多的迭代次数。
三、使用Iris数据集实现Logistic回归:
这里使用将使用 scikit-learn
库中的经典数据集——鸢尾花(Iris)数据集,来演示如何使用逻辑回归(Logistic Regression)进行分类。在这个例子中,将手动实现梯度上升法来估计参数,并使用逻辑回归模型对数据进行分类。最后,我们将计算准确率并绘制散点图来可视化结果。
首先,导入必要的库和数据集:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征便于可视化
y = (iris.target != 0) * 1 # 将问题简化为二分类问题
鸢尾花数据集被加载到变量iris
中。只选取数据集的前两个特征(X
),以便后续可以在二维平面上可视化。目标变量(y
)被转换为二元标签,其中非0类别标记为1,0类别保持不变。
接下来,定义逻辑函数(sigmoid function)和梯度上升法更新规则:
# 定义sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 定义梯度上升法函数
def gradient_ascent(X, y, learning_rate, iterations):
m, n = X.shape
X = np.insert(X, 0, 1, axis=1) # 添加偏置项
weights = np.zeros(n + 1)
for _ in range(iterations):
z = np.dot(X, weights)
h = sigmoid(z)
gradient = np.dot(X.T, (y - h)) / m
weights += learning_rate * gradient
return weights
定义sigmoid函数:
sigmoid
函数是逻辑回归中使用的激活函数,它将任意实数值映射到(0,1)区间,用于二分类问题中预测概率。
定义梯度上升法函数:
gradient_ascent
函数实现了梯度上升优化算法,用于找到最大化对数似然函数的参数。函数接收输入特征X
、目标变量y
、学习率和迭代次数作为参数。在每次迭代中,计算损失函数的梯度并更新权重weights
。
现在,应用梯度上升法来估计参数:
# 设置超参数
learning_rate = 0.1
iterations = 1000
# 标准化数据集
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 使用梯度上升法训练逻辑回归模型
weights = gradient_ascent(X_train, y_train, learning_rate, iterations)
定义学习率和迭代次数。使用StandardScaler
对特征进行标准化处理。
使用train_test_split
函数将数据集分为训练集和测试集。
使用定义好的gradient_ascent
函数和训练集数据来训练模型。
计算模型在测试集上的准确率:
# 添加偏置项到测试集
X_test_bias = np.insert(X_test, 0, 1, axis=1)
# 预测测试集
z_test = np.dot(X_test_bias, weights)
y_pred = sigmoid(z_test) >= 0.5
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
在测试集上应用训练好的模型进行预测。
计算模型预测的准确率。
最后,绘制训练集的散点图和决策边界:
# 绘制散点图
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='red', label='Class 0')
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='blue', label='Class 1')
# 绘制决策边界
x_values = [np.min(X_train[:, 0] - 1), np.max(X_train[:, 1] + 1)]
y_values = - (weights[0] + np.dot(weights[1], x_values)) / weights[2]
plt.plot(x_values, y_values, label='Decision Boundary')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
使用matplotlib
绘制散点图,展示训练集中两个类别的数据分布。
计算并绘制决策边界,以直观地展示模型如何区分两个类别。
输出结果
输出的准确率
这里顺便提以下准确率(Accuracy)
准确率是最直观的分类评估指标,它计算的是所有预测正确的样本占总样本数的比例。尽管准确率很容易理解,但在不平衡数据集上可能不是一个好的评估指标,因为即使模型只预测多数类别,也可能得到很高的准确率。
输出的散点图: