【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate

导入所需的库

import numpy as np
np.set_printoptions(precision=2)
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0'; 
plt.style.use('./deeplearning.mplstyle')
from lab_utils_multi import  load_house_data, compute_cost, run_gradient_descent 
from lab_utils_multi import  norm_plot, plt_contour_multi, plt_equal_scale, plot_cost_i_w

1、数据集

Size (sqft)Number of BedroomsNumber of floorsAge of HomePrice (1000s dollars)
9522165271.5
12443264232
19473217509.8

利用以上表格中的数据构建一个线性模型,这样我们可以预测房屋的价格(1200 sqft, 3 bedrooms, 1 floor, 40 years old)

# load the dataset
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']

绘制每个房子特征与房屋价格之间的关系图

fig,ax=plt.subplots(1, 4, figsize=(12, 3), sharey=True)
for i in range(len(ax)):ax[i].scatter(X_train[:,i],y_train)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("Price (1000's)")
plt.show()

在这里插入图片描述
对每个特征与目标变量(价格)进行绘图可以提供一些关于哪些特征对价格有最强影响的线索。如上所述,增加房屋面积也会增加价格。而卧室数和楼层数似乎对价格影响不大。新房比旧房价格更高。

2、学习率

设置不同的学习率进行梯度下降,观察一下的结果

2.1 α \alpha α = 9.9e-7

#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)

运行过程:
在这里插入图片描述

看起来学习率太高了。解决方案没有收敛。损失在增加而不是减少,绘制结果可视化:

plot_cost_i_w(X_train, y_train, hist)

在这里插入图片描述
右侧的图显示了参数 w 0 w_0 w0 的值。在每次迭代中,它超过了最优值,结果导致成本增加而不是接近最小值。需要注意的是,这不是一个完全准确的图,因为每次迭代时有4个参数被修改,而不仅仅是一个。该图仅显示了 w 0 w_0 w0 的值,其他参数被设定为一些良好的值。在这个图和后面的图中,可能会注意到蓝线和橙线略有偏差。

2.2 α \alpha α = 9e-7

#set alpha to 9e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 9e-7)

在这里插入图片描述

损失在整个运行过程中都在减少,这表明学习率 α \alpha α 不是太大。

plot_cost_i_w(X_train, y_train, hist)

在这里插入图片描述
在左图中,可以看到损失在逐渐减少,这是预期的结果。在右图中,可以看到 w 0 w_0 w0 仍然在最小值周围振荡,但每次迭代它都在减小,而不是增加。dj_dw[0] 在每次迭代中改变符号,因为 w[0] 跳过了最优值。

2.3 α \alpha α = 1e-7

#set alpha to 1e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 1e-7)

在这里插入图片描述

plot_cost_i_w(X_train,y_train,hist)

在这里插入图片描述
在左图中,可以看到损失在逐渐减少,这是预期的结果。在右图中,可以看到 w 0 w_0 w0 在没有越过最小值的情况下逐渐减小。dj_w0 在整个运行过程中都是负数。尽管可能不如前面的例子那么快,但是这个解也会收敛。

3、特征缩放

3.1 特征缩放的原因

让我们再看看 α \alpha α = 9e-7的情况。这非常接近可以设置 α \alpha α到不发散的最大值。这是前几次迭代的简短运行:
在这里插入图片描述
如上所示,虽然损失正在降低,但很明显由于 w 0 w_0 w0的梯度更大,因此比其他参数取得更快的进展。

下图显示了 α \alpha α = 9e-7非常长时间的运行结果。这花费几个小时。
在这里插入图片描述
从上图中可以看到,损失在最初降低后缓慢下降。注意w0w0,w1,w2 以及 dj_dw0dj_dw1-3 之间的区别。w0 很快达到了接近最终值的状态, dj_dw0 快速减小到一个很小的值来显示w0接近最终值,而其他参数更缓慢地减小。

为什么会是这样? 有什么办法可以改进它?
在这里插入图片描述
上图说明了 w w w更新不均匀的原因。

  • α \alpha α 由所有的参数更新共享.
  • 公共误差项被乘以特征值来更新 w w w,而不是偏置项 b b b.
  • 特征值的大小变化幅度差异很大,导致一些特征的更新速度比其他特征快得多。在这个例子中, w 0 w_0 w0 乘以 ‘size(sqft)’,该特征通常大于 1000,而 w 1 w_1 w1 乘以 ‘number of bedrooms’,该特征通常在 2-4 范围内。

所以,解决方案就是特征缩放

在课程中介绍了三种不同的技术:

  • 特征缩放,本质上是将每个特征除以用户选择的值,使得特征值的范围在 -1 到 1 之间。
  • 均值归一化: x i : = x i − μ i m a x − m i n x_i := \dfrac{x_i - \mu_i}{max - min} xi:=maxminxiμi
  • Z-score 归一化.

3.2 Z-score 归一化

Z-score 归一化后,所有特征的均值为 0,标准差为 1.

为实现 Z-score 归一化, 根据以下公式调整输入值:
x j ( i ) = x j ( i ) − μ j σ j (4) x^{(i)}_j = \dfrac{x^{(i)}_j - \mu_j}{\sigma_j} \tag{4} xj(i)=σjxj(i)μj(4)
其中, j j j 选择一个特征或矩阵 X 中的一列。 µ j µ_j µj 是特征(j)所有值的平均值, σ j \sigma_j σj 是特征(j)的标准差。
μ j = 1 m ∑ i = 0 m − 1 x j ( i ) σ j 2 = 1 m ∑ i = 0 m − 1 ( x j ( i ) − μ j ) 2 \begin{align} \mu_j &= \frac{1}{m} \sum_{i=0}^{m-1} x^{(i)}_j \tag{5}\\ \sigma^2_j &= \frac{1}{m} \sum_{i=0}^{m-1} (x^{(i)}_j - \mu_j)^2 \tag{6} \end{align} μjσj2=m1i=0m1xj(i)=m1i=0m1(xj(i)μj)2(5)(6)

这里需要注意:对特征进行归一化时,存储用于归一化的值(用于计算的平均值和标准差)非常重要。从模型中学习参数后,我们经常想要预测我们以前没有见过的房屋的价格。给定一个新的 x 值(客厅面积和卧室数量),我们必须首先使用我们之前根据训练集计算的平均值和标准差对 x 进行标准化。

以下是实现过程:

def zscore_normalize_features(X):"""computes  X, zcore normalized by columnArgs:X (ndarray): Shape (m,n) input data, m examples, n featuresReturns:X_norm (ndarray): Shape (m,n)  input normalized by columnmu (ndarray):     Shape (n,)   mean of each featuresigma (ndarray):  Shape (n,)   standard deviation of each feature"""# find the mean of each column/featuremu     = np.mean(X, axis=0)                 # mu will have shape (n,)# find the standard deviation of each column/featuresigma  = np.std(X, axis=0)                  # sigma will have shape (n,)# element-wise, subtract mu for that column from each example, divide by std for that columnX_norm = (X - mu) / sigma      return (X_norm, mu, sigma)#check our work
#from sklearn.preprocessing import scale
#scale(X_orig, axis=0, with_mean=True, with_std=True, copy=True)

可以看一下 Z-score 归一化逐步的转变过程:

mu     = np.mean(X_train,axis=0)   
sigma  = np.std(X_train,axis=0) 
X_mean = (X_train - mu)
X_norm = (X_train - mu)/sigma      fig,ax=plt.subplots(1, 3, figsize=(12, 3))
ax[0].scatter(X_train[:,0], X_train[:,3])
ax[0].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[0].set_title("unnormalized")
ax[0].axis('equal')ax[1].scatter(X_mean[:,0], X_mean[:,3])
ax[1].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[1].set_title(r"X - $\mu$")
ax[1].axis('equal')ax[2].scatter(X_norm[:,0], X_norm[:,3])
ax[2].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[2].set_title(r"Z-score normalized")
ax[2].axis('equal')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
fig.suptitle("distribution of features before, during, after normalization")
plt.show()

在这里插入图片描述
上图显示了两个训练集参数“年龄”和“平方英尺”之间的关系。这些都是以相同比例绘制的。

左:未标准化:“尺寸(平方英尺)”特征的值范围或方差远大于年龄的范围。
中:第一步查找从每个特征中减去平均值。这留下了以零为中心的特征。很难看出“年龄”特征的差异,但“尺寸(平方英尺)”显然在零左右。
右:第二步除以方差。这使得两个特征都以零为中心,具有相似的尺度。

接下来,对数据进行标准化并将其与原始数据进行比较。

# normalize the original features
X_norm, X_mu, X_sigma = zscore_normalize_features(X_train)
print(f"X_mu = {X_mu}, \nX_sigma = {X_sigma}")
print(f"Peak to Peak range by column in Raw        X:{np.ptp(X_train,axis=0)}")   
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")

在这里插入图片描述

通过归一化,每列的峰值范围从数千倍减少到 2-3 倍。

fig,ax=plt.subplots(1, 4, figsize=(12, 3))
for i in range(len(ax)):norm_plot(ax[i],X_train[:,i],)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count");
fig.suptitle("distribution of features before normalization") 
plt.show()
fig,ax=plt.subplots(1,4,figsize=(12,3))
for i in range(len(ax)):norm_plot(ax[i],X_norm[:,i],)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count"); 
fig.suptitle(f"distribution of features after normalization")plt.show()

在这里插入图片描述
在这里插入图片描述
接下来,使用归一化的数据重新运行梯度下降算法。

w_norm, b_norm, hist = run_gradient_descent(X_norm, y_train, 1000, 1.0e-1, )

在这里插入图片描述
缩放后的特征可以更快地获得非常准确的结果!请注意,在这个相当短的运行结束时,每个参数的梯度都很小。0.1 的学习率是使用归一化特征进行回归的良好开端。接下来绘制预测值与目标值的关系图。请注意,预测是使用归一化特征进行的,而绘图是使用原始特征值显示的。

#predict target using normalized features
m = X_norm.shape[0]
yp = np.zeros(m)
for i in range(m):yp[i] = np.dot(X_norm[i], w_norm) + b_norm# plot predictions and targets versus original features    
fig,ax=plt.subplots(1,4,figsize=(12, 3),sharey=True)
for i in range(len(ax)):ax[i].scatter(X_train[:,i],y_train, label = 'target')ax[i].set_xlabel(X_features[i])ax[i].scatter(X_train[:,i],yp,color=dlorange, label = 'predict')
ax[0].set_ylabel("Price"); ax[0].legend();
fig.suptitle("target versus prediction using z-score normalized model")
plt.show()

在这里插入图片描述

3.3 预测

生成模型的目的是用它来预测数据集中没有的房价。我们来预测一套 1200 平方英尺、3 间卧室、1 层、40 年楼龄的房子的价格。必须使用训练数据标准化时得出的平均值和标准差来标准化数据。

# First, normalize out example.
x_house = np.array([1200, 3, 1, 40])
x_house_norm = (x_house - X_mu) / X_sigma
print(x_house_norm)
x_house_predict = np.dot(x_house_norm, w_norm) + b_norm
print(f" predicted price of a house with 1200 sqft, 3 bedrooms, 1 floor, 40 years old = ${x_house_predict*1000:0.0f}")

在这里插入图片描述

3.4 损失等值线

查看特征缩放的另一种方法是根据损失等值线。当特征尺度不匹配时,等值线图中损失与参数的关系图是不对称的。在下图中,参数的比例是匹配的。左图是 w[0](平方英尺)与 w[1](标准化特征之前的卧室数量)的损失等值线图。该图非常不对称,以至于看不到完整轮廓的曲线。相反,当特征标准化时,损失轮廓更加对称。结果是,在梯度下降期间更新参数可以使每个参数取得相同的进展。
在这里插入图片描述

plt_equal_scale(X_train, X_norm, y_train)

在这里插入图片描述

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

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

相关文章

sqlserver 使用SQLOLEDB 远程数据库同步数据

exec sp_addlinkedserver remote_server, , SQLOLEDB, ip exec sp_addlinkedsrvlogin remote_server, false,null, 账号, 密码 --查询方式 select * from remote_server.数据库名.dbo.表名 --不再使用时删除链接服务器 exec sp_dropserver remote_server, droplogins…

Oracle免费在线编程:Oracle APEX

前提: 注意:你要有个梯子才能更稳定的访问。 不需要安装Oracle,但是需要注册。(还算方便的) 注册&登录过程 进入Oracle APEX官网,我们选择免费的APEX工作区即可,点击“免费注册”。在注册…

DASCTF 2023 0X401七月暑期挑战赛web复现

目录 <1> Web (1) EzFlask(python原型链污染&flask-pin) (2) MyPicDisk(xpath注入&文件名注入) (3) ez_cms(pearcmd文件包含) (4) ez_py(django框架 session处pickle反序列化) <1> Web (1) EzFlask(python原型链污染&flask-pin) 进入题目 得到源…

软件设计师(五)软件工程基础知识

一、软件工程概述 软件开发和维护过程中所遇到的各种问题称为“软件危机”。 软件工程是指应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件问题的工程&#xff0c;其目的是提高软件生产率、提高软件质量、降低软件成本。 #mermaid-svg-h3j6K…

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

基于JenkinsPythonUbuntuDocker的接口/UI自动化测试环境部署详细过程 1 Jenkins是什么&#xff1f;2 Jenkins目标是什么&#xff1f;3 什么是CI/CD?3.1 CI持续集成3.2 CD持续部署3.3 CD持续交付 4 Ubuntu环境4.1 环境需求4.2 实现思路 5 Ubuntu下安装Docker6 安装Jenkins6.1 拉…

基于Vue+ElementUI+Echarts+G2Plot的仪表盘设计器,代码完全开源

简介 &#x1f525;DashBoard基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘设计、预览、资源管理、组件管理等能力&#xff0c;支持JSON、MySQL、Oracle、PostgreSQL、HTTP、JavaScript、Groovy等数据集接入&#xf…

【LeetCode每日一题】——807.保持城市天际线

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 中等 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…

PowerDesigner中table视图显示code与name

问题描述 使用PowerDesigner做数据库设计&#xff0c;要做评审&#xff0c;默认整体效果没有name显示&#xff0c;很不方便 1、右键单击&#xff0c;选择display 2、table->advanced 3、设置columns&#xff0c;点击右边的放大镜 4、自定义你需要显示的组件 效果图

性能测试/负载测试/压力测试之间的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …

python-网络爬虫.BS4

BS4 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库&#xff0c; 它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方 式。 Beautiful Soup 4 官方文档&#xff1a;https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 帮助手册&…

Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)

简介 前边介绍的都是通过按钮点击启动按钮来启动appium服务&#xff0c;有的小伙伴或者童鞋们乍一听可能不信&#xff0c;或者会问如何通过命令行启动appium服务呢&#xff1f;且听一一道来。 一睹为快 其实相当的简单&#xff0c;不看不知道&#xff0c;一看吓一跳&#xf…

右键文件夹 ------- 打开 vscode的方法

1、右键vscode点击属性 2、这是地址栏&#xff0c;一会复制即可 3、新建一个txt文件,将这个复制进去 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\VSCode] "Open with Code" "Icon""D:\\Microsoft VS Code\\Code.exe"[HKE…

docker基本命令学习 | Docker网络、Docker镜像发布

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; docker安装、卸载 docker安装使用 卸载旧版本docker或者环境 [rootiZf8zdcobr3fw7vn0p3538Z /]# yum remove docker \ > docker-client \ >…

混合云:降本增效,云计算的未来趋势,企业数字化转型的王道!

随着云计算技术的不断发展&#xff0c;云计算已经成为了企业信息化的主流趋势&#xff0c;而混合云则是云计算领域发展的一个新方向。混合云指的是将公有云和私有云相结合&#xff0c;构建一种新的云计算模式。本文将从混合云的定义、特点、优势以及应用场景等方面进行阐述&…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 三)

Link装饰器&#xff1a;父子双向同步 子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 装饰器使用规则说明 Link变量装饰器 说明 装饰器参数 无 同步类型 双向同步。 父组件中State, Stor…

语音合成是什么?如何进行语音合成TTS数据采集?

我们在上一篇讲到语音数据采集分为常见的两种语音数据采集类型&#xff0c;一个是语音识别数据&#xff08;ASR&#xff09;&#xff0c;另一个是语音合成&#xff08;TTS&#xff09;。这一期中&#xff0c;我们将介绍语音合成技术是什么&#xff0c;如何采集语音合成数据和制…

亚马逊店铺的回款周期是多久?

现如今&#xff0c;开亚马逊店铺可是一个技术活&#xff0c;一旦有一个环节&#xff0c;或者是一件事情没有做好&#xff0c;对整个亚马逊店铺过程中影响都是十分巨大的&#xff0c;不少亚马逊卖家就吃过这方面的亏。 很多亚马逊卖家就是吃亏在这些方面&#xff0c;现在要想开…

OpenAI的提供的Model简要介绍

OpenAI提供的model 通过OpenAI的接口可以查看所有支持的模型(目前的账号无GPT4的权限&#xff0c;所以没有列举GPT4相关的模型)。 import os import openai import pandas as pd from IPython.display import displayopenai.api_key os.getenv("OPENAI_API_KEY")…

瀑布流布局columns

瀑布流布局其核心是基于一个网格的布局&#xff0c;而且每行包含的项目列表高度是随机的&#xff08;随着自己内容动态变化高度&#xff09;&#xff0c;同时每个项目列表呈堆栈形式排列&#xff0c;最为关键的是&#xff0c;堆栈之间彼此之间没有多余的间距差存大。还是上张图…

【UI自动化测试】Jenkins配置

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…