调用SciPy的stats.linregress做线性回归报维度匹配错误怎么办
错误原因
scipy.stats.linregress 仅支持单自变量的简单线性回归,要求输入的x为一维数组,你传入的x是包含11个特征的二维数组(shape为(100,11)),不符合接口的输入要求,因此触发维度匹配错误。而np.linalg.lstsq和sklearn.linear_model.LinearRegression原生支持多变量线性回归,所以相同输入可以正常运行。
可行解决方案
你需要选择适配多变量线性回归的方案来获取权重及对应统计量,可选方案如下:
方案1:基于Scipy底层接口手动计算统计量
如果你希望仅用Scipy完成需求,可以结合scipy.linalg.lstsq和Scipy的统计分布接口自行计算各权重的统计量,代码示例如下:
import numpy as np from scipy import linalg, stats # 准备输入数据 X = x.to_numpy() # 若需要拟合截距项,执行下方代码,不需要可跳过 X = np.hstack([np.ones((X.shape[0], 1)), X]) y = y_copy # 求解最小二乘权重 coef, residues, rank, _ = linalg.lstsq(X, y) # 计算各权重对应的统计量 n_samples = X.shape[0] # 残差自由度 df = n_samples - rank # 残差均方 mse = residues / df # 系数协方差矩阵 cov_mat = mse * linalg.inv(X.T @ X) # 系数标准误 std_err = np.sqrt(np.diag(cov_mat)) # t统计量 t_vals = coef / std_err # 双尾p值 p_vals = 2 * stats.t.sf(np.abs(t_vals), df) # 打印结果,第一个值对应截距项的统计量,后续11个值对应11个特征的统计量 for idx in range(len(coef)): print(f"项{idx}: 权重={coef[idx]:.4f}, 标准误={std_err[idx]:.4f}, t值={t_vals[idx]:.4f}, p值={p_vals[idx]:.4f}")
方案2:使用Statsmodels直接输出完整统计结果(更简便)
Statsmodels是专门用于统计建模的Python库,支持直接输出多变量线性回归的所有统计指标,调用方式更简单,代码示例如下:
import statsmodels.api as sm # 增加截距项(不需要的话可跳过该步骤) X_with_const = sm.add_constant(x) # 拟合模型 model = sm.OLS(y, X_with_const).fit() # 输出完整统计报告 print(model.summary()) # 单独提取所需指标 print("各特征权重:", model.params) print("权重标准误:", model.bse) print("权重p值:", model.pvalues) print("权重t值:", model.tvalues)
方案3:逐个特征做单变量回归(仅适合单变量分析场景)
如果你确实需要用scipy.stats.linregress接口,可以逐个取出x的单列特征和y做回归,但注意该方法得到的是单变量回归的权重,和多变量回归控制其他变量得到的权重结果完全不同,仅适合单变量分析场景:
for col_name in x.columns: res = stats.linregress(x[col_name], y) print(f"特征{col_name}: 权重={res.slope:.4f}, p值={res.pvalue:.4f}, 标准误={res.stderr:.4f}")
内容的提问来源于stack exchange,提问作者transmini
相关产品推荐
相关产品推荐

