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