逻辑回归是⼀种⽤于解决⼆分类问题的监督学习算法,其基本原理是使⽤ 逻辑函数(也称为Sigmoid函数) 来建模
因变量(输出)与⾃变量(输⼊)之间的概率关系。逻辑回归的⽬标是估计某个事件发⽣的概率,通常表示为0或
1,例如肿瘤是恶性(1)或良性(0)。
1.基本原理
逻辑回归基于以下思想:我们希望将线性组合的输出映射到⼀个介于0和1之间的概率值,以表示事件发⽣的可能性。为此,逻辑回归使⽤逻辑函数(Sigmoid函数)来执⾏这种映射。
逻辑回归的基本原理如下:
- 假设数据服从⼀个二项分布。
- 使⽤线性回归模型的线性组合来建模数据的对数⼏率。
- 对线性组合应⽤逻辑函数(Sigmoid函数),将连续的输出转换为概率值。
- 根据概率值进⾏分类,通常设置⼀个阈值来决定类别。
2.公式模型
逻辑回归的核⼼公式可以表示为:
在这个公式中:
P(y=1|X)
是事件发⽣的概率,也就是因变量(输出)等于1的概率。- X是输⼊⾃变量(特征)的向量,包括
x1,x2...xn
。 w0,w1....wn
是模型的参数, w0是截距,w1....wn
是⾃变量x1,x2...xn
的权重。- e是⾃然对数的底(约等于2.71828)。
这个公式中的指数部分-(w0+w1x1+w2x2+...+wnxn)
表示线性组合的结果,然后通过Sigmoid
函数进⾏映射,将其压缩到0和1之间。
Sigmoid函数的数学表达式是:
其中, 是任何实数值。Sigmoid
函数具有S形曲线,因此可以将线性组合的输出映射到0到1之间的概率值,使得逻辑回归可以⽤于⼆分类问题。
逻辑回归的训练⽬标是找到最佳的参数w0,w1....wn
,以最⼤程度地拟合观测数据,并使得预测的概率尽可能接近实际的类别标签。通常使⽤最⼤似然估计等⽅法来优化参数。
逻辑回归⼴泛⽤于许多领域,包括医学诊断、⾦融⻛险评估、⾃然语⾔处理、图像分类等,特别适⽤于⼆分类问题
3.优缺点
优点:
- 实现简单:逻辑回归是⼀种简单且易于实现的分类算法。
- 计算效率⾼:训练速度快,适⽤于⼤规模数据集。
- 输出结果具有概率意义:可以得到样本属于某个类别的概率,⽽不仅仅是⼀个硬分类结果。
缺点:
- 仅适⽤于⼆分类问题:逻辑回归通常只适⽤于解决⼆分类问题。
- 对特征空间的线性边界限制:逻辑回归假设特征之间的关系是线性的,对于⾮线性问题效果不佳。
4.适用场景
逻辑回归适⽤于以下场景:
- ⼆分类问题:当需要解决⼆分类问题时,逻辑回归是⼀个简单⽽有效的选择。
- 需要得到概率输出的场景:逻辑回归可以输出样本属于某个类别的概率,适⽤于需要概率预测的任务,如风险评估、客户流失预测等。
- 需要快速建⽴基准模型的情况下,逻辑回归也是⼀个不错的选择。
逻辑回归是⼀种简单⽽强⼤的分类算法,尤其适⽤于⼆分类问题和需要概率输出的场景。然而,在处理⾮线性问题时,逻辑回归的表现可能不如⼀些复杂的⾮线性模型。
5.逻辑回归及鸢尾花数据集预测
下⾯使⽤鸢尾花数据集(Iris dataset)。这个数据集包含了三种不同种类的鸢尾花的花萼⻓度和宽度。
⾸先加载了鸢尾花数据集,并选择了其中的两个特征(花萼⻓度和宽度)。然后我们训练了⼀个逻辑回归模型,并在测试集上进⾏了预测。接着,我们计算了模型的准确率,并绘制了决策边界,以便可视化模型的分类效果。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
from matplotlib.colors import ListedColormap
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2] # 只选择前两个特征⽤于可视化
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)
# 在测试集上进⾏预测
y_pred = lr.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 绘制决策边界
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
np.arange(y_min, y_max, 0.01))
Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.contourf(xx, yy, Z, alpha=0.8, cmap=ListedColormap(('red', 'green', 'blue')))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=ListedColormap(('red', 'green', 'blue')),
edgecolors='k')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.title('Logistic Regression Decision Boundary')
plt.show()