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

news2024/11/19 10:44:09

文章目录

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

线性回归API 介绍:

在这里插入图片描述

波士顿房价预测

数据属性:

在这里插入图片描述

机器学习代码实现

1.导入库

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中上述读取数据方式失效通过下面方法读取数据

import pandas as pd
import numpy as np

data_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.模型代码实现

# 正规方程法
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))

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

在这里插入图片描述

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

在这里插入图片描述

导包

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

定义函数表示欠拟合

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

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

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

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次方程

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

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

在这里插入图片描述

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 函数上继续增加维度 会导致模型会兼顾每个测试点,导致过拟合

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正则化线性回归模型对象

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正则化线性回归模型

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.coloradmin.cn/o/2200106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李沐 X动手学深度学习 数据操作+数据预处理 学习笔记(无代码,纯理论部分)

数据结构介绍 机器学习和神经网络最主要的的数据结构:N维数组0维数组:标量,eg:1.0(是一个浮点数,可能表示一个类别)1维数组:向量,eg:[1.0, 2.7, 3.4](特征向量&#xf…

Java中System类和RunTime类的Api

目录 System 类 1)out 2)err 3)in 4)currentTimeMillis() 5)nanoTime() 6)arraycopy(Object 要从里面复制东西的数组, int 要从里面复制东西数组的索引起始位置, Object 获得复制元素的数组, int 获得复制元素数组的起始索引, int 要复制东西的个数) 7)gc() 8)exit(int status)…

Miniconda 入门级使用教程

前言 Miniconda是一个更小的Anaconda发行版(Anaconda是一个包含大量预装数据科学和机器学习库的Python发行版),它只包含conda包管理器和Python以及其必要的库。Miniconda的目的是提供一个更轻量级的选项来安装和运行conda环境,同…

动态轻量级线程池项目

动态线程池: 使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢? ① 代码中创建了一个ThreadPoolExecutor,但是不知道参数设置多少比较合适。 ② 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务&…

电脑缺失msvcr120.dll怎样修复,马上教你6种修复方法

在用电脑的时候,经常会碰到各种错误提示,比如“msvcr120.dll丢失”,导致的结果就是某些程序无法正常启动。那么,这个dll文件到底是啥,为什么会丢失,怎么解决呢?将通过这篇文章详细解释一下&…

Agent心理诊所上线!基于1.3K抑郁症问诊对话,上海交大团队搭建大模型对话Agent,可初诊抑郁症

心理健康问题是当今社会最大的挑战之一,根据 WHO 的世界心理健康报告,约有 2 亿 4,600 万人患有抑郁障碍,平均每 10 万人中就有 3,153 个案例,可以说,这是最常见的精神障碍之一。 然而,如今在心理健康方面…

终于有人把思科认证全部说清楚了

思科作为全球领先的网络设备供应商,其认证体系在全球范围内被广泛认可; 但是大部分了解的朋友都只知道CCNA、CCNP和CCIE,但对思科的整个系统不是很清楚。 随着Cisco产品线的扩大和市场份额的不断提升,Cisco认证产品从当初仅有的路…

Kubernetes的Pod调度:让你的应用像乘坐头等舱!

一、Kubernetes 中 Pod 调度的重要性 在 Kubernetes 的世界里,Pod 调度就像是一个繁忙的交通指挥官,负责把小车(也就是我们的 Pod)送到最合适的停车位(节点)。调度不仅关乎资源的合理利用,还关乎…

【投稿优惠|稳定检索】2024 年信息学、网络与电子工程国际会议(INEE 2024)

2024 年信息学、网络与电子工程国际会议 2024 International Conference on Informatics, Networks, and Electronic Engineering 【1】大会信息 会议名称:2024 年信息学、网络与电子工程国际会议 会议简称:INEE 2024 大会时间:请查看官网 …

P-Tuning v2:一种普遍有效的提示调整方法

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调(fine-tuning)来适应特定任务虽然效果显著,但存在训练成本高、参数存储量大等问题。为了解决这些问题,清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…

whistle配合app抓包

whistle配合app抓包 1.前置准备2.手机配置3.手机安装证书1.前置准备 下载启动whistle,本例使用默认的127.0.0.1:8899 需要保证Capture TUNNEL CONNECTS处在开启状态: 输入命令:w2 start,获取当前局域网的ip地址,并记录: 2.手机配置 打开无线局域网连接dxm_phone,配置…

Codeforces Round 833 (Div. 2)

比赛链接:Dashboard - Codeforces Round 833 (Div. 2) - Codeforces B. Diverse Substrings 题意: 思路: 当字符串长度 > 10 时,每个字符出现的次数至少是 2 次 ( 0 ~ 9 个出现一次,剩余字符出现 ) 当字符串长度…

Kali Linux 下载与安装手册

目录 Kali 是什么? 通过Kali官方网站下载 Kali 是什么? Kali Linux,前称BackTrack,是一个基于Debian的Linux发行版,专为数字取证和渗透测试而设计。它由Offensive Security Ltd.开发和维护,旨在为安全专…

10.10 题目总结(累计)

1.完成所有任务需要的最少轮数(思路) 思路:将数组的数依次放到map里面,如果有相同则在原有的基础上加一,然后全部放完之后,就遍历map,然后计算总次数,然后有一次的的则直接返回. AC: class Solution {public int minimumRounds(int[] tasks) {HashMap<Integer, Integer>…

【C++】--类和对象(3)

&#x1f911;个人主页: 起名字真南 &#x1f911;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 深入构造函数2 类型转换3 static成员4 友元函数5 内部类6 匿名对象 1 深入构造函数 之前我们实现构造函数的时候&#xff0c;初始化成员变量都是在函数体内赋值&#xff0c…

linux-冯诺伊曼体系结构以及操作系统

冯诺依曼体系结构 我们不畅见到计算机&#xff0c;如笔记本&#xff0c;不常见的如服务器&#xff0c;大部分都遵循着冯诺伊曼体系结构 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个硬件组件组成。 输入单元&#xff1a;包括键盘 , 鼠标&#xff0c;扫描…

鸿蒙开发之ArkUI 界面篇 二十四 计数器案例

计数器案例&#xff0c;点击’-‘按钮&#xff0c;数字减少1&#xff0c;点击啊‘’按钮&#xff0c;数字加一 分析&#xff1a;这里需要三个组件&#xff0c;外层容器是Row&#xff0c;从左往右的组件分别是ButtonTextButton&#xff0c;涉及到修改更新界面&#xff0c;变量需…

Java语言教程:打造你的第一款五子棋游戏 JAVA学习攻略心得总结

目录 Java语言教程&#xff1a;打造你的第一款五子棋游戏 游戏简介 游戏代码 自学Java攻略及功能 1. Java基础知识 2. 面向对象编程&#xff08;OOP&#xff09; Java简介 游戏简介 五子棋&#xff0c;又称连珠&#xff0c;是一种两人对弈的棋类游戏。五子棋的规则简单易…

红帽7—Mysql路由部署

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到路由器&#xff0c;并令路由器使用相应的路由策略 来处理连接&#xff0c;使其…

添加菜品到购物车

分析 数据库设计 代码开发 三个步骤&#xff1a; 判断当前商品是否已经在购物车中如果在购物车中&#xff0c;更新购物车中商品数量如果不在购物车中&#xff0c;添加到购物车 controller层 /*** 添加购物车** return*/PostMapping("/add")ApiOperation("添加购…