多项式回归预测下一个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)}")
修正效果说明
- 移除了循环内的
return语句,确保每个球员的数据都能被处理,print语句也能正常输出预测结果 - 修正了绘图代码,绿色标记点会显示在
prediction_value对应的x轴位置(比如你提供的Aaron Baddeley数据,会显示在x=10的位置) - 把辅助函数移到循环外部,优化了代码结构和效率
- 增加了空数据检查,避免因空列表导致的错误
用你提供的Aaron Baddeley的数据测试,预测结果大概在61左右(具体数值会因多项式拟合的特性略有浮动),不再是0。
内容的提问来源于stack exchange,提问作者Austin Johnson
相关产品推荐
相关产品推荐

