多元多项式回归月度批量分析需求及model.coef_维度异常咨询
问题解答:自定义多项式回归与月度分组回归实现
为什么model.coef_会输出10个元素?
你代码里用的PolynomialFeatures(degree=2)默认会生成所有可能的一次项、二次项(含交叉项)以及常数项。对于3个输入变量x1、x2、x3,生成的特征列表是:
- 常数项(全1列)
- x1、x2、x3(一次项)
- x1²、x1x2、x1x3、x2²、x2*x3、x3²(二次项)
总共1+3+6=10个特征,因此model.coef_会输出对应这10个特征的系数数组。但你的目标公式只需要x1、x1²、x2²、x3²这4个项(加常数项),默认的特征生成不符合需求。
实现自定义公式+月度分组回归
步骤1:修正数据预处理的潜在问题
你代码中dataset.x1[dataset.y<0]=0存在链式索引风险,建议改为loc索引避免警告:
dataset.loc[dataset['y'] < 0, 'x1'] = 0
步骤2:构造自定义特征
按照公式Y = x1 + A*x1² + B*x2² + C*x3² + Constant,我们只需要构造x1、x1²、x2²、x3²这4个特征,常数项由LinearRegression自动处理。
步骤3:按月份分组执行回归
遍历每个月份的子数据集,拟合回归模型,收集每个月的系数和常数项,最终整理成表格。
完整代码示例
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # 读取数据集 dataset = pd.read_csv('dataset.csv') # 修正:将y<0对应的x1设为0,避免链式索引警告 dataset.loc[dataset['y'] < 0, 'x1'] = 0 # 初始化结果存储列表 monthly_results = [] # 按Month分组遍历 for month, group in dataset.groupby('Month'): # 提取当前月份的x和y X = group[['x1', 'x2', 'x3']].values y = group['y'].values # 构造自定义特征:x1, x1², x2², x3² X_custom = np.column_stack([ X[:, 0], # x1 X[:, 0] ** 2, # x1² X[:, 1] ** 2, # x2² X[:, 2] ** 2 # x3² ]) # 拟合线性回归模型 model = LinearRegression() model.fit(X_custom, y) # 计算R²(可选,用于验证模型效果) r2 = r2_score(y, model.predict(X_custom)) # 收集结果:月份、各系数、常数项、R² monthly_results.append({ 'Month': month, 'x1_coef': model.coef_[0], 'A(x1²)': model.coef_[1], 'B(x2²)': model.coef_[2], 'C(x3²)': model.coef_[3], 'Constant': model.intercept_, 'R²': r2 }) # 将结果转换为DataFrame(即所需的月度系数表格) results_df = pd.DataFrame(monthly_results) # 按月份排序(可选) results_df = results_df.sort_values('Month').reset_index(drop=True) print(results_df)
结果说明
results_df就是你需要的月度系数表格,每行对应一个月份的回归结果,包含x1的系数、A/B/C三个二次项系数、常数项,以及可选的R²值用于评估模型拟合效果。
内容的提问来源于stack exchange,提问作者Patrick Flume
相关产品推荐
相关产品推荐

