梯度下降法预测波士顿房价以及简单的模型评估

目录

    • 原理
    • 代码
    • 关于归一化的思考

原理

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

观察数据可知属性之间差距很大,为了平衡所有的属性对模型参数的影响,首先进行归一化处理。
每一行是一个记录,每一列是个属性,所以对每一列进行归一化。
二维数组归一化:1、循环方式2、广播运算,这里使用广播运算

代码

import numpy as np
import tensorflow as tf 
import matplotlib.pyplot as plt 
boston_housing =tf.keras.datasets.boston_housing
(train_x,train_y),(test_x,test_y)=boston_housing.load_data()
print(train_x.shape,train_y.shape,test_x.shape,test_y.shape)
num_train =len(train_x)
num_test =len(test_x)
#数据处理
x_train=(train_x-train_x.min(axis=0))/(train_x.max(axis=0)-train_x.min(axis=0))
y_train=train_yx_test=(test_x-test_x.min(axis=0))/(test_x.max(axis=0)-test_x.min(axis=0))  
y_test=test_yx0_train=np.ones(num_train).reshape(-1,1)
x0_test=np.ones(num_test).reshape(-1,1)
X_train=tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32)
X_test=tf.cast(tf.concat([x0_test,x_test],axis=1),tf.float32)
print(X_train.shape,X_test.shape)
#把房价转换成列向量
Y_train =tf.constant(y_train.reshape(-1,1),tf.float32)
Y_test =tf.constant(y_test.reshape(-1,1),tf.float32)
print(Y_train.shape,Y_test.shape)#设置超参数
learn_rate=0.01
#迭代次数
iter=2000
#每10次迭代显示一下效果
display_step=200
#设置模型参数初始值
np.random.seed(612)
W=tf.Variable(np.random.randn(14,1),dtype=tf.float32)
#训练模型
#存放训练误差和泛化误差
mse_train=[]
mse_test=[]
for i in range(0,iter+1):with tf.GradientTape() as tape:PRED_train=tf.matmul(X_train,W)Loss_train=0.5*tf.reduce_mean(tf.square(Y_train-PRED_train))PRED_test=tf.matmul(X_test,W)Loss_test=0.5*tf.reduce_mean(tf.square(Y_test-PRED_test))mse_train.append(Loss_train)mse_test.append(Loss_test)#更新参数dL_dW = tape.gradient(Loss_train,W)W.assign_sub(learn_rate*dL_dW)#plt.plot(x,pred)if i % display_step==0:print("i:%i, Train Loss:%f,Test Loss:%f"%(i,mse_train[i],mse_test[i]))
#模型和数据可视化
plt.figure(figsize=(20,4))
#训练误差与泛化误差的对比
plt.subplot(1,3,1)
plt.ylabel("MSE")
plt.plot(mse_train,color="blue",linewidth=3)
plt.plot(mse_test,color="red",linewidth=3)
#训练集:实际房价与预测房价
plt.subplot(1,3,2)
plt.ylabel("Price")
plt.plot(y_train,color="blue",marker="o",label="true_price")
plt.plot(PRED_train,color="red",marker=".",label="predict")
plt.legend()
#测试集:实际房价与预测房价
plt.subplot(1,3,3)
plt.ylabel("Price")
plt.plot(y_test,color="blue",marker="o",label="true_price")
plt.plot(PRED_test,color="red",marker=".",label="predict")
plt.legend()
plt.show()

效果:
在这里插入图片描述
在这里插入图片描述
接下来增加迭代次数、加大显示间隔(iter=8000,display_step=500),观察一下数据。

i:0, Train Loss:263.193481,Test Loss:276.994110
i:500, Train Loss:26.911524,Test Loss:26.827421
i:1000, Train Loss:21.887274,Test Loss:22.039745
i:1500, Train Loss:19.030270,Test Loss:20.212139
i:2000, Train Loss:17.118929,Test Loss:19.456861
i:2500, Train Loss:15.796998,Test Loss:19.260981
i:3000, Train Loss:14.858858,Test Loss:19.365534
i:3500, Train Loss:14.177205,Test Loss:19.623528
i:4000, Train Loss:13.671043,Test Loss:19.949770
i:4500, Train Loss:13.287543,Test Loss:20.295109
i:5000, Train Loss:12.991438,Test Loss:20.631872
i:5500, Train Loss:12.758676,Test Loss:20.945164
i:6000, Train Loss:12.572536,Test Loss:21.227776
i:6500, Train Loss:12.421189,Test Loss:21.477076
i:7000, Train Loss:12.296155,Test Loss:21.693033
i:7500, Train Loss:12.191257,Test Loss:21.877157
i:8000, Train Loss:12.101960,Test Loss:22.031694

可以发现在迭代次数为2500——3000之间,测试误差上升了,而训练误差一如既往地减少,说明产生过拟合了。从图表也能看出来。
在这里插入图片描述
接下来把关注点聚焦于迭代次数为2500——3000之间,增加显示间隔,找到测试集损失上升的点,得到最佳的迭代次数。
在这里插入图片描述
确定迭代次数为2520后,再看看效果如何:
在这里插入图片描述
这样就是大概的流程了,要注意参数的得到与两个参数有关,一个是迭代次数,一个是学习率,这里我们选择控制变量法,控制学习率为一个较合适的参数之后固定不动,然后调节迭代次数。

关于归一化的思考

对训练集和测试集的归一化可以采用以下3种方式:
1、先把测试集和训练集放在一起,进行属性归一化,然后再分开。
2、先划分训练集和测试集,然后分别归一化。
3、先划分训练集和测试集,归一化训练集,记录训练集的归一化参数(最大值,最小值),然后再使用训练集的参数去归一化测试集。

第一种情况下,相当于强制把训练集和测试集的数据分布统一化,造成训练集和测试集的数据分布类似,测试误差和训练误差关联度高,测试误差并不能很好地反映实际泛化误差,不建议采用;
第二种情况下,训练样本和测试样本独立归一化,保证了两种数据分布的独立性,测试误差与训练误差独立,测试误差能够较好反映泛化误差,实际操作中多采用这种方法;
第三种情况下,由于训练集和测试集都使用训练集的参数进行归一化,使得测试集的数据并不能真正被归一化,只能近似归一化,这种方式在batch_normal中有采用到,也能保证数据的独立性,达到标准化的目的,而且能够简化计算,提高计算效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378334.shtml

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

相关文章

Windows Phone 内容滑动切换实现

在新闻类的APP中,有一个经常使用的场景:左右滑动屏幕来切换上一条或下一条新闻。 那么通常我们该使用哪种方式去实现呢?可以参考一下Demo的实现步骤。 1,添加Windows Phone用户自定义控件。例如: 这里我为了演示的方便…

使用鸢尾花数据集实现一元逻辑回归、多分类问题

目录鸢尾花数据集逻辑回归原理【1】从线性回归到广义线性回归【2】逻辑回归【3】损失函数【4】总结TensorFlow实现一元逻辑回归多分类问题原理独热编码多分类的模型参数损失函数CCETensorFlow实现多分类问题独热编码计算准确率计算交叉熵损失函数使用花瓣长度、花瓣宽度将三种鸢…

【神经网络计算】——神经网络实现鸢尾花分类

本blog为观看MOOC视频与网易云课堂所做的笔记 课堂链接: 人工智能实践:TensorFlow笔记 吴恩达机器学习 疑问与思考 为什么按照batch喂入数据 之前看的视频里面处理数据都是一次性将所有数据喂入,现在看的这个视频对数据进行了分组投入。这是为何&#…

c# xaml语言教程,c#学习之30分钟学会XAML

1.狂妄的WPF相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API。例如:WinForm(带控件表单)、GDI(2D图形)、DirectXAPI(3D图形)以及流媒体和流文档等,都需要不同的API来构建应用程序。WPF就是看着上面的操作复杂和…

.NET 小结之内存模型

.NET 小结之内存模型 为什么要解.NET 的内存模型 在.NET下的内存管理、垃圾回收其实大部分不需要我们操心,因为大部分.NET已经帮我们做了,通常情况下也不需要考虑这些。但是如果想要了解一些.NET一些稍微“底层”的原理,如:“装箱…

【电设控制与图像训练题】【激光打靶】【openmv测试代码以及效果】

9.4加入串口通讯,送出靶心坐标、激光坐标、激光所在环数、方位;加入防误判操作 博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 规则坐标系代码总结相关openmv使用文…

MVC3中的视图文件

在MVC3中的视图部分,Razor视图引擎是与以往不同的地方之一,使用Razor的视图文件再也不是以往的ASPX文件了,是cshtml文件,在新建视图的时候也会发现增加多了几类文件 由上到下分别是 MVC 3 Layout Page:与原来Web Form的…

C语言 链表拼接 PTA,PTA实验 链表拼接 (20point(s))

本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:struct ListNode {int data;struct ListNode *next;};函数接口定义:struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);其中list1和list2是用户传入的两个按…

【TensorFlow学习笔记:神经网络优化(6讲)】

目录【1】NN复杂度【2】指数衰减学习率【3】激活函数优秀激活函数所具有的特点常见的激活函数对于初学者的建议【4】损失函数【5】缓解过拟合——正则化【6】参数优化器【1】SGD【2】SGDM(SGD基础上增加了一阶动量)【3】Adagrade(SGD基础上增加了二阶动量)【4】RMSProp(SGD基础…

第十章 开箱即用

第十章 开箱即用 “开箱即用”(batteries included)最初是由Frank Stajano提出的,指的是Python丰富的标准库。 模块 使用import将函数从外部模块导入到程序中。 import math math.sin(0)#结果为:0.0模块就是程序 在文件夹中创…

Openmv通过串口接收数据、发送数据与stm32通信

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 参考接线星瞳教程openmv传送数据STM32解码程序参考 接线 星瞳教程

c语言尹宝林答案,c程序设计导引 尹宝林

《C程序设计导引》特别适合作为计算机和非计算机专业学生学习高级语言程序设计的教材,也可供计算机等级考试者和其他各类学习者使用参考。17.40定价:44.75(3.89折)/2013-05-01《大学计算机优秀教材系列:C程序设计导引》是一本讲解C程序设计的…

第十一章 文件

第十一章 文件 打开文件 当前目录中有一个名为beyond.txt的文本文件,打开该文件 调用open时,原本可以不指定模式,因为其默认值就是’r’。 import io f open(beyond.txt)文件模式 值描述‘r’读取模式(默认值)‘w…

【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言一、搭建网络八股sequential1.函数介绍2.6步法实现鸢尾花分类二、搭建网络八股class1.创建自己的神经网络模板:2.调用自己创建的model对象三、MNIST数据集1.用sequential搭建网络实现手写数字识别2.用…

第十二章 图形用户界面

第十二章 图形用户界面 GUI就是包含按钮、文本框等控件的窗口 Tkinter是事实上的Python标准GUI工具包 创建GUI示例应用程序 初探 导入tkinter import tkinter as tk也可导入这个模块的所有内容 from tkinter import *要创建GUI,可创建一个将充当主窗口的顶级组…

Sqlserver 2005 配置 数据库镜像:数据库镜像期间可能出现的故障:镜像超时机制

数据库镜像期间可能出现的故障 SQL Server 2005其他版本更新日期: 2006 年 7 月 17 日 物理故障、操作系统故障或 SQL Server 故障都可能导致数据库镜像会话失败。数据库镜像不会定期检查 Sqlservr.exe 所依赖的组件来验证组件是在正常运行还是已出现故障。但对于某…

【神经网络八股扩展】:自制数据集

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言1、文件一览2、将load_data()函数替换掉2、调用generateds函数4、效果总结前言 本讲目标:自制数据集,解决本领域应用 将我们手中的图片和标签信息制作为可以直接导入的npy文件。 1、文件一览 首先看…

c语言输出11258循环,c/c++内存机制(一)(转)

一:C语言中的内存机制在C语言中,内存主要分为如下5个存储区:(1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。(2)堆(Heap):由程序员用…

【神经网络八股扩展】:数据增强

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言TensorFlow2数据增强函数数据增强网络八股代码:总结前言 本讲目标:数据增强,增大数据量 关于我们为何要使用数据增强以及常用的几种数据增强的手法,可以看看下面的文章&#…

分享WCF聊天程序--WCFChat

无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了测试和部分修改,感觉还不错,分享给大家。先来看下运行效果:开启服务:客户端程序&#xf…