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
相关产品推荐
相关产品推荐

