使用 Scikit-learn 构建回归模型:从线性到多项式
摘要
在本教程中,我们将通过一个实际案例,学习如何使用 Scikit-learn 构建线性回归和多项式回归模型。我们将使用南瓜价格数据集,探索如何通过回归模型预测南瓜的价格,并比较两种模型的性能。通过本教程,你将掌握回归模型的基本原理、实现步骤以及评估方法。
一、背景介绍
假设你正在为节日购买南瓜,想知道不同包装的南瓜价格是否合理。通过分析历史数据,我们可以构建一个回归模型来预测南瓜的价格,从而帮助你做出更明智的购买决策。
我们将使用 Scikit-learn 库来实现线性回归和多项式回归模型。线性回归适用于线性关系的数据,而多项式回归则适用于非线性关系的数据。通过比较两种模型的性能,我们可以选择更适合数据的模型。
二、数据准备
数据集说明
我们使用一个包含南瓜销售数据的数据集,数据集包含以下字段:
- Variety:南瓜品种
- Package:包装大小(单位:蒲式耳)
- City:销售城市
- Month:销售月份
- Price:价格(单位:美元)
数据加载与预处理
-
加载数据:
import pandas as pd # 加载数据 new_pumpkins = pd.read_csv('pumpkin_data.csv')
-
数据清洗:
- 删除缺失值
- 将字符串数据转换为数值数据
new_pumpkins.dropna(inplace=True) from sklearn.preprocessing import LabelEncoder new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)
-
数据可视化:
- 绘制散点图,观察包装大小与价格的关系
import matplotlib.pyplot as plt plt.scatter(new_pumpkins['Package'], new_pumpkins['Price'], color='black') plt.xlabel('Package') plt.ylabel('Price') plt.title('Package vs Price') plt.show()
三、线性回归模型
模型构建
-
划分数据集:
from sklearn.model_selection import train_test_split X = new_pumpkins[['Package']] y = new_pumpkins['Price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
训练模型:
from sklearn.linear_model import LinearRegression lin_reg = LinearRegression() lin_reg.fit(X_train, y_train)
-
模型评估:
- 计算 R² 分数
- 计算均方误差(MSE)和平均绝对误差(MAE)
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error y_pred = lin_reg.predict(X_test) print('R² Score:', r2_score(y_test, y_pred)) print('MSE:', mean_squared_error(y_test, y_pred)) print('MAE:', mean_absolute_error(y_test, y_pred))
-
可视化回归线:
plt.scatter(X_test, y_test, color='black') plt.plot(X_test, y_pred, color='blue', linewidth=3) plt.xlabel('Package') plt.ylabel('Price') plt.title('Linear Regression: Package vs Price') plt.show()
模型解释
- R² 分数:衡量模型解释数据方差的比例,越接近1越好。
- MSE 和 MAE:衡量预测值与真实值的误差,越小越好。
四、多项式回归模型
模型构建
-
创建多项式特征:
from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline # 创建一个包含4次多项式特征的管道 pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression())
-
训练模型:
pipeline.fit(X_train, y_train)
-
模型评估:
y_pred = pipeline.predict(X_test) print('R² Score:', r2_score(y_test, y_pred)) print('MSE:', mean_squared_error(y_test, y_pred)) print('MAE:', mean_absolute_error(y_test, y_pred))
-
可视化回归曲线:
# 创建排序后的数据点 df = pd.DataFrame({'x': X_test.values.flatten(), 'y': y_pred}) df.sort_values(by='x', inplace=True) points = df.to_numpy() plt.plot(points[:, 0], points[:, 1], color="blue", linewidth=3) plt.scatter(X, y, color="black") plt.xlabel('Package') plt.ylabel('Price') plt.title('Polynomial Regression: Package vs Price') plt.show()
模型解释
- 多项式回归:通过创建高次项特征,拟合非线性关系的数据。
- R² 分数:多项式回归通常能获得更高的 R² 分数,因为它可以更好地捕捉数据的非线性模式。
五、模型比较与选择
性能对比
模型类型 | R² 分数 | MSE | MAE |
---|---|---|---|
线性回归 | 0.33 | … | … |
多项式回归 | 0.85 | … | … |
选择建议
- 如果数据呈现明显的线性关系,选择线性回归。
- 如果数据呈现非线性关系,选择多项式回归。
- 通过交叉验证和网格搜索优化模型参数。
六、挑战与实践
- 尝试不同的特征组合:比如加入“月份”或“城市”作为特征,观察对模型性能的影响。
- 调整多项式次数:尝试不同的多项式次数(如2次、3次),找到最佳拟合模型。
- 应用正则化:使用岭回归(L2)或Lasso回归(L1)处理过拟合问题。
七、总结
通过本教程,你学会了如何使用 Scikit-learn 构建线性回归和多项式回归模型,并通过实际数据进行了实践。线性回归适用于线性关系的数据,而多项式回归则适用于非线性关系的数据。通过比较两种模型的性能,你可以选择最适合数据的模型。
进一步学习可以探索其他回归技术,如岭回归、Lasso 回归和弹性网络回归,这些技术在处理多重共线性和过拟合问题时非常有效。你还可以参考 斯坦福统计学习课程 深入学习统计学习的理论与实践。
附录:代码与资源
希望本教程对你有所帮助!如果你有任何问题或建议,请随时联系我。祝你学习愉快! 🎃