You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中逐行拟合线性回归复现Excel TREND功能及sklearn报错处理

报错原因

你的推测是正确的,sklearn的LinearRegression默认将传入的每一列作为特征、每一行作为一个样本拟合全局模型。你之前的代码中,fit阶段传入的X是4行2列结构,sklearn认为这是4个样本、每个样本有2个特征,训练出的模型要求输入必须包含2个特征,而预测阶段你传入的New_x是4行1列结构,维度不匹配因此触发报错。

最优解决方案:向量化直接计算

你的需求是每行基于两个固定x值(1和5)对应Y值拟合线性模型,两点确定一条直线,可以直接用线性插值公式向量化计算,无需调用机器学习库,计算效率远高于循环方案,完全匹配Excel的TREND函数逻辑:

import pandas as pd
import numpy as np

data = {'New_x':[5, 2.1, 4.5, 3.0],
        'X1':[1, 1, 1, 1],
        'X2':[5, 5, 5, 5],
        'Y1':[0.15, 0.7, 1.35, 0.2],
        'Y2':[0.2, 0.85, 1.55, 0.4]}  

df=pd.DataFrame(data,index=["1","2","3","4"])

# 线性公式:y = k*x + b,k为斜率,b为截距
df['slope'] = (df['Y2'] - df['Y1']) / (df['X2'] - df['X1'])
df['intercept'] = df['Y1'] - df['slope'] * df['X1']
df['prediction'] = df['slope'] * df['New_x'] + df['intercept']

运行后df['prediction']列即为每行单独拟合后的预测结果。

备选方案:逐行调用LinearRegression

如果你需要严格使用sklearn的实现,可以通过apply对每一行单独拟合模型:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

data = {'New_x':[5, 2.1, 4.5, 3.0],
        'X1':[1, 1, 1, 1],
        'X2':[5, 5, 5, 5],
        'Y1':[0.15, 0.7, 1.35, 0.2],
        'Y2':[0.2, 0.85, 1.55, 0.4]}  

df=pd.DataFrame(data,index=["1","2","3","4"])

def row_predict(row):
    # 单独构造当前行的两个训练样本点
    train_X = [[row['X1']], [row['X2']]]
    train_y = [row['Y1'], row['Y2']]
    model = LinearRegression().fit(train_X, train_y)
    return model.predict([[row['New_x']]])[0]

df['prediction'] = df.apply(row_predict, axis=1)

该方案计算结果和向量化方案完全一致,但数据量较大时运行速度会明显慢于直接计算的方案。

内容的提问来源于stack exchange,提问作者Jacopo Centofanti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:06:03