逻辑回归
目的: 解决二分类问题(如预测是否购买、是否患病等),通过概率输出(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()