线性回归VS逻辑回归:解析与实战

线性回归(Linear Regression)和逻辑回归(Logistic Regression)是机器学习中最基础、最重要的两种监督学习算法。


一、线性回归

1、原理介绍

核心目标

预测连续值(如房价、温度、销售额)。

基本思想

假设特征(输入)与目标(输出)之间存在线性关系 ,通过拟合一条"最佳直线"(或超平面)来预测新数据。寻找最佳直线的过程就是在做线性回归。

数学模型

对于一个样本 x=(x1,x2,...,xn)x=(x1​,x2​,...,xn​) ,预测值为:

  • w=(w0,w1,...,wn)w=(w0,w1,...,wn) :模型参数( w0是偏置项)
  • y^ :预测的连续值(如 50.3 万元)
损失函数

如何衡量**"最佳"** ?使用 均方误差(MSE)

欧氏距离其实就是用来量化预测结果和真实结果的误差的一个函数。在线性回归中称呼他为损失函数,也就是计算误差的函数。

目标:最小化 MSE → 找到最优 w(模型参数)

求解方法
  • 正规方程:直接解析解(适合小数据)
  • 梯度下降):迭代优化(适合大数据)

2、实战代码示例:

python 复制代码
import pandas as pd
from sklearn.linear_model import LinearRegression

# 导入数据
data = pd.read_csv('多元线性回归数据.csv', encoding='gbk')

# 划分特征X和目标Y
X = data[['特征1', '特征2', ...]]
Y = data[['目标Y']]

# 创建并训练模型
model = LinearRegression()
model.fit(X, Y)

# 预测
y_pred = model.predict(X)

# 评估指标
from sklearn.metrics import mean_squared_error, r2_score
mse = mean_squared_error(Y, y_pred)
r2 = r2_score(Y, y_pred)

print(f"均方误差 (MSE): {mse:.2f}")
print(f"决定系数 (R²): {r2:.4f}")

📊 R² 解读:

  • R² = 1:完美拟合
  • R² = 0:模型不优于"用平均值预测"
  • R² < 0:模型比平均值还差

可视化:

python 复制代码
import matplotlib.pyplot as plt
# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False      # 解决负号显示为方框的问题

# --- 图1:真实值 vs 预测值 ---
plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.scatter(Y, y_pred, alpha=0.7, color='steelblue')
plt.plot([Y.min(), Y.max()], [Y.min(), Y.max()], 'r--', linewidth=2)  # 理想拟合线
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title(f'真实值 vs 预测值 (R² = {r2:.4f})')
plt.grid(True, linestyle='--', alpha=0.6)

# --- 图2:残差图(Residual Plot)---
residuals = Y - y_pred
plt.subplot(1, 2, 2)
plt.scatter(y_pred, residuals, alpha=0.7, color='darkorange')
plt.axhline(0, color='red', linestyle='--', linewidth=2)
plt.xlabel('预测值')
plt.ylabel('残差 (真实值 - 预测值)')
plt.title('残差图')
plt.grid(True, linestyle='--', alpha=0.6)

# 调整布局并显示
plt.tight_layout()
plt.show()

二、逻辑回归

1、原理介绍

核心目标

预测离散类别(分类问题) ,尤其是二分类 (如是否患病)。简单一句话来说,逻辑回归就是用来分类的。

基本思想

虽然叫"回归",但本质是分类算法 !它先用线性模型计算一个"得分",再通过 Sigmoid 函数 将其映射到 0~1 的概率

数学模型

1.先计算线性组合:

2.再通过 Sigmoid 函数得到概率:

3.最终分类决策

分类效果如下面图形所示:

Sigmoid 函数将线性决策边界(直线)两侧的原始线性得分 z,转换为 (0, 1) 区间内的"属于正类的概率"。

  • 直线一侧( z>0 ) → 转换为 大于 0.5 的概率(越远离直线,概率越接近 1)
  • 直线另一侧( z<0 ) → 转换为 小于 0.5 的概率(越远离直线,概率越接近 0)
  • 恰好在直线上( z=0 ) → 概率为 0.5

2、实战代码示例:

任务目标

根据肿瘤大小(size)判断是否为恶性(malignant: 0=良性, 1=恶性)


导入库 & 设置
python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
步骤 1:生成分类数据
python 复制代码
# 模拟医疗数据
np.random.seed(42)
size_benign = np.random.normal(10, 2, 80)    # 良性:均值10
size_malignant = np.random.normal(18, 3, 70) # 恶性:均值18

# 合并数据
size = np.concatenate([size_benign, size_malignant])
label = np.concatenate([np.zeros(80), np.ones(70)])  # 0=良性, 1=恶性

df = pd.DataFrame({'size': size, 'malignant': label})
print(df.head())

步骤 2:准备数据
python 复制代码
X = df[['size']]
y = df['malignant']

步骤 3:划分数据集
python 复制代码
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y  # 保持类别比例
)

💡 stratify=y:确保训练/测试集中良恶性比例一致


步骤 4:训练逻辑回归模型
python 复制代码
from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

🔍 注意:逻辑回归默认使用 L2 正则化 ,可通过 penalty='none' 关闭


步骤 5:预测概率与类别
python 复制代码
# 预测概率(属于恶性 class=1 的概率)
y_prob = model.predict_proba(X_test)[:, 1]

# 预测类别(默认阈值 0.5)
y_pred = model.predict(X_test)

print("前5个样本的恶性概率:", y_prob[:5].round(3))
print("前5个预测类别:", y_pred[:5])

💡 输出示例:
恶性概率: [0.021 0.987 0.005 0.992 0.876]
预测类别: [0 1 0 1 1]


步骤 6:评估分类效果
python 复制代码
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

acc = accuracy_score(y_test, y_pred)
print(f"准确率: {acc:.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=['良性', '恶性']))

# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
            xticklabels=['良性', '恶性'],
            yticklabels=['良性', '恶性'])
plt.title('混淆矩阵')
plt.ylabel('真实标签')
plt.xlabel('预测标签')
plt.show()

📊 关键指标:

  • 准确率(Accuracy):整体正确率
  • 精确率(Precision):预测为恶性中,真恶性的比例
  • 召回率(Recall):所有真恶性中,被找出来的比例

步骤 7:可视化决策边界
python 复制代码
# 生成平滑曲线
x_plot = np.linspace(X.min(), X.max(), 300).reshape(-1, 1)
prob_plot = model.predict_proba(x_plot)[:, 1]

plt.figure(figsize=(8, 5))
plt.scatter(X[y==0], y[y==0], color='green', label='良性', alpha=0.6)
plt.scatter(X[y==1], y[y==1], color='red', label='恶性', alpha=0.6)
plt.plot(x_plot, prob_plot, color='blue', linewidth=2, label='Sigmoid 概率曲线')
plt.axhline(0.5, color='gray', linestyle='--', linewidth=1)  # 阈值线
plt.axvline(-model.intercept_[0]/model.coef_[0][0], color='purple', linestyle=':', label='决策边界')
plt.xlabel('肿瘤大小')
plt.ylabel('恶性概率')
plt.title('逻辑回归:肿瘤分类')
plt.legend()
plt.show()

图中:

  • 蓝线:Sigmoid 概率曲线
  • 紫线:决策边界(概率=0.5 对应的 size 值)
  • 灰线:概率 0.5 阈值

🔚 总结对比

项目 线性回归 逻辑回归
任务 回归(预测连续值) 分类(预测离散标签)
输出 实数(如 50.3) 概率(0~1)→ 转为 0/1
核心函数 无(直接输出) Sigmoid
损失函数 MSE Log Loss
评估指标 R², MSE 准确率, 精确率, 召回率
sklearn 类 LinearRegression LogisticRegression
相关推荐
只是懒得想了7 小时前
C++实现密码破解工具:从MD5暴力破解到现代哈希安全实践
c++·算法·安全·哈希算法
m0_736919107 小时前
模板编译期图算法
开发语言·c++·算法
dyyx1117 小时前
基于C++的操作系统开发
开发语言·c++·算法
m0_736919107 小时前
C++安全编程指南
开发语言·c++·算法
蜡笔小马7 小时前
11.空间索引的艺术:Boost.Geometry R树实战解析
算法·r-tree
-Try hard-7 小时前
数据结构:链表常见的操作方法!!
数据结构·算法·链表·vim
2301_790300967 小时前
C++符号混淆技术
开发语言·c++·算法
我是咸鱼不闲呀7 小时前
力扣Hot100系列16(Java)——[堆]总结()
java·算法·leetcode
嵌入小生0077 小时前
单向链表的常用操作方法---嵌入式入门---Linux
linux·开发语言·数据结构·算法·链表·嵌入式
LabVIEW开发7 小时前
LabVIEW金属圆盘压缩特性仿真
算法·labview·labview知识·labview功能·labview程序