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

多项式回归预测下一个X对应y值时结果异常问题排查

解决多项式回归预测结果显示异常的问题

我看了你的代码和问题描述,发现几个关键问题导致你误以为预测结果是0,下面逐个解析并给出修正方案:

问题1:循环内的return语句直接终止程序

你在for循环内部调用了return viz_polymonial(),这会直接终止整个循环(如果这段代码在函数中的话),导致循环只处理第一个球员,而且后续的print(obj['Name'], prediction)语句永远不会执行。你看到的"预测结果为0"大概率是误解,或者是异常分支的无效输出。

问题2:绘图代码错误导致预测点位置异常

你的可视化代码里写了plt.plot(prediction, marker='x', color='green'),这里只传入了预测的y值,matplotlib会默认把x坐标设为0,所以绿色的标记点会显示在x=0的位置,看起来像是预测值对应x=0,很容易让你误以为预测结果是0。

问题3:循环内定义函数的不良实践

你把create_2d_lst和viz_polymonial两个函数都放在for循环内部,这不仅会重复定义函数降低效率,还可能引发变量作用域的潜在问题。


修正后的完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import json
from sklearn.preprocessing import PolynomialFeatures

# 把辅助函数移到循环外部
def create_2d_lst(lst):
    if not lst:  # 检查列表是否为空
        return []
    return [[i, j] for i, j in enumerate(lst)]

def viz_polymonial(X, y, pol_reg, poly_reg, prediction_value, prediction):
    plt.scatter(X, y, color='red')
    plt.plot(X, pol_reg.predict(poly_reg.fit_transform(X)), color='blue')
    # 修正绘图:传入预测的x和y值,这样标记点会出现在正确的位置
    plt.plot(prediction_value, prediction, marker='x', color='green', markersize=10)
    plt.title('Projected Scrambling Percentage')
    plt.xlabel('Tournaments')
    plt.ylabel('Scrambling Percentage')
    plt.show()

with open('/Users/aus10/Desktop/PGA/Data_Cleanup/Combined_Player_Stats.json') as json_file:
    players_data = json.load(json_file)

# 预处理数据:清理空值
for obj in players_data:
    obj['Scrambling_List'] = [i for i in obj['Scrambling_List'] if i]

for obj in players_data:
    try:
        scrambling = create_2d_lst(obj['Scrambling_List'])
        # 如果没有有效数据,跳过当前球员
        if not scrambling:
            print(f"{obj['Name']} 没有有效数据,跳过")
            continue
            
        data = scrambling
        X = np.array(data)[:,0].reshape(-1,1)
        y = np.array(data)[:,1].reshape(-1,1)
        
        # 多项式回归建模
        poly_reg = PolynomialFeatures(degree=4)
        X_poly = poly_reg.fit_transform(X)
        pol_reg = LinearRegression()
        pol_reg.fit(X_poly, y)
        
        # 计算下一个X值的预测结果
        prediction_value = len(X) + 1
        prediction = pol_reg.predict(poly_reg.fit_transform([[prediction_value]]))
        
        # 可视化并打印结果
        viz_polymonial(X, y, pol_reg, poly_reg, prediction_value, prediction)
        print(obj['Name'], f"下一场赛事的Scrambling百分比预测值:{prediction[0][0]:.2f}")
        
    except Exception as e:
        print(f"处理{obj['Name']}时出错:{str(e)}")

修正效果说明

  1. 移除了循环内的return语句,确保每个球员的数据都能被处理,print语句也能正常输出预测结果
  2. 修正了绘图代码,绿色标记点会显示在prediction_value对应的x轴位置(比如你提供的Aaron Baddeley数据,会显示在x=10的位置)
  3. 把辅助函数移到循环外部,优化了代码结构和效率
  4. 增加了空数据检查,避免因空列表导致的错误

用你提供的Aaron Baddeley的数据测试,预测结果大概在61左右(具体数值会因多项式拟合的特性略有浮动),不再是0。

内容的提问来源于stack exchange,提问作者Austin Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:12:53