ML-For-Beginners回归分析:南瓜价格预测实践
项目背景与数据准备
微软开源项目ML-For-Beginners提供了面向初学者的机器学习教程,其中回归分析模块以北美南瓜价格预测为案例,展示了从数据预处理到模型部署的完整流程。本实践基于相关农业数据公开资料,通过Scikit-learn构建线性与多项式回归模型,预测不同月份的南瓜价格走势。
数据预处理阶段需处理不同包装规格的价格标准化问题。原始数据中南瓜以"1 1/9 bushel"、"1/2 bushel"等多种单位销售,需统一转换为每蒲式耳价格:
# 筛选含"bushel"的记录
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
# 标准化价格计算
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
详细数据清洗步骤参见数据准备教程。
数据可视化分析
价格分布特征
通过箱线图可直观观察南瓜价格的分布特征,显示不同月份价格波动范围: 
按月度平均价格绘制的柱状图揭示了明显的季节性规律,10月(万圣节前夕)价格达到峰值: 
特征相关性分析
散点图显示价格与销售日期(一年中的天数)存在弱负相关(相关系数-0.17): 
按南瓜品种着色后,不同品种的价格集群特征更加明显,迷你南瓜(MINIATURE)价格普遍高于其他品种: 
回归模型构建
线性回归基础
以"DayOfYear"为特征构建简单线性回归模型,核心代码如下:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 特征与标签准备
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 模型训练与评估
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'平均误差: {mse:.2f}美元 ({mse/np.mean(pred)*100:.2f}%)')
模型显示价格每日约下降0.017美元,决定系数仅0.07,拟合效果较差: 
多项式回归优化
引入二次多项式特征后,模型能捕捉价格的非线性趋势,10月左右出现价格低谷:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
多特征融合模型
通过独热编码(One-Hot Encoding)处理类别特征(品种、城市、包装类型),结合多项式特征构建融合模型:
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
模型性能显著提升,决定系数达0.97,平均预测误差降至2.23美元:
| 模型类型 | 均方误差 | 决定系数 |
|---|---|---|
| 简单线性回归 | 2.77美元 | 0.07 |
| 多项式回归 | 2.73美元 | 0.08 |
| 多特征融合 | 2.23美元 | 0.97 |
实践总结与扩展
本案例完整展示了机器学习工作流:从数据可视化探索到模型构建优化。关键发现包括:
- 南瓜价格受品种、销售日期、包装规格多重因素影响
- 多项式特征能有效捕捉季节性价格波动
- 类别特征编码对模型性能提升至关重要
进阶练习可尝试:
- 添加温度、降雨量等外部特征
- 使用正则化(L1/L2)优化模型
- 对比随机森林等非线性回归算法
完整代码与数据集可通过项目仓库获取,建议结合官方教程进行实操练习。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





