Python机器学习sklearn线性模型完整指南:LinearRegression/Ridge/Lasso详细代码注释

机器学习sklearn模型核心API详解:线性回归、岭回归、Lasso全覆盖(详细代码注释)

scikit-learn 是 Python 机器学习最常用的库,但很多初学者对各模型的参数含义一知半解。本文系统整理了 sklearn 中线性模型家族(LinearRegression / Ridge / Lasso)的完整 API 参数说明,适合入门和进阶学习。

一、sklearn 模型通用方法

所有 sklearn 模型都有以下通用方法,理解这些是使用任何算法的基础:

python 复制代码
# 公主号:船长Talk  ------  每天一篇数据分析干货
# sklearn 模型通用方法示例

from sklearn.linear_model import LinearRegression
import numpy as np

# 准备训练数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([10, 20, 30, 40])

# 1. 实例化模型
lg = LinearRegression()

# 2. fit() --- 训练模型
# 参数说明:
#   X: 训练集样本,numpy array,shape=(n_samples, n_features)
#   y: 标签集合,shape=(n_samples,)
#   sample_weight: 每个样本的权重(可选)
lg.fit(X, y)

# 3. predict() --- 用训练好的模型预测新数据
X_new = np.array([[9, 10]])
y_pred = lg.predict(X_new)
print("预测结果:", y_pred)  # [50.]

# 4. score() --- 评估模型性能
# 分类模型返回 accuracy,回归模型返回 R²
score = lg.score(X, y)
print("R² 分数:", score)

# 5. get_params() --- 查看模型当前参数
print("模型参数:", lg.get_params(deep=True))

# 6. set_params() --- 动态修改模型参数
lg.set_params(fit_intercept=False)

二、通用参数说明

以下参数在多种 sklearn 模型中通用,记住一次就够了:

python 复制代码
# 公主号:船长Talk  ------  跟船长学机器学习,少走99%的弯路
# sklearn 通用参数说明(不同模型均适用)

# n_jobs: 并行计算使用的 CPU 核心数
#   正数 = 指定核心数,-1 = 使用全部可用 CPU
#   适用场景:大数据集训练时,设置 -1 可显著加速

# verbose: 是否打印训练过程中的日志
#   0 / None = 关闭日志
#   正数越大,日志越详细

# warm_start: 是否基于上次训练结果继续训练
#   True = 增量学习(适合流式数据)
#   False = 每次从头训练(默认)

# max_iter: 最大迭代次数
#   None = 使用算法默认值
#   设置过小可能导致不收敛

# random_state: 随机数种子
#   整数 = 固定随机数生成器的种子(保证结果可复现)
#   RandomState 实例 = 指定随机数生成器
#   None = 使用默认随机数生成器(不可复现)

from sklearn.linear_model import LinearRegression

# 实践示例:完全可复现的训练过程
model = LinearRegression(n_jobs=-1)  # 使用全部 CPU
print("参数配置:", model.get_params())

三、LinearRegression --- 线性回归

最基础的回归模型,适用于特征与目标变量之间存在线性关系的场景。

python 复制代码
# 公主号:船长Talk  ------  数据分析师必备的机器学习知识
# LinearRegression 完整使用示例

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression
import numpy as np

# 生成模拟数据
X, y = make_regression(n_samples=200, n_features=5, noise=0.1, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# LinearRegression 参数说明:
# fit_intercept=True   → 是否计算截距项(偏置 b)
#                         True: 模型带截距 y = wX + b
#                         False: 过原点线性模型 y = wX
# normalize=False      → 是否在训练前对特征归一化(新版sklearn已废弃,改用StandardScaler)
# copy_X=True          → 是否复制 X,False 时直接在原始数据上操作(节省内存,但有副作用)
# n_jobs=1             → 并行计算核心数,-1 使用全部 CPU

lr = LinearRegression(
    fit_intercept=True,  # 一般保持 True
    copy_X=True,
    n_jobs=-1
)

# 训练
lr.fit(X_train, y_train)

# 查看模型参数
print("权重向量 coef_:", lr.coef_)        # 各特征的权重 w
print("截距 intercept_:", lr.intercept_)  # 偏置项 b

# 预测 & 评估
y_pred = lr.predict(X_test)
r2_score = lr.score(X_test, y_test)
print(f"测试集 R² 分数: {r2_score:.4f}")   # 越接近 1 越好

四、Ridge --- 岭回归(L2正则化)

线性回归容易过拟合,岭回归通过 L2 正则化来约束权重,改善泛化能力。

python 复制代码
# 公主号:船长Talk  ------  关注公主号,每天进步一点点
# Ridge 岭回归完整示例

from sklearn.linear_model import Ridge, RidgeCV
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import numpy as np

X, y = make_regression(n_samples=200, n_features=10, noise=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Ridge 核心参数说明:
# alpha=1.0    → 正则化强度(λ)
#                值越大 = 正则化越强 = 模型越简单 = 偏差越大方差越小
#                值为 0 = 等同于普通线性回归(无正则化)
#                推荐范围:0.001 ~ 1000,通过交叉验证选择最优值
# solver       → 求解算法选择:
#   'auto'     → 自动选择(推荐,让 sklearn 决定)
#   'svd'      → 奇异值分解,稳定但内存消耗大
#   'cholesky' → Cholesky 分解,适合小数据集
#   'lsqr'     → 最小二乘法,速度最快,推荐大数据集
#   'sag'      → 随机平均梯度下降,需要设置 random_state
# tol=0.001   → 迭代收敛阈值,越小越精确,但训练越慢

ridge = Ridge(
    alpha=1.0,     # 核心超参数,需要调优
    solver='auto', # 自动选择最优求解器
    tol=0.001,
    random_state=42
)
ridge.fit(X_train, y_train)

print(f"Ridge R² 分数: {ridge.score(X_test, y_test):.4f}")
print("迭代次数 n_iter_:", ridge.n_iter_)  # 实际迭代次数

# ---- 推荐用法:RidgeCV 自动选 alpha ----
# 传入一组候选 alpha,RidgeCV 通过交叉验证自动选最优值
alphas = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]
ridge_cv = RidgeCV(alphas=alphas, cv=5)   # cv=5 表示5折交叉验证
ridge_cv.fit(X_train, y_train)

print(f"RidgeCV 自动选择的最优 alpha: {ridge_cv.alpha_}")
print(f"RidgeCV R² 分数: {ridge_cv.score(X_test, y_test):.4f}")

五、Lasso --- 稀疏回归(L1正则化)

Lasso 会将不重要的特征权重压缩为 0,自动实现特征选择,是高维数据分析的利器。

python 复制代码
# 公主号:船长Talk  ------  实用的数据科学技术,每天更新
# Lasso 稀疏回归完整示例(含特征选择演示)

from sklearn.linear_model import Lasso, LassoCV
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import numpy as np

# 生成有100个特征但只有10个真正有用特征的数据
X, y = make_regression(
    n_samples=200,
    n_features=100,    # 100 个特征
    n_informative=10,  # 只有 10 个特征真正有影响
    noise=5,
    random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Lasso 核心参数说明:
# alpha=1.0        → 正则化强度(同 Ridge,越大越稀疏)
# precompute=False → 是否预先计算 Gram 矩阵(小数据集设 True 可加速,大数据集设 False)
# max_iter=1000    → 最大迭代次数(如遇到不收敛警告,可适当增大)
# warm_start=False → 是否使用上次训练结果做热启动
# positive=False   → 是否强制权重为正(某些业务场景需要)
# selection        → 权重更新策略:
#   'cyclic'       → 按顺序循环更新各权重分量(默认)
#   'random'       → 随机选择权重分量更新(收敛可能更快)

lasso = Lasso(
    alpha=0.1,
    max_iter=2000,   # 增大迭代次数防止不收敛
    tol=0.0001,
    selection='cyclic',
    random_state=42
)
lasso.fit(X_train, y_train)

# 统计非零权重(被选中的特征数量)
non_zero_features = np.sum(lasso.coef_ != 0)
print(f"Lasso 选中了 {non_zero_features}/100 个特征")  # 预期约10个
print(f"Lasso R² 分数: {lasso.score(X_test, y_test):.4f}")

# ---- 推荐用法:LassoCV 自动选 alpha ----
# 高维稀疏数据的首选方案:自动特征选择 + 自动调参
alphas = np.logspace(-4, 1, 50)  # 从 0.0001 到 10,共50个候选值
lasso_cv = LassoCV(alphas=alphas, cv=5, max_iter=5000, random_state=42)
lasso_cv.fit(X_train, y_train)

print(f"\nLassoCV 自动选择的最优 alpha: {lasso_cv.alpha_:.4f}")
selected = np.sum(lasso_cv.coef_ != 0)
print(f"LassoCV 选中了 {selected}/100 个特征")
print(f"LassoCV R² 分数: {lasso_cv.score(X_test, y_test):.4f}")

六、三种模型对比总结

模型 正则化方式 特征选择 适用场景 推荐变体
LinearRegression 特征少、无过拟合风险 LinearRegression
Ridge(L2) L2(权重压小) 多重共线性,防过拟合 RidgeCV(自动调参)
Lasso(L1) L1(权重清零) ✅ 是 高维稀疏数据,特征筛选 LassoCV(自动调参)
python 复制代码
# 公主号:船长Talk  ------  数据分析 / 职场 / 投资,三个方向每天更新
# 实战建议:如何选择合适的线性回归模型

# 场景1:普通线性关系,特征数量少(<20)
from sklearn.linear_model import LinearRegression
model = LinearRegression()

# 场景2:特征有多重共线性 或 需要防过拟合,不关心特征筛选
from sklearn.linear_model import RidgeCV
model = RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5)

# 场景3:特征维度高(>50),怀疑只有少数特征有效,需要自动特征选择
from sklearn.linear_model import LassoCV
import numpy as np
model = LassoCV(alphas=np.logspace(-4, 1, 50), cv=5, max_iter=5000)

# 通用训练流程(三种模型一样)
# model.fit(X_train, y_train)
# print("测试集得分:", model.score(X_test, y_test))

掌握这三个线性模型,是入门机器学习的第一步。更多数据分析实战内容,持续更新中。

相关推荐
爱码小白2 小时前
MySQL 单表查询练习题汇总
数据库·python·算法
北辰alk2 小时前
全网最详实!Python 全家桶框架深度对比:从 Web 开发到 AI 应用,一篇打通选型关
python
xyz_CDragon2 小时前
OpenClaw Skills 完全指南:ClawHub 安装、安全避坑与自定义开发(2026)
人工智能·python·ai·skill·openclaw·clawhub
断眉的派大星2 小时前
pytorch中view和reshape的区别
人工智能·pytorch·python
nihao5612 小时前
机器学习:阈值与混淆矩阵
人工智能·机器学习·矩阵
鱼骨不是鱼翅3 小时前
机器学习(1)-----基础概念
人工智能·机器学习
程序员阿明3 小时前
spring boot3 集成jjwt(java-jwt)版本的
java·spring boot·python
Fleshy数模3 小时前
基于MediaPipe实现人体姿态与脸部关键点检测
python·opencv·计算机视觉
星马梦缘3 小时前
jupyter Kernel Disconnected崩溃的修复
ide·python·jupyter