Pyspark使用LinearRegression做直线拟合得到异常系数问题排查
问题核心原因
你犯了线性回归变量匹配的基础错误:搞反了自变量和因变量的对应关系。
你需要获取的是Moving_Ratio随行号rownumber变化的趋势斜率,本质上要拟合的公式为:Moving_Ratio = k * rownumber + b,其中k就是你需要的斜率。
但你现有代码把Moving_Ratio设为特征(自变量X),rownumber设为标签(因变量Y),实际拟合的是rownumber = a * Moving_Ratio + c,得到的系数a自然和预期斜率完全不符,预测值也会全部错位。同时你设置了较大的正则化参数,也会进一步拉偏拟合结果。
修正后的实现代码
# 特征改为自变量rownumber,要拟合的标签为目标指标Moving_Ratio vect_assm = VectorAssembler(inputCols =['rownumber'], outputCol='features') df_vect=vect_assm.transform(df) # 无正则需求可将regParam设为0,避免正则项干扰拟合结果 lir = LinearRegression(featuresCol = 'features', labelCol='Moving_Ratio', maxIter=50, regParam=0, elasticNetParam=0) model = lir.fit(df_vect) Predictions = model.transform(df_vect) # 取出的coefficients就是你需要的整体趋势斜率 trend_slope = model.coefficients[0]
可选优化建议
如果曲线非线性特征较强,需要更贴合整体趋势的斜率,可以额外做如下处理:
- 先对原始数据做等间隔采样,降低局部波动对整体斜率的影响
- 先对
Moving_Ratio做滚动平均平滑处理,消除噪声后再做线性拟合
内容的提问来源于stack exchange,提问作者thentangler
相关产品推荐
相关产品推荐

