以波士顿房价预测为例,演示欠拟合问题和解决办法
首先需要在jupyter中安装对应的环境。
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple
简介:在机器学习中,模型的拟合程度对预测性能至关重要。然而,有时候我们会遇到欠拟合问题,即模型无法捕捉数据中的足够信息。我将以波士顿房价预测为例,讨论欠拟合问题及其解决办法。
数据集介绍
使用波士顿房价数据集,该数据集包含了一些影响波士顿地区房价的重要特征,如犯罪率、房屋年龄、学生-老师比例等。
欠拟合问题分析
假设我们只使用一个特征 x \ x x(在这个例子中是房间数量)来预测目标变量 y \ y y(房价)。
模型假设:
其中:
- y是目标变量(要预测的值,即房价);
- x是特征(在这个例子中是房间数量);
- β0是截距(模型的偏置);
- β1是斜率(房间数量对房价的影响);
- ϵ 是误差项(模型无法解释的部分)。
模型的任务是通过调整参数 β0和 β1来最小化预测值和实际值之间的均方误差(MSE)。
这个公式描述了线性回归模型的基本原理,它试图通过拟合一条直线来描述特征 x和目标变量 y 之间的关系。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error import numpy as np # 加载数据集 boston = load_boston() X = boston.data y = boston.target # 只使用一个特征(房间数量)来演示欠拟合 X_train, X_test, y_train, y_test = train_test_split(X[:, 5], y, test_size=0.2, random_state=42) # 创建并拟合线性回归模型 model = LinearRegression() model.fit(X_train[:, np.newaxis], y_train) # 在训练集和测试集上进行预测 train_predictions = model.predict(X_train[:, np.newaxis]) test_predictions = model.predict(X_test[:, np.newaxis]) # 计算均方误差(MSE) train_mse = mean_squared_error(y_train, train_predictions) test_mse = mean_squared_error(y_test, test_predictions) print("线性回归模型 - 训练集 MSE:", train_mse) print("线性回归模型 - 测试集 MSE:", test_mse) # 绘制线性回归模型的预测结果与真实结果对比图 plt.figure(figsize=(10, 6)) plt.scatter(y_test, test_predictions, color='blue', label='预测结果') plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2, color='red', label='理想结果') plt.xlabel('真实房价') plt.ylabel('预测房价') plt.title('线性回归模型预测结果对比图') plt.legend() plt.grid(True) plt.show()
- 运行结果
- 结果分析
在这个结果中,可以看到线性回归模型在训练集和测试集上的均方误差(MSE)分别为约42.99和46.14。这两个值都相对较高,表明模型无法很好地拟合训练数据,也无法很好地泛化到测试数据上。
这种情况表明线性回归模型存在欠拟合问题。欠拟合通常发生在模型过于简单,无法捕捉数据中的复杂关系时。在这种情况下,模型的拟合能力不足,无法很好地解释数据中的变化。
对于波士顿房价数据集来说,只使用一个特征(房间数量)来拟合房价是远远不够的,因为房价受到多种因素的影响,而简单的线性关系无法很好地描述这种复杂性。需要更复杂的模型来捕捉数据中的更多信息,或者考虑添加更多的特征来改善模型的性能。
解决欠拟合问题
为了解决欠拟合问题,我们可以尝试以下方法:
- 增加模型复杂度: 使用更复杂的模型,例如多项式回归模型,可以更好地拟合数据中的非线性关系。
- 添加新特征: 增加一些有助于提高模型性能的新特征,例如特征组合、交互特征等。
- 减少正则化: 如果模型采用了正则化技术,可以尝试减少正则化参数的值,从而降低对模型复杂度的惩罚。
使用多项式回归模型解决该问题:
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline from sklearn.metrics import mean_squared_error import numpy as np # 加载数据集 boston = load_boston() X = boston.data y = boston.target # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建一个带有多项式特征的线性回归模型 degree = 2 # 多项式的次数 model_poly = make_pipeline(PolynomialFeatures(degree), LinearRegression()) # 拟合多项式回归模型 model_poly.fit(X_train, y_train) # 在训练集和测试集上进行预测 train_predictions_poly = model_poly.predict(X_train) test_predictions_poly = model_poly.predict(X_test) # 计算多项式回归模型的均方误差(MSE) train_mse_poly = mean_squared_error(y_train, train_predictions_poly) test_mse_poly = mean_squared_error(y_test, test_predictions_poly) print("多项式回归模型 - 训练集 MSE:", train_mse_poly) print("多项式回归模型 - 测试集 MSE:", test_mse_poly) # 多项式回归模型的数学公式 print("多项式回归模型公式:") print("y = β0 + β1*x1 + β2*x1^2 + ... + βn*x1^n")
在这个代码中,使用多项式回归模型来解决欠拟合问题。多项式回归模型通过添加特征的高次幂来增加模型的复杂度,从而更好地拟合数据。
多项式回归模型的数学公式为:
其中:
- y 是目标变量(要预测的值);
- x 是特征;
- β0,β1,…,βn 是模型的系数(待学习的参数);
- n是多项式的次数。
- 运行结果
- 运行结果分析
根据提供的结果,可以得出以下分析:
- 训练集 MSE: 5.314469559419275:训练集上的均方误差较低,说明多项式回归模型相对于训练集的拟合效果较好,模型能够较准确地预测训练集中的房价数据。
- 测试集 MSE: 14.183558072456174:测试集上的均方误差相对较高,说明多项式回归模型在测试集上的泛化能力较差,模型可能存在过拟合现象。过拟合是指模型在训练集上表现良好,但在测试集(或新数据)上表现较差的现象。
多项式回归模型在训练集上表现良好,但在测试集上存在一定的过拟合问题。可能需要进一步调整模型复杂度或者使用正则化等方法来解决过拟合问题,以提高模型的泛化能力。
具体参考这篇文章:以波士顿房价预测为例,演示过拟合问题和解决办法