【python机器学习】线性回归 拟合 欠拟合与过拟合 以及波士顿房价预估案例

news/2024/10/10 10:29:56/

线性回归之波士顿房价预测案例 欠拟合与过拟合

线性回归API 介绍:

在这里插入图片描述

波士顿房价预测

数据属性:

在这里插入图片描述

机器学习代码实现

1.导入库

python">from sklearn.preprocessing import StandardScaler        # 特征处理
from sklearn.model_selection import train_test_split    # 数据集划分
from sklearn.linear_model import LinearRegression       # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor           # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error          # 均方误差评估
# from sklearn.datasets import load_boston                # 数据

注意在新版本sklearn中上述读取数据方式失效通过下面方法读取数据

python">import pandas as pd
import numpy as npdata_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

2.模型代码实现

python"># 正规方程法
def demo01():# 数据集划分x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2)# 特征工程 特征预处理transfer = StandardScaler()  # 创建标准化对象# 标准化 训练集 测试集x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 模型训练estimator = LinearRegression()  # 线性回归模型对象estimator.fit(x_train, y_train)# 模型预测y_predict = estimator.predict(x_test)# 和测试集的标签进行比较# 1.均方误差print("均方误差的误差为:", mean_squared_error(y_test, y_predict))# 2.平均绝对误差print("平均绝对误差的误差为:", mean_absolute_error(y_test, y_predict))# 3.均方根误差print("均方根误差的误差为:", root_mean_squared_error(y_test, y_predict))# 梯度下降法
def demo02():# 数据集划分x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2)# 特征工程 特征预处理transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 模型训练estimator = SGDRegressor(max_iter=1000, learning_rate='constant',eta0=0.001)  # 获取梯度下降模型对象 max_iter 最大次数 eta0 学习率 ,learning_rate='constant' 设置学习率为常数estimator.fit(x_train, y_train)# 模型预测y_predict = estimator.predict(x_test)# 模型评估# 1.均方误差print("均方误差的误差为:", mean_squared_error(y_test, y_predict))# 2.平均绝对误差print("平均绝对误差的误差为:", mean_absolute_error(y_test, y_predict))# 3.均方根误差print("均方根误差的误差为:", root_mean_squared_error(y_test, y_predict))

运行结果 上为标准函数 下为梯度下降

在这里插入图片描述

拟合 过拟合 欠拟合 模拟 及处理方法(正则化处理)

在这里插入图片描述

导包

python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error  # 计算均方误差
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge, Lasso

定义函数表示欠拟合

欠拟合出现的原因:学习到数据的特征过少

解决方法: 【从数据、模型、算法的角度去想解决方案】

​ 添加其他特征
​ 有时出现欠拟合是因为特征项不够导致的,可以添加其他特征项来解决
​ “组合”、“泛化”、“相关性”三类特征是特征添加的重要手段
​ 添加多项式特征项
​ 模型过于简单时的常用套路,例如将线性模型通过添加二次项或三次项使模型泛化能力更强

python">def demo01():# 准备数据# 准备噪声np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 0.5x^2 +x +  2 + 正态分布 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 模型训练# 创建线性回归方程对象estimator = LinearRegression()# 训练estimator.fit(x.reshape(-1, 1), y)# 根据模型预测y_predict = estimator.predict(x.reshape(-1, 1))# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 这里看到均方误差正常 但是实际上欠拟合 画图plt.scatter(x, y) # x,y散点图plt.plot(x, y_predict, color='red') # 拟合回归线 即预测值plt.show()

在这里插入图片描述

根据数据可视化结果发现 均方误差正常,但是可视化结果表示模型欠拟合,用一次方程拟合二次

需要提升模型维度,增加特征值

定义函数表示拟合

在demo01 的基础上 对x 增加维度 即 拼接x和x^2 使得拟合回归线为2次方程

python">def demo02():# 准备数据# 准备噪声np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 0.5x^2 +x +  2 + 正态分布 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)x_reshape = x.reshape(-1, 1)x2 = np.hstack([x_reshape, x_reshape ** 2])  # 拼接x和x的平方 增加模型维度# 模型训练# 创建线性回归方程对象estimator = LinearRegression()# 训练estimator.fit(x2, y)# 根据模型预测y_predict = estimator.predict(x2)# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 这里看到均方误差正常 但是实际上欠拟合 画图plt.scatter(x, y)  # x,y散点图plt.plot(x, y_predict, color='red')  # 拟合回归线 即预测值plt.show()

数据可视化结果虽然拟合曲线出来了,但是因为没有对散点排序,导致绘制时没有按顺序连接

在这里插入图片描述

python">def demo02():# 准备数据# 准备噪声np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 0.5x^2 +x +  2 + 正态分布 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)x_reshape = x.reshape(-1, 1)x2 = np.hstack([x_reshape, x_reshape ** 2])  # 拼接x和x的平方 增加模型维度# 模型训练# 创建线性回归方程对象estimator = LinearRegression()# 训练estimator.fit(x2, y)# 根据模型预测y_predict = estimator.predict(x2)# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 这里看到均方误差正常 但是实际上欠拟合 画图plt.scatter(x, y)  # x,y散点图plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')  # 拟合回归线 即预测值plt.show()

排序后正确的拟合线

在这里插入图片描述

定义函数表示过拟合

过拟合出现的原因:

  • 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点

解决办法:

  • 重新清洗数据
    • 对于过多异常点数据、数据不纯的地方再处理
  • 增大数据的训练量
    • 对原来的数据训练的太过了,增加数据量的情况下,会缓解
      正则化
  • 解决模型过拟合的方法,在机器学习、深度学习中大量使用
    减少特征维度,防止维灾难
  • 由于特征多,样本数量少,导致学习不充分,泛化能力差。

在demo02 函数上继续增加维度 会导致模型会兼顾每个测试点,导致过拟合

python">def demo03():# 准备数据# 准备噪声np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 0.5x^2 +x +  2 + 正态分布 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)x_reshape = x.reshape(-1, 1)x2 = np.hstack([x_reshape, x_reshape ** 2, x_reshape ** 3, x_reshape ** 4, x_reshape ** 5, x_reshape ** 6, x_reshape ** 7,x_reshape ** 8, x_reshape ** 9, x_reshape ** 10, x_reshape ** 11, x_reshape ** 12, x_reshape ** 13,x_reshape ** 14, x_reshape ** 15, x_reshape ** 16, x_reshape ** 17, x_reshape ** 18,x_reshape ** 19])  # 拼接x和x的平方 增加模型维度# 模型训练# 创建线性回归方程对象estimator = LinearRegression()# 训练estimator.fit(x2, y)# 根据模型预测y_predict = estimator.predict(x2)# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 这里看到均方误差正常 但是实际上欠拟合 画图plt.scatter(x, y)  # x,y散点图plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')  # 拟合回归线 即预测值plt.show()

过拟合展示

在这里插入图片描述

正则化处理过拟合

在这里插入图片描述

L1正则化

在这里插入图片描述

在demo03基础上 将线性回归模型对象改为l1正则化线性回归模型对象

python">def demo04():np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 2x + 3 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 模型训练# 创建 线性回归 L1 正则化 模型对象estimator = Lasso(alpha=0.1)  # alpha 正则化参数 值越大 正则化程度越大# 对数据集做处理# print("处理前:", x)X = x.reshape(-1, 1)# print("处理后:", X)# 拼接 x 和 x 的平方X2 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10, X ** 11, X ** 12, X ** 13, X ** 14,X ** 15, X ** 16, X ** 17, X ** 18, X ** 19, X ** 20])# print("处理后:", X2)# 训练estimator.fit(X2, y)# 预测y_predict = estimator.predict(X2)print("预测值:", y_predict)# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 数据可视化 绘制图像print(np.sort(x))print(np.argsort(x))plt.scatter(x, y)  # 基于原始的x,y 绘制散点图plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')  # 原始的x , y 预测值 绘制折线图(拟合回归线)plt.show()

l1正则化过后的曲线

在这里插入图片描述

L1正则化通过改变权重,并将特殊点的权重完全改为0来避免过拟合问题

L2正则化

在这里插入图片描述

将模型改为L2正则化线性回归模型

python">def demo05():# 准备数据# 准备噪声np.random.seed(21)# x 表示特征x = np.random.uniform(-3, 3, size=100)# y 表示目标值 线性关系 y = 2x + 3 + 噪声y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 模型训练# 创建 线性回归 L2 正则化 模型对象estimator = Ridge(alpha=0.1)  # alpha 正则化参数 值越大 正则化程度越大# 对数据集做处理# print("处理前:", x)X = x.reshape(-1, 1)# print("处理后:", X)# 拼接 x 和 x 的平方X2 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10, X ** 11, X ** 12, X ** 13, X ** 14,X ** 15, X ** 16, X ** 17, X ** 18, X ** 19, X ** 20])# print("处理后:", X2)# 训练estimator.fit(X2, y)# 预测y_predict = estimator.predict(X2)print("预测值:", y_predict)# 模型评估print('均方误差', mean_squared_error(y, y_predict))# 数据可视化 绘制图像print(np.sort(x))print(np.argsort(x))plt.scatter(x, y)  # 基于原始的x,y 绘制散点图plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')  # 原始的x , y 预测值 绘制折线图(拟合回归线)plt.show()

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1536962.html

相关文章

数据交换的金钟罩:合理利用安全数据交换系统,确保信息安全

政府单位为了保护网络不受外部威胁和内部误操作的影响,通常会进行网络隔离,隔离成内网和外网。安全数据交换系统是专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。 使用…

mysql事务使用和事务隔离级别与sqlserver的比较

在 MySQL 中,事务 (Transaction) 是一个将一组 SQL 语句作为一个整体执行的机制。事务确保要么所有操作都执行成功,要么在遇到错误时回滚到之前的状态,从而保证数据库数据的一致性和完整性。 事务的四大特性(ACID) 事…

【Flutter 面试题】解析 Flutter 与 Native 开发优缺点:跨平台、性能比较、生态成熟度、开发效率、原生功能支持

【Flutter 面试题】解析 Flutter 与 Native 开发优缺点:跨平台、性能比较、生态成熟度、开发效率、原生功能支持 文章目录 写在前面口述回答补充说明写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星T…

系统架构设计师教程 第12章 12.4 信息系统架构案例分析 笔记

12.4 信息系统架构案例分析 ★★★★☆ 12.4.1 价值驱动的体系结构——连接产品策略与体系结构 1.价值模型概述 价值模型核心的特征可以简化为三种基本形式。 (1)价值期望值:表示对某一特定功能的需求,包括功能、质量和不同 级别质量的实用性。 (2)…

Docker镜像命令汇总笔记

1.Docker镜像 Docker 镜像是用于部署容器化应用的轻量级、可执行的软件包。它们包含了运行特定应用所需的所有内容,包括代码、运行时环境、系统工具、系统库和设置。Docker 镜像通过文件来实现不同层的分发,每一层对应Dockerfile中的一个指令&#xff0…

YOLO11 实例分割模型做行人分割

实例分割是检测和隔离图像中单个对象的关键技术,YOLO11 是执行这项任务的最佳模型之一。在本文中,你将学习如何使用 YOLO11 分割模型有效地在图像中分割人物。我们将涵盖从设置 Python 环境和安装必要的库,到下载测试图像和可视化分割结果的所有内容。通过本教程的学习,你将…

购物网站毕业设计-电子电器商城管理系统SpringBootSSM框架开发

目录 1. 系统概述 1.1背景介绍 1.2 课题意义 1.3课题目标 2. 主要功能模块 2.1 前端用户模块 2.2 后端管理模块 2.3 功能图展示 3. 技术选型 3.1 VUE介绍 3.2 JAVA介绍 3.3 MySQL介绍 4. 系统设计 4‌.1数据库设计 5 详细设计 5.1 界面展示 设计一个电子电…

系统统异常和业务异常的区别

系统统异常和业务异常是我们在软件开发和运维过程中经常遇到的问题。虽然两者都会导致系统的不可用,但是它们之间还是存在区别的。 什么是系统异常? 系统异常指的是由于系统发生错误或者不可预料的情况而导致的系统崩溃或不可用的情况。系统异常通常是…