目录

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

原理

观察数据可知属性之间差距很大,为了平衡所有的属性对模型参数的影响,首先进行归一化处理。
每一行是一个记录,每一列是个属性,所以对每一列进行归一化。
二维数组归一化: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中有采用到,也能保证数据的独立性,达到标准化的目的,而且能够简化计算,提高计算效率。

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

  1. 机器学习梯度下降法应用波士顿房价预测

    目录 1 线性回归api介绍 小结 2 波士顿房价预测 2.1 案例背景介绍 2.2 案例分析 2.3 回归性能评估 2.4 代码实现 2.4.1 正规方程 2.4.2 梯度下降法 2.5 小结 1 ...

  2. Python实验--线性回归+梯度下降预测波士顿房价

    1. 数据集介绍 先介绍一下将用到的数据集: 共506样本,每个样本包括13个属性以及真实房价 数据预处理: 1.从sklearn的数据库中提取boston的数据库 2.输出每个属性和房价之间的关联 ...

  3. 机器学习:线性回归梯度下降预测波士顿房价

    线性回归 分类: 目标值离散 回归: 目标值连续 线性回归:寻找一种能预测的趋势 线性关系:-二维:直线关系-三维:平面 线性关系定义 y=kx+by = kx + by=kx+b 参数b,偏置项,为 ...

  4. 项目 1: 预测波士顿房价

    机器学习工程师纳米学位 模型评价与验证 项目 1: 预测波士顿房价 欢迎来到机器学习工程师纳米学位的第一个项目!在此文件中,有些示例代码已经提供给你,但你还需要实现更多的功能来让项目成功运行.除非有明 ...

  5. 机器学习项目-预测波士顿房价-整体流程

    项目 1: 预测波士顿房价¶ 第一步. 导入数据 在这个项目中,你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试.通过该数据训练后的好的模型可以被用来对房 ...

  6. p1项目,预测波士顿房价

    机器学习工程师纳米学位 模型评价与验证 项目 1: 预测波士顿房价 欢迎来到机器学习工程师纳米学位的第一个项目!在此文件中,有些示例代码已经提供给你,但你还需要实现更多的功能来让项目成功运行.除非有明 ...

  7. Udacity机器学习入门项目5:预测波士顿房价

    机器学习工程师纳米学位 模型评价与验证 项目 1: 预测波士顿房价 欢迎来到机器学习工程师纳米学位的第一个项目!在此文件中,有些示例代码已经提供给你,但你还需要实现更多的功能来让项目成功运行.除非有明 ...

  8. 项目 : 预测波士顿房价_团结波士顿更新:早鸟票销售将于明天结束。 部分时间表到了!

    项目 : 预测波士顿房价 Unite Boston is just two months away! Early Bird ticket pricing ends tomorrow (Friday, ...

  9. python预测波士顿房价代码

    这是一份使用 Python 预测波士顿房价的示例代码: import numpy as np import pandas as pd from sklearn.datasets import load ...

最新文章

  1. PHP实现http与https转化[转张宴]
  2. 简易数字频率计(verilog HDL设计)(2020维护版本)
  3. Servlet - HTTP超文本传输协议
  4. iOS开发图片纯色填充(两种方式)和缩小图片
  5. 5G NGC — UE 的二次鉴权(Secondary Authentication)方案
  6. 深度神经网络的分布式训练概述:常用方法和技巧全面总结
  7. kdevelp 导入makefile工程
  8. 阿里云Elasticsearch的X-Pack:机器学习、安全保障和可视化
  9. 综述 | 自动驾驶中的计算机视觉
  10. java 一次CPU占用过高问题的排查及解决,java基础面试笔试题
  11. redis hscan用法
  12. 嵌入式linux ucgui,Helper2416开发板移植ucgui(嵌入式linux运行ucgui)
  13. 电商后台管理系统——商品管理
  14. matlab数据类型single vs double
  15. U-SEM体验模型——让游戏交互设计的维度更加清晰
  16. 局部解剖学考试重点总结超级完整
  17. 第六天----数据结构笔记
  18. 洛谷P2404 自然数的拆分问题
  19. centos升级gdb支持pretty-printer
  20. Java中的String类占用多大的内存

热门文章

  1. 【TypeScript系列教程04】编译参数
  2. 【APICloud系列|18】上架Android应用到腾讯应用包、百度手机助手、华为应用市场、小米应用商店、阿里应用分发平台需要准备哪些材料?
  3. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  4. random模块详解
  5. CSS3 iphone式开关的推荐写法
  6. zabbix监控docker容器
  7. jenkins-基础配置
  8. KNNClassifier
  9. 键盘keydown值表
  10. 东哥读书小记 之 《一个广告人的自白》