
本文介绍如何将使用 splinetransformer(含5个结点、1阶多项式)预处理后、再由线性回归拟合的高维模型,转化为显式的分段多项式数学表达式,涵盖主效应、交互项及结点处的连续性处理要点。
本文介绍如何将使用 splinetransformer(含5个结点、1阶多项式)预处理后、再由线性回归拟合的高维模型,转化为显式的分段多项式数学表达式,涵盖主效应、交互项及结点处的连续性处理要点。
在高维回归建模中,SplineTransformer(如 scikit-learn 中实现)常用于对连续型特征进行非线性扩展:它将每个原始特征 $x_j$($j = 1,\dots,5$)映射为一组分段线性基函数(B-splines 或截断幂基),通常采用“knots + degree + include_bias”参数组合生成多个新特征。当指定 degree=1(即线性样条)和 n_knots=5 时,实际会在数据范围内自动选择 5 个内结点(interior knots),并构造出 $K = n_{\text{knots}} + \text{degree} + 1 = 7$ 个基函数(含截距项),每个基函数均为分段线性、连续、紧支撑的函数。
假设原始特征向量为 $\mathbf{x} = (x_1, x_2, x_3, x_4, x_5)^\top \in \mathbb{R}^5$,经 SplineTransformer 处理后得到扩展特征矩阵 $\Phi(\mathbf{x}) \in \mathbb{R}^{1 \times D}$,其中维度 $D$ 取决于是否启用交互项(include_interaction=True)。若仅对各特征独立样条化且无交互,则 $D = 5 \times 7 = 35$;若启用所有二阶交互(默认 interaction_only=False,但 include_interaction=True 会生成所有两两特征组合的样条乘积),则 $D$ 将大幅增加(例如 $\binom{5}{2} \times 7 \times 7 + 5 \times 7 = 1225 + 35 = 1260$ 维),此时数学表达式将极为冗长——因此实践中建议明确区分主效应与交互结构。
✅ 核心数学形式(以单特征为例)
设 $x$ 为某原始特征,其 5 个内结点为 $\xi_1
$$ bk(x) = \begin{cases} \frac{x - \xi{k-1}}{\xik - \xi{k-1}}, & \xi_{k-1} \le x k \ \frac{\xi{k+1} - x}{\xi_{k+1} - \xi_k}, & \xik \le x {k+1} \ 0, & \text{otherwise} \end{cases} $$
(注:scikit-learn 默认使用 knots + degree + 1 个基函数的截断幂形式,但等价于上述 B-样条张成空间。)
因此,该特征对应的样条变换输出为: $$ \boldsymbol{\phi}(x) = \big[1,\, (x - \xi1)+,\, (x - \xi2)+,\, \dots,\, (x - \xi5)+\big]^\top \quad \text{(截断线性基,共 6 维)} $$ 其中 $(\cdot)_+ = \max(0, \cdot)$。加上截距项后共 7 维,与前述一致。
✅ 全模型数学表达式(含交互项)
令 $\mathbf{w} \in \mathbb{R}^D$ 为训练所得线性回归系数向量(含截距 $w_0$),则最终预测函数为:
$$ \hat{y}(\mathbf{x}) = w0 + \sum{j=1}^5 \sum{k=1}^{7} w{jk}\, b_{jk}(xj) + \sum{1 \le j {k=1}^{7} \sum{m=1}^{7} w{jk,\ell m}\, b{jk}(xj) \cdot b{\ell m}(x_\ell) $$
其中:
- $b_{jk}(x_j)$ 表示第 $j$ 个特征的第 $k$ 个样条基函数;
- $w_{jk,\ell m}$ 是对应交互项的系数,仅当启用 include_interaction=True 时非零;
- 所有 $b_{jk}(\cdot)$ 均为分段线性函数,需按结点区间分段书写。
⚠️ 实际操作建议与注意事项
-
提取结点与系数:
from sklearn.preprocessing import SplineTransformer from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline # 假设 X_train.shape == (n_samples, 5) spline = SplineTransformer(n_knots=5, degree=1, include_interaction=True) X_spline = spline.fit_transform(X_train) # shape: (n, D) lr = LinearRegression().fit(X_spline, y_train) w = lr.coef_ intercept = lr.intercept_ # 获取结点位置(每列对应一个原始特征的结点) knots = spline.knots # shape: (n_knots+2, 5) —— 包含边界
-
避免手工书写全式:对 5 维输入+交互,总基函数数可达上千,不推荐手写完整公式。更实用的方式是:
- 将模型封装为可调用函数,利用 spline.transform() 动态计算 $\Phi(\mathbf{x})$;
- 对关键变量(如 $x_1$)做边际效应图(partial dependence plot);
- 使用 sklearn.inspection.plot_partial_dependence 可视化单变量/双变量样条效应。
结点处的连续性:线性样条天然保证函数连续,但一阶导数在结点处不连续;若需更高阶光滑性,应改用 degree=3(三次样条),此时数学表达式变为分段三次多项式,需额外约束导数连续性。
-
可解释性权衡:虽然数学公式理论上存在,但高维样条+交互模型本质上属于“可计算不可解析”模型。如需强可解释性,建议:
- 关闭 include_interaction;
- 对每个特征单独拟合并可视化其样条效应;
- 使用 SHAP 或 LIME 近似局部线性解释。
综上,该模型的数学本质是高维分段线性函数的加权和,其显式表达虽可行,但工程实践中应优先依赖代码复现与可视化诊断,而非追求封闭解析式。











