逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法

1. 逻辑回归简介

逻辑回归是一种线性分类模型,常用于二分类问题。它通过学习特征权重,将输入映射为0 到 1 之间的概率值,并根据阈值将样本归入某一类别。逻辑回归使用Sigmoid 函数将线性结果转化为概率。

尽管名字中有“回归”,但逻辑回归主要是用于分类任务


2. 数学公式

预测函数

逻辑回归的预测公式为: h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}

  • x 为输入特征向量;
  • θ 为参数向量;
  • h_\theta(x) 表示样本属于正类的概率。
损失函数

逻辑回归的损失函数是对数损失函数(Log Loss)

J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]

  • m 为样本数量;
  • y^{(i)} 为真实标签(0 或 1);
  • h_\theta(x^{(i)}) 为第 i 个样本的预测概率。
  • θ 为权重参数。

3. 示例代码

这里用 Python + scikit-learn 实现逻辑回归模型:

示例任务:使用鸢尾花数据集进行分类
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

# 1. 加载数据集
iris = load_iris()
X = iris.data[:, :2]  # 选取前两个特征便于可视化
y = (iris.target != 0).astype(int)  # 转换成二分类问题(是否为第一类)

# 2. 数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()  # 标准化特征
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 3. 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 4. 预测并评估
y_pred = model.predict(X_test)
print("模型准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))

# 5. 可视化决策边界
def plot_decision_boundary(X, y, model):
    h = 0.01
    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, h), np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    plt.title("Logistic Regression Decision Boundary")
    plt.show()

plot_decision_boundary(X_test, y_test, model)


4. 代码说明

  1. 加载数据集

    • load_iris() 加载鸢尾花数据集,将标签转换为二分类问题(0 或 1)。
  2. 数据预处理

    • 使用 StandardScaler 对特征标准化,使其均值为 0,方差为 1。
  3. 模型训练

    • 使用 LogisticRegression 训练逻辑回归模型。
  4. 模型评估

    • 使用 accuracy_scoreclassification_report 评估模型性能。
  5. 可视化

    • 绘制逻辑回归的决策边界

5. 模型分析与扩展

优点
  • 输出概率值,具有良好的可解释性;
  • 计算简单,训练速度快;
  • 适合线性可分问题。
缺点
  • 对于复杂的非线性关系表现不佳;
  • 容易受到异常值的影响。
扩展
  • 多分类逻辑回归:通过 multi_class='multinomial'solver='lbfgs' 参数,逻辑回归可以实现多分类。
  • 正则化penalty 参数可设置 L1(Lasso)或 L2(Ridge)正则化来防止过拟合。

6. 进一步提升

  • 特征工程:创建更多有效的特征,如多项式特征。
  • 正则化:合理设置正则化参数 C 以控制模型复杂度。
  • 非线性模型:如果逻辑回归效果不佳,可以尝试更复杂的非线性模型,如 SVM 或神经网络。

逻辑回归模型输入数据格式

LogisticRegression 模型来自 scikit-learn 库,fit(X_train, y_train) 方法用于训练模型。这里的 X_trainy_train 是输入特征和标签,要求的数据格式如下:


1. X_train(特征矩阵)

  • 类型numpy.ndarraypandas.DataFrame 或其他可被转换为 NumPy 数组的格式。
  • 形状(n_samples, n_features)
    • n_samples:样本数量(行数)。
    • n_features:每个样本的特征数量(列数)。
示例

如果有 100 个样本,每个样本有 4 个特征,那么 X_train 的形状为 (100, 4)

X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    ...  # 省略其他样本
                    ])

2. y_train(标签向量)

  • 类型numpy.ndarraypandas.Series 或其他可被转换为一维数组的格式。
  • 形状(n_samples,)
    • n_samples:标签数量,必须与 X_train 的样本数量相同。
值的范围
  • 二分类问题时,y_train 通常为 0 或 1;
  • 多分类问题时,y_train 为类别索引(如 0、1、2 等整数)。
示例

如果有 100 个样本,y_train 为长度为 100 的一维数组:

y_train = np.array([0, 1, 0, 1, 1, 0, ...])

3. 输入数据注意事项

  1. 缺失值

    • X_train 不允许有缺失值(NaN),可以使用 SimpleImputer 等方法填充缺失值。
  2. 数据类型

    • 输入数据最好为浮点型。可以通过 X_train.astype(float) 将数据转换为 float 类型。
  3. 标准化/归一化

    • 对特征进行标准化或归一化可以加快模型收敛速度,尤其是当特征值的量级差距较大时。

4. 示例代码

以下是完整的数据格式示例:

import numpy as np
from sklearn.linear_model import LogisticRegression

# 示例数据
X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    [4.7, 3.2, 1.3, 0.2]])
y_train = np.array([0, 1, 0])  # 标签对应样本类别

# 模型训练
model = LogisticRegression()
model.fit(X_train, y_train)

5. 输出

  • 训练后的模型:保存了特征权重 theta,可以通过 model.coef_ 查看;
  • 预测新数据:调用 model.predict(X_test),输入格式同 X_train

总结:X_train 为二维矩阵,y_train 为一维向量,并且二者的样本数量需要一致。如果数据有问题(如缺失值或数据类型不匹配),需要在训练前进行预处理。

### 实现逻辑回归并应用于MNIST数据集 #### 1. 环境准备 为了实现逻辑回归并对MNIST数据集进行分类,可以使用Python及其科学计算库(如NumPy、Pandas)、机器学习框架(如Scikit-Learn、TensorFlow或Theano)。以下是基于Scikit-Learn的实现方法。 #### 2. 数据加载预处理 MNIST是一个手写数字图像数据集,通常用于验证机器学习算法的效果。可以通过`sklearn.datasets.fetch_openml`来获取MNIST数据集[^3]。在实际操作前,需对数据进行标准化和独热编码处理: ```python from sklearn.datasets import fetch_openml import numpy as np # 加载 MNIST 数据集 mnist = fetch_openml('mnist_784', version=1, parser='auto') X, y = mnist["data"], mnist["target"] # 将标签转换为整数类型 y = y.astype(np.int8) # 归一化特征值至 [0, 1] X = X / 255.0 ``` 上述代码完成了数据的加载以及归一化处理。 #### 3. 划分训练测试集 将数据划分为训练集和测试集以便评估模型性能: ```python from sklearn.model_selection import train_test_split # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 此过程确保了模型能够在未见过的数据上进行有效评估。 #### 4. 构建逻辑回归模型 利用Scikit-Learn中的`LogisticRegression`类构建逻辑回归模型,并设置合适的超参数以优化性能: ```python from sklearn.linear_model import LogisticRegression # 初始化逻辑回归模型 model = LogisticRegression(max_iter=1000, solver="lbfgs", multi_class="multinomial") # 训练模型 model.fit(X_train, y_train) ``` 这里选择了LBFGS求解器和支持多分类的任务模式。 #### 5. 性能评估 完成模型训练后,可对其在测试集上的表现进行评价: ```python from sklearn.metrics import accuracy_score, classification_report # 预测测试集结果 y_pred = model.predict(X_test) # 输出准确率 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy * 100:.2f}%") # 打印详细的分类报告 report = classification_report(y_test, y_pred) print(report) ``` 以上代码展示了如何衡量模型精度及各类别的具体表现情况。 #### 6. 可视化预测结果 为进一步理解模型效果,可通过可视化手段查看某些样例的实际输出预测对比: ```python import matplotlib.pyplot as plt def plot_digit(image_data): image = image_data.reshape(28, 28) plt.imshow(image, cmap="binary") plt.axis("off") # 显示一些随机选取的手写字体图片其预测值 indices = np.random.choice(len(X_test), size=9, replace=False) for i, index in enumerate(indices): plt.subplot(3, 3, i + 1) plot_digit(X_test.iloc[index]) true_label = y_test.iloc[index] predicted_label = y_pred[index] color = 'green' if true_label == predicted_label else 'red' plt.title(f"{true_label} ({predicted_label})", fontsize=10, color=color) plt.tight_layout() plt.show() ``` 这段脚本会生成一幅由九张子图组成的网格图形,每幅子图代表一个样本的真实类别预测类别之间的关系。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值