以波士顿房价预测为例,演示欠拟合问题和解决办法

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 以波士顿房价预测为例,演示欠拟合问题和解决办法

以波士顿房价预测为例,演示欠拟合问题和解决办法


首先需要在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(房价)。


模型假设:

image.png

其中:

  • 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。这两个值都相对较高,表明模型无法很好地拟合训练数据,也无法很好地泛化到测试数据上。


这种情况表明线性回归模型存在欠拟合问题。欠拟合通常发生在模型过于简单,无法捕捉数据中的复杂关系时。在这种情况下,模型的拟合能力不足,无法很好地解释数据中的变化。


对于波士顿房价数据集来说,只使用一个特征(房间数量)来拟合房价是远远不够的,因为房价受到多种因素的影响,而简单的线性关系无法很好地描述这种复杂性。需要更复杂的模型来捕捉数据中的更多信息,或者考虑添加更多的特征来改善模型的性能。


解决欠拟合问题


为了解决欠拟合问题,我们可以尝试以下方法:


  1. 增加模型复杂度: 使用更复杂的模型,例如多项式回归模型,可以更好地拟合数据中的非线性关系。
  2. 添加新特征: 增加一些有助于提高模型性能的新特征,例如特征组合、交互特征等。
  3. 减少正则化: 如果模型采用了正则化技术,可以尝试减少正则化参数的值,从而降低对模型复杂度的惩罚。


使用多项式回归模型解决该问题:

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")

在这个代码中,使用多项式回归模型来解决欠拟合问题。多项式回归模型通过添加特征的高次幂来增加模型的复杂度,从而更好地拟合数据。


多项式回归模型的数学公式为:

image.png

其中:


  • y 是目标变量(要预测的值);
  • x 是特征;
  • β0,β1,…,βn 是模型的系数(待学习的参数);
  • n是多项式的次数。


  • 运行结果

  • 运行结果分析

根据提供的结果,可以得出以下分析:


  1. 训练集 MSE: 5.314469559419275:训练集上的均方误差较低,说明多项式回归模型相对于训练集的拟合效果较好,模型能够较准确地预测训练集中的房价数据。
  2. 测试集 MSE: 14.183558072456174:测试集上的均方误差相对较高,说明多项式回归模型在测试集上的泛化能力较差,模型可能存在过拟合现象。过拟合是指模型在训练集上表现良好,但在测试集(或新数据)上表现较差的现象。


多项式回归模型在训练集上表现良好,但在测试集上存在一定的过拟合问题。可能需要进一步调整模型复杂度或者使用正则化等方法来解决过拟合问题,以提高模型的泛化能力。

具体参考这篇文章:以波士顿房价预测为例,演示过拟合问题和解决办法

相关文章
|
安全 数据安全/隐私保护 开发者
三款.NET 代码混淆工具比较分析:ConfuserEx、Obfuscar 和 Ipa Guard
三款.NET 代码混淆工具比较分析:ConfuserEx、Obfuscar 和 Ipa Guard
|
存储 运维 负载均衡
智能存储解决方案:探索 TDengine 的多级存储功能
在当今数据驱动的时代,如何高效地存储和管理海量数据已成为企业面临的一大挑战。为了应对这一需求,TDengine Enterprise 不仅支持使用对象存储(S3),还早已引入了独特的多级存储功能。这一功能不仅能够降低存储成本,还能显著提升数据写入性能,并简化系统维护流程。
212 2
一键自动化博客发布工具,用过的人都说好(阿里云篇)
使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到阿里云上。
一键自动化博客发布工具,用过的人都说好(阿里云篇)
|
数据采集 监控 数据挖掘
利用DATEWORES进行实时数据分析与洞察挖掘
【8月更文第14天】本文探讨了如何使用DATEWORES平台进行实时数据分析,该平台是一个假设性的实时数据处理框架,用于收集、处理并分析来自多种来源的数据流。通过介绍DATEWORES的功能以及其在实际应用场景中的实现,本文旨在为读者提供一个全面的指南,帮助他们在自己的业务场景中实施类似的解决方案。
293 0
|
存储 NoSQL Java
【Redis】利用 Redis List 实现 Java 数据库分页快速查询
在大型应用中,数据库分页查询是日常开发中不可避免的需求之一。随着数据量的不断增加,传统的数据库分页方式可能会变得效率较低。为了解决这一问题,本文将介绍如何使用 Redis List 数据结构,结合 Java 编程语言,实现高效的数据库分页查询。
468 9
|
存储 安全 API
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。
447 3
|
NoSQL Redis
Redis AOF重写问题之减少CPU和fork开销如何解决
Redis AOF重写问题之减少CPU和fork开销如何解决
210 1
|
数据采集 JSON API
淘宝商品评论数据采集教程丨淘宝商品评论数据接口Taobao.item_review
`淘宝开放平台的Taobao.item_review API让开发者能获取商品评论。步骤包括注册开发者账号,创建应用获取API密钥,理解和使用请求参数,签名验证并发送HTTP请求。返回的JSON数据包含评论详情,需解析并清洗后分析。注意频率限制和用户隐私保护。此接口助力商家分析用户反馈,优化经营策略。`
|
SQL 物联网 数据处理
NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
|
缓存 前端开发 安全
Python web框架fastapi中间件的使用,CORS跨域详解
Python web框架fastapi中间件的使用,CORS跨域详解
786 1

热门文章

最新文章