使用 Scikit-learn 构建回归模型:从线性到多项式

使用 Scikit-learn 构建回归模型:从线性到多项式

摘要

在本教程中,我们将通过一个实际案例,学习如何使用 Scikit-learn 构建线性回归和多项式回归模型。我们将使用南瓜价格数据集,探索如何通过回归模型预测南瓜的价格,并比较两种模型的性能。通过本教程,你将掌握回归模型的基本原理、实现步骤以及评估方法。

一、背景介绍

假设你正在为节日购买南瓜,想知道不同包装的南瓜价格是否合理。通过分析历史数据,我们可以构建一个回归模型来预测南瓜的价格,从而帮助你做出更明智的购买决策。

我们将使用 Scikit-learn 库来实现线性回归和多项式回归模型。线性回归适用于线性关系的数据,而多项式回归则适用于非线性关系的数据。通过比较两种模型的性能,我们可以选择更适合数据的模型。

二、数据准备

数据集说明

我们使用一个包含南瓜销售数据的数据集,数据集包含以下字段:

  • Variety:南瓜品种
  • Package:包装大小(单位:蒲式耳)
  • City:销售城市
  • Month:销售月份
  • Price:价格(单位:美元)

数据加载与预处理

  1. 加载数据

    import pandas as pd
    
    # 加载数据
    new_pumpkins = pd.read_csv('pumpkin_data.csv')
    
  2. 数据清洗

    • 删除缺失值
    • 将字符串数据转换为数值数据
    new_pumpkins.dropna(inplace=True)
    from sklearn.preprocessing import LabelEncoder
    new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)
    
  3. 数据可视化

    • 绘制散点图,观察包装大小与价格的关系
    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()
    

三、线性回归模型

模型构建

  1. 划分数据集

    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)
    
  2. 训练模型

    from sklearn.linear_model import LinearRegression
    
    lin_reg = LinearRegression()
    lin_reg.fit(X_train, y_train)
    
  3. 模型评估

    • 计算 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))
    
  4. 可视化回归线

    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:衡量预测值与真实值的误差,越小越好。

四、多项式回归模型

模型构建

  1. 创建多项式特征

    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.pipeline import make_pipeline
    
    # 创建一个包含4次多项式特征的管道
    pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression())
    
  2. 训练模型

    pipeline.fit(X_train, y_train)
    
  3. 模型评估

    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))
    
  4. 可视化回归曲线

    # 创建排序后的数据点
    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² 分数MSEMAE
线性回归0.33
多项式回归0.85

选择建议

  • 如果数据呈现明显的线性关系,选择线性回归。
  • 如果数据呈现非线性关系,选择多项式回归。
  • 通过交叉验证和网格搜索优化模型参数。

六、挑战与实践

  1. 尝试不同的特征组合:比如加入“月份”或“城市”作为特征,观察对模型性能的影响。
  2. 调整多项式次数:尝试不同的多项式次数(如2次、3次),找到最佳拟合模型。
  3. 应用正则化:使用岭回归(L2)或Lasso回归(L1)处理过拟合问题。

七、总结

通过本教程,你学会了如何使用 Scikit-learn 构建线性回归和多项式回归模型,并通过实际数据进行了实践。线性回归适用于线性关系的数据,而多项式回归则适用于非线性关系的数据。通过比较两种模型的性能,你可以选择最适合数据的模型。

进一步学习可以探索其他回归技术,如岭回归、Lasso 回归和弹性网络回归,这些技术在处理多重共线性和过拟合问题时非常有效。你还可以参考 斯坦福统计学习课程 深入学习统计学习的理论与实践。

附录:代码与资源

希望本教程对你有所帮助!如果你有任何问题或建议,请随时联系我。祝你学习愉快! 🎃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值