逻辑回归

目的: 解决二分类问题(如预测是否购买、是否患病等),通过概率输出(0-1 之间)判断类别归属。

方法: 它结合线性模型和 Sigmoid 函数:

Sigmoid 函数:将结果压缩在 0-1 之间

通过设定阈值(比如 0.5),让 g(z) 小于 0.5 和大于 0.5 的数据分类开。

训练逻辑回归模型: 找到一组最优参数 θ(最大似然估计)

损失函数:

  • y:真实标签(0 或 1)
  • g(z):模型预测的概率

示例代码

  import numpy as np
  import pandas as pd
  import matplotlib.pyplot as plt
  from sklearn.datasets import make_classification
  from sklearn.model_selection import train_test_split
  from sklearn.linear_model import LogisticRegression
  from sklearn.metrics import accuracy_score
  
  # === 1. 全局配置 ===
  # 解决中文显示和Matplotlib警告
  plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体
  plt.rcParams['axes.unicode_minus'] = False    # 修复负号显示
  import matplotlib
  matplotlib.use('TkAgg')  # 非交互式后端,避免警告
  
  # 数据生成:使用make_classification生成包含100个样本的二维数据,适合可视化展示
  # 数据划分:将数据按8:2的比例划分为训练集和测试集
  # 模型训练:创建逻辑回归模型并使用训练数据进行拟合
  # 预测评估:在测试集上进行预测并计算准确率
  # 可视化部分:
  # 绘制原始数据点的分布
  # 绘制决策边界展示分类效果
  # 用方形标记突出显示测试集数据点
  
  
  
  # 1. 生成模拟数据 n_samples样本数100、n_features特征数2、n_informative信息特征数(对分类有用的特征):2
  # n_redundant:冗余特征数,这里是0   n_clusters_per_class:每个类别的簇数量,这里是1,意味着对于每一类,其样本都集中在一个簇中
  # random_state 随机种子
  X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0,
                             n_clusters_per_class=1, random_state=42)
  
  # 2. 划分训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  
  # 3. 创建并训练逻辑回归模型
  model = LogisticRegression()
  model.fit(X_train, y_train)
  
  # 4. 预测并计算准确率
  y_pred = model.predict(X_test)
  # 计算真实测试集 和 预测集 : 计算分类模型的准确率
  accuracy = accuracy_score(y_test, y_pred)
  print(f"测试集准确率: {accuracy:.2f}")
  
  # 5. 可视化展示
  plt.figure(figsize=(10, 6))
  
  # 绘制原始数据点
  plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k', label='数据点')
  
  # 绘制决策边界
  x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
  y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
  # 根据给定的一维坐标向量生成对应的坐标矩阵,通常用于创建二维网格数据     linspace : 指定的间隔内返回均匀间隔的数字
  xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
                       np.linspace(y_min, y_max, 100))
  # 使用模型预测网格点的类别
  Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
  # 将预测结果重新调整为网格形状
  Z = Z.reshape(xx.shape)
  # 绘制决策边界
  plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
  
  # 标注测试集数据点
  plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm',
              edgecolors='k', marker='s', s=100, label='测试集')
  
  plt.xlabel('特征1')
  plt.ylabel('特征2')
  plt.title('逻辑回归分类结果可视化')
  plt.legend()
  plt.show()