摘要:本文通过线性组合和逻辑函数,引入逻辑回归的基本原理,引申讲述非线性处理的作用,以及如何上手建立逻辑回归模型,一文读懂逻辑回归算法。
01 逻辑回归的概念和原理
逻辑回归通过使用逻辑函数将线性组合的输出映射到(0,1)的取值范围,用以表示概率,来处理二分类问题
一句话看本质:逻辑回归的本质可以理解为通过引入激活函数(如Sigmoid函数)将线性回归模型转化为一个概率模型,从而能够进行分类任务。在逻辑回归中,模型使用最大似然估计来估计参数,使得预测的概率最大化。通过对参数的优化,逻辑回归能够挖掘出隐藏特征(即概率),并根据概率进行分类。
02 逻辑回归的应用场景
逻辑回归通常用于二分类问题(sigmoid),也可以通过Softmax激活函数实现多分类。
主要的应用场景有:
应用场景 | 逻辑回归 |
医学 | 预测患者是否患有某种疾病 |
金融 | 信用评分预测违约风险 |
广告点击预测 | 用户是否点击广告 |
情感分析 | 正面或负面情感分类 |
手写数字识别 | 二元分类每个数字 |
语音识别 | 区分说话者是否是特定人 |
面部识别 | 人脸是否属于某个人 |
03 激活函数(引入非线性)的重要性
引申1:非线性变换是处理复杂、非线性问题的关键。
先举一个实际生活中的栗子,例如在一定的温度范围内,温度的升高会导致森林覆盖率增加,但超过这个范围,过高的温度可能会导致森林覆盖率下降。所以大多实际问题都是非线性的。非线性变换在机器学习中具有重要的意义:
-
增强模型的表达能力:线性模型只能学习到输入特征之间的线性关系,而真实世界中的许多问题是非线性的。通过引入非线性变换,模型可以学习和表示更为复杂的、非线性的关系,提高了模型的表达能力。
-
处理复杂的决策边界:在分类问题中,非线性变换可以帮助模型学习到复杂的决策边界,使得模型更好地适应数据中的非线性结构。这对于解决复杂的分类问题尤其重要。
-
特征的交互和高阶关系:非线性变换可以帮助模型学习到特征之间的交互关系和高阶关系。例如,二次项、三次项等可以捕捉到特征之间的曲线和高阶模式,使得模型能够更好地拟合数据。
-
避免欠拟合:当数据包含复杂的非线性结构时,使用线性模型可能导致欠拟合。非线性变换可以提高模型的灵活性,使其能够更好地拟合训练数据。
-
神经网络的学习:在深度学习中,神经网络的层之间的非线性激活函数是引入非线性的主要手段。这种非线性变换允许神经网络逐层地学习复杂的特征表示,从而提高了网络的学习能力。
举例来说,对于图像识别任务,图像中的对象通常具有复杂的形状和结构,线性模型很难捕捉到这些复杂的视觉模式。引入非线性激活函数,例如ReLU,可以使神经网络学习到更复杂的特征,从而提高图像识别的性能。
再引申一下,激活函数通过在神经网络中引入非线性,而核函数升维通过映射数据到高维空间来处理原始空间中的线性不可分问题。日常很多时候,我们不识庐山真面目,只缘身在此山中,也可以说我们正处于低维阶段,需要升维一下,通过引入更多的信息(更多更高的维度),很多问题变得简单了,或者说可理解了。和我们的思维方式升维感觉有异曲同工之处。
04 引入非线性变换的手段
引申2:可以通过激活函数和核函数引入非线性变换。
核函数和激活函数有不同的应用场景和目的,主要的本质区别在于它们在模型中的作用和使用方式:
区别 | 激活函数 | 核函数 |
作用 | 引入非线性,使得神经网络能够学习和表示更为复杂的函数。 | 主要用于支持向量机(SVM)等模型,在特征空间中引入非线性映射。 |
实现 | 在神经网络中,每层的激活函数将输入的线性组合映射到非线性空间,生成了新的抽象特征。 | 将输入空间映射到更高维的特征空间,使得在低维空间中无法线性分割的问题,在高维空间中变得可分。 |
常见激活/核函数 | Sigmoid、Tanh、ReLU、Leaky ReLU等。 | 多项式核函数、高斯核函数(RBF核函数)、Sigmoid核函数等 |
05 什么是sigmoid函数(逻辑函数)
Sigmoid函数,也称为 logistic 函数。
函数的数学公式为:
其中,e是自然对数的底数。这个函数的图形呈S形状,因此得名 Sigmoid。Sigmoid函数在逻辑回归等模型中被用作激活函数,它将模型的线性输出映射到 (0, 1) 的范围内,使其可以解释为概率。
线性函数作为参数,输入sigmoid函数代码实现及可视化:
import numpy as np
import matplotlib.pyplot as plt
# 定义线性函数
def linear_function(x):
return x + 1 # 添加乘号以修复语法错误
# 定义 sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 生成 x 值
x_values = np.linspace(-5, 5, 100)
# 计算线性函数的值
linear_values = linear_function(x_values)
# 计算对应的 sigmoid 函数的值
sigmoid_values = sigmoid(linear_values)
# 绘制线性函数和 sigmoid 函数在同一个图中
plt.figure(figsize=(8, 6))
# 线性函数的可视化
plt.plot(x_values, linear_values, label='Linear Function: $f(x) = x + 1$', color='blue')
# sigmoid 函数的可视化
plt.plot(x_values, sigmoid_values, label='Sigmoid Function', color='red')
# 显示 sigmoid 函数取值范围的虚线
plt.axhline(y=0, color='black', linestyle='--', label='Sigmoid Range (0, 1)')
plt.axhline(y=1, color='black', linestyle='--')
plt.title('Linear Function and Sigmoid Function')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()
运行显示如下:
单独显示sigmoid函数如图:
05 逻辑回归代码实现
本案例使用Breast Cancer数据集,它是一个常用的数据集,包含了从乳腺癌患者收集的30个肿瘤特征的测量值(如肿瘤的半径、纹理、对称性等),以及目标变量是二分类的相应的良性或恶性标签。
-
1 导入必要的库和数据:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
# 加载Breast Cancer数据集
data = load_breast_cancer()
X = data.data
y = data.target
-
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_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# PCA降维
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_scaled)
X_test_pca = pca.transform(X_test_scaled)
# 可视化X_train_pca
plt.scatter(X_train_pca[:, 0], X_train_pca[:, 1], c=y_train, cmap='viridis', edgecolors='k', marker='o')
plt.title('PCA Visualization of X_train')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
本文为了使得数据更容易可视化,将特征降为2维,代码中PCA通过找到2个最重要的特征,作为新的特征,将高维数据转换为低维数据。训练数据可视化如下,黄色散点为良性(0),紫色散点为恶性(1),横坐标纵坐标为降维后的两个特征。
-
3 进行模型训练和预测
# 初始化逻辑回归模型
model = LogisticRegression()
# 训练模型
model.fit(X_train_pca, y_train) # 使用降维后的特征进行训练
# 预测
y_pred = model.predict(X_test_pca) # 使用降维后的特征进行预测
# 准确性评估
accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确性: {accuracy}')
# 输出模型参数
print(f'模型系数 (coef_): {model.coef_}')
print(f'模型截距 (intercept_): {model.intercept_}')
逻辑回归通过最大似然估计来求最优参数,模型性能指标和模型参数如下,其中模型参数表示决策边界的斜率和截距:
-
4 可视化决策边界和降维后的数据点
# 可视化决策边界和降维后的数据点
def plot_decision_boundary(model, X, y, title):
h = .02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界
plt.contour(xx, yy, Z, colors='r', linewidths=2)
# 绘制降维后的数据点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k', marker='o', label='Data Points')
plt.title(title)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.show()
# 可视化决策边界和降维后的数据点
plot_decision_boundary(model, X_train_pca, y_train, 'Decision Boundary and PCA Visualization')
上图这条红线就是决策边界,决策边界是线性方程的一个等高线(等概率线),在二分类问题中通常对应于概率为0.5的地方。在二维空间中,决策边界是一个直线;在更高维的空间中,它是一个超平面。在预测时,当这个概率值大于0.5时,模型将样本分配给类别1;当概率值小于等于0.5时,模型将样本分配给类别0。
06 总结
逻辑回归通过训练过程,模型学习了如何调整截距和特征系数,以最好地分隔不同类别的数据点。逻辑回归最终学到的参数为决策边界的线性回归方程的系数。
逻辑回归的预测函数可以表示为:
决策边界方程:
其中β是模型参数(截距和特征系数);
X是输入的特征。
本文模型训练得到的决策边界即:-1.90X₁+1.06X₂+0.48=0
呼应文章开头,再来读一遍,应该有更深的体会:逻辑回归的决策边界是由线性方程定义的,这个线性方程是输入特征的线性组合。线性组合的结果经过逻辑函数的转换,将其映射到(0,1)的概率范围,从而实现二分类。
参考文献:
李航.统计学习方法.清华大学出版社
阅读原文,有福利:
看到这里了,点个赞加个关注吧,发消息交流下。
关注微信公众号(搜一搜:de2plearn)发消息“逻辑回归”下载代码notebook。