五、特征缩放和多项式回归

目录

一、为什么要使用特征缩放(Feature Scaling)

1.首先来看预测房价的例子

2.特征缩放前后效果对比

二、特征缩放方法

1.统一除以范围最大值

2.均值归一化(Mean Normalization)

3.Z-score标准化(Z-score Normalization)

4.一些可以接受/不接受的缩放范围

三、如何识别梯度下降是否收敛

四、如何选择一个合适的学习率

1.学习曲线(J(w,b)-迭代次数)

2.学习率选择技巧

3.特征缩放和学习率选择实验

(1)在具有多个特征的数据集上运行梯度下降,探索学习率alpha对梯度下降的影响

①多特征数据集

②导入数据集

③绘制每一个特征和结果(房价)的散点分布图

④多特征的梯度下降算法

⑤选用学习率为9.9*10^-7时,迭代10次

⑥选择较小的学习率9.0*10^-7

⑦继续缩小学习率,使用1.0*10^-7

(2)使用z-score标准化通过特征缩放提高梯度下降的性能

①z-score计算公式及各参数计算方法

②代码实现

③标准化过程及效果

④比较原始数据和标准化处理后的各特征值x

⑤用标准化处理后的数据重新执行梯度下降算法

⑥使用训练好的模型进行预测

⑦J(w,b)等值线图下观察标准化对梯度下降算法效果

4.总结

五、特征工程和多项式回归

1.特征工程

2.多项式回归(也是很重要的回归模型)

3.特征工程和多项式回归实验

(1)没有进行特征工程的线性回归模型

(2)使用梯度下降的方式去训练多项式回归模型

(3)使用三次多项式回归模型训练

(4)从另一个角度来考虑选择什么样的模型更好的拟合训练数据

(5)使用特征缩放对x,x^2,x^3进行处理以后的效果

(6)使用特征工程还可以对复杂场景进行函数建模

4.总结

六、本章小结


一、为什么要使用特征缩放(Feature Scaling)

目的:使梯度下降算法运行速度更快,效果更好

1.首先来看预测房价的例子

        x1表示房子面积(范围较大),x2表示卧室数量(范围较小)

        (1)如果初始时,w1设置为50,w2设置为0.1,那么初始计算的price为:100050

        (2)如果初始时,w1设置为0.1,w2设置为50,那么初始计算的price为:500(这个相对更合理)

        从上面可以看到,如果x1和x2两个特征差距太大,相应的w1和w2两个参数也会差距太大

        当x1范围大则w1相应的变化范围就会很小当x2范围小则w2相应的变化范围就会很大

2.特征缩放前后效果对比

        下图是x1、x2进行特征缩放前后的f(x1,x2)散点分布图代价函数J(w,b)的等高线图

        如果按原样训练数据。因为J(w,b)轮廓高而细,梯度下降可能会在结束前来回反弹了很长时间都没办法找到全局最小值的方法。在这种情况下,一个有用的要做的就是缩放特征。这意味着执行一些对训练数据进行变换,使x1的范围现在可以从0到1x2的取值范围也可以是0到1

        数据点看起来更像这样左下的散点图;你可能会注意到下面的图的比例现在相当和上面的不一样。关键是x1和x2现在都是可比较的,如果你运行梯度下降在这里找到一个成本函数,使用它重新缩放x1和x2变换后的数据,轮廓看起来会更像圆圈(右下),梯度下降法可以通过更直接的路径到全局最小值,缩放后更容易找到合适的w和b参数值


二、特征缩放方法

1.统一除以范围最大值

2.均值归一化(Mean Normalization)

        分子为x1-μ(均值)

        分母为范围最大值-范围最小值

        均值归一化的取值范围为-1~1

3.Z-score标准化(Z-score Normalization)

        计算公式为𝑍=(𝑋−𝜇)/𝜎,其中Z表示Z分数,X表示一个数据点的值,μ表示数据集的均值,𝜎表示数据集的标准差

4.一些可以接受/不接受的缩放范围


三、如何识别梯度下降是否收敛

        可以借助J(w,b)-迭代次数学习曲线来获取一些梯度下降的信息

1.如果随着迭代次数增加,J(w,b)不降反增,这表示α可能选择的太大,或者程序出现了bug

2.当迭代到一定次数后,J(w,b)趋于平稳,那么就可能意味着经过这些次数迭代J(w,b)收敛

3.不同的代价函数迭代次数不一样,有的30次就收敛,有的1000次,有的100000次,这个次数经过我们绘制学习曲线也会有个比较直观的认识。

        具体什么时候达到收敛,我们可以设置一个阈值ε,当迭代过程中代价函数的减少值小于这个阈值就可以认为已收敛。


四、如何选择一个合适的学习率

1.学习曲线(J(w,b)-迭代次数)

        可能出现的情况,原因可能是程序存在bug或者学习率过大

        技巧:设置一个非常小的学习率α,如果在这样的学习率下还是会有J(w,b)在迭代中增加,此时就要注意程序内是否存在bug了,这里选择非常小的学习率只是一个调试过程,用于发现程序内可能存在的bug,但不是训练学习算法最好的选择(学习率太小可能会导致需要迭代很多次才能收敛)。

2.学习率选择技巧

        可以使用下面的方式 3× 提高学习率的技巧去给算法选择合适的学习率

3.特征缩放和学习率选择实验

        C1_W2_Lab03_Feature_Scaling_and_Learning_Rate

(1)在具有多个特征的数据集上运行梯度下降,探索学习率alpha对梯度下降的影响

①多特征数据集

②导入数据集
# load the dataset
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']
③绘制每一个特征和结果(房价)的散点分布图

        可以看出哪些特征对价格影响最大。以上,增大尺寸也会增加价格。卧室和地板似乎对价格没有太大影响。新房子比老房子价格高。

④多特征的梯度下降算法

⑤选用学习率为9.9*10^-7时,迭代10次
#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)

可以看到随着迭代次数增加,Cost是变大的,没有收敛

绘制图像如下:(右图只是展示了Cost和w0的关系,不代表和其他特征的关系也是如此)

⑥选择较小的学习率9.0*10^-7

可见Cost是不断下降了,但是因为学习率太大,没有收敛,一直在“左右横跳”

⑦继续缩小学习率,使用1.0*10^-7

可见效果明显变好

(2)使用z-score标准化通过特征缩放提高梯度下降的性能

z-score计算公式及各参数计算方法

②代码实现
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)
③标准化过程及效果

房屋年龄和面积都归一化后散点分布更加均匀了

④比较原始数据和标准化处理后的各特征值x
# 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)}")

观察图像,标准化处理前后范围变化:

注意,上面规范化数据的范围以0为中心,大致为+/- 1。最重要的是,每个特征的范围是相似的。

⑤用标准化处理后的数据重新执行梯度下降算法

注意alpha的值要大得多,这将加速下降

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

 在上一章的最后我们使用原始的方法进行计算:

四、多特征的线性回归模型-CSDN博客文章浏览阅读1.3k次,点赞41次,收藏17次。在本文中介绍了多特征的线性回归模型的应用场景、多特征的线性回归模型梯度下降法、多特征变量的向量表示并强调了向量化操作在效率提升上的重要性。接着,文章详细比较了单特征和多特征梯度下降的区别,以及传统设置变量法与向量表示的异同。最后,通过实际实验,展示了如何运用numpy包对向量或矩阵的各种处理操作,如何运用多特征的线性回归模型梯度下降法迭代计算令代价最小的多个特征参数的值。整篇文章系统地概述了梯度下降在多元线性回归中的应用。https://blog.csdn.net/hehe_soft_engineer/article/details/139449052#t21

上面使用原始数据计算在1000次后还没有收敛,可以看到在标准化处理后进行训练300次后就达到了收敛,收敛速度比较快。

⑥使用训练好的模型进行预测

注意:生成我们的模型的目的是用它来预测数据集中不存在的房价。让我们来预测一套拥有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}")

⑦J(w,b)等值线图下观察标准化对梯度下降算法效果

在下面的J(w,b)等值线图中,参数的比例是匹配的。左边的图是归一化特征前的w[0]平方英尺与w[1]的卧室数量对比图。这幅图太不对称了,无法看到补全轮廓的曲线。相反,当特征归一化后,代价轮廓更加对称。结果是,在梯度下降过程中对参数的更新可以对每个参数的变化取得相似的效果。

4.总结

        选择学习率是训练许多学习算法的重要组成部分,通过理论和实验的学习帮助我们用科学的方式为梯度下降选择一个好的学习率,了解不同的学习率选择对模型训练带来的效果,在直觉上也有助于我们更好的理解如何选择一个好的学习率。


五、特征工程和多项式回归

1.特征工程

    通过直觉或者对问题专业知识的理解去设计新的特性,通常的方式是通过转换或者结合问题的原始特征来完成,目的是让学习算法更容易做出准确合理的预测。

比如刚开始f(x)只是使用长和宽作为特征来构造线性回归模型,但是发现长×宽=面积引入后,面积更能决定房价,所以我们就可以完善我们的模型,将面积作为特征引入。

2.多项式回归(也是很重要的回归模型)

下面根据数据可以选择不同的模型来训练,有的效果好,有的效果差

3.特征工程和多项式回归实验

C1_W2_Lab04_FeatEng_PolyReg:探索特征工程和多项式回归,它允许你使用线性回归的机制来拟合非常复杂,甚至非线性的函数。

(1)没有进行特征工程的线性回归模型

x数据集使用的0~20之间的整数,y数据集对每个x计算:y=1+x^{2}

# create target data
x = np.arange(0, 20, 1)
y = 1 + x**2
X = x.reshape(-1, 1)model_w,model_b = run_gradient_descent_feng(X,y,iterations=1000, alpha = 1e-2)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("no feature engineering")
plt.plot(x,X@model_w + model_b, label="Predicted Value");  plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()

用训练模型去对训练数据集预测,可以看到线性的模型并不能描述真实数据

(2)使用梯度下降的方式去训练多项式回归模型

设置模型为y=wx^{2}+b

# create target data
x = np.arange(0, 20, 1)
y = 1 + x**2# Engineer features 
X = x**2      #<-- added engineered featureX = X.reshape(-1, 1)  #X should be a 2-D Matrix
model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha = 1e-5)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Added x**2 feature")
plt.plot(x, np.dot(X,model_w) + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

多项式模型预测效果和训练数据拟合,效果很好

(3)使用三次多项式回归模型训练

        y=w_{1}x+w_{2}x^{2}+w_{3}x^{3}+b

特征值为一次项,二次项,三次项

# create target data
x = np.arange(0, 20, 1)
y = x**2# engineer features .
X = np.c_[x, x**2, x**3]   #<-- added engineered feature

还是使用梯度下降法训练:

model_w,model_b = run_gradient_descent_feng(X, y, iterations=10000, alpha=1e-7)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("x, x**2, x**3 features")
plt.plot(x, X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

拟合的三次多项式:效果并不如二次多项式好

(4)从另一个角度来考虑选择什么样的模型更好的拟合训练数据

对x轴进行标度变换为X(大写),如果变换后的y和X(大写)满足线性关系,那么说明对x轴进行标度变换的函数就是比较好的回归模型

下面就是选择使用X=x,X=x^2,X=x^3作为标度变换模型来看y与标度变化后的X之间的关系:

# create target data
x = np.arange(0, 20, 1)
y = x**2# engineer features .
X = np.c_[x, x**2, x**3]   #<-- added engineered feature
X_features = ['x','x^2','x^3']
fig,ax=plt.subplots(1, 3, figsize=(12, 3), sharey=True)
for i in range(len(ax)):ax[i].scatter(X[:,i],y)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("y")
plt.show()

很明显,经过x^2的标度变化后,y与X满足线性关系

(5)使用特征缩放对x,x^2,x^3进行处理以后的效果

使用z-score算法对特征进行缩放

# create target data
x = np.arange(0,20,1)
X = np.c_[x, x**2, x**3]
print(f"Peak to Peak range by column in Raw        X:{np.ptp(X,axis=0)}")# add mean_normalization 
X = zscore_normalize_features(X)     
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X,axis=0)}")

使用缩放后的值进行模型训练:(注意预测的输入值也要进行缩放处理

x = np.arange(0,20,1)
y = x**2X = np.c_[x, x**2, x**3]
X = zscore_normalize_features(X) model_w, model_b = run_gradient_descent_feng(X, y, iterations=100000, alpha=1e-1)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Normalized x x**2, x**3 feature")
plt.plot(x,X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

(6)使用特征工程还可以对复杂场景进行函数建模

对于完全拟合的函数y=cos(x)产生的数据集,我们使用复杂的多项式对这个数据集进行拟合

x = np.arange(0,20,1)
y = np.cos(x/2)X = np.c_[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 = zscore_normalize_features(X) model_w,model_b = run_gradient_descent_feng(X, y, iterations=1000000, alpha = 1e-1)plt.scatter(x, y, marker='x', c='r', label="Actual Value"); plt.title("Normalized x x**2, x**3 feature")
plt.plot(x,X@model_w + model_b, label="Predicted Value"); plt.xlabel("x"); plt.ylabel("y"); plt.legend(); plt.show()

拟合效果图示:

4.总结

        本小节通过基础知识讲解和实验学习了线性回归如何使用特征工程为复杂的、甚至高度非线性的函数建模;认识到在进行特征工程时应用特征缩放的重要性。


六、本章小结

        本章通过理论和实验的学习帮助我们用科学的方式为梯度下降选择一个好的学习率,了解不同的学习率选择对模型训练带来的效果,在直觉上也有助于我们更好的理解如何选择一个好的学习率。

        又通过基础知识讲解和实验学习了线性回归如何使用特征工程为复杂的、甚至高度非线性的函数建模,认识到在进行特征工程时应用特征缩放的重要性。


欢迎大家交流学习,如有错误请批评指正!

下一章将学习:分类相关内容

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

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

相关文章

C# WPF入门学习主线篇(三十四)—— 图形和动画

C# WPF入门学习主线篇&#xff08;三十四&#xff09;—— 图形和动画 图形和动画是WPF的重要组成部分&#xff0c;能够大幅提升应用程序的用户体验。本篇博客将详细介绍WPF中图形和动画的使用方法&#xff0c;涵盖基本图形绘制、动画创建及多媒体的应用。通过本文&#xff0c;…

爆肝三天,制作属于自己的地图——DAY3(地图数据发布详细教程)

4&#xff0c;重建顶层。 倾斜摄影数据的组织方式&#xff0c;一个 Data 目录下的 Tile 可能会成千上万&#xff0c;如果不使用重建顶层&#xff0c;那么输出的3DTiles的包围盒会非常非常多&#xff0c;增加加载时长。重建顶层&#xff0c;程序会根据瓦片的空间结构关系采用八…

一文理清sshc包的使用场景和掌握两种连接方式及异常场景

一文理清sshc、ssh包的使用场景和两种连接方式 SSH协议SSH&#xff08;Secure Shell&#xff09;协议支持通过多种编程语言实现客户端和服务端的功能&#xff0c;包括Go、Python、Java、C#等。 GO语言 sshc包的使用建立连接1.DialWithKey2.DialWithPasswd 运行命令异常场景思维…

Git+Gitlab 远程库测试学习

Git远程仓库 1、Git远程仓库 何搭建Git远程仓库呢&#xff1f;我们可以借助互联网上提供的一些代码托管服务来实现 Gitee 码云是国内的一个代码托管平台&#xff0c;由于服务器在国内&#xff0c;所以相比于GitHub&#xff0c;码云速度会更快 码云 Gitee - 基于 Git 的代码托…

Mathtype插入word,以及mathtype在word上的卸载

1.Mathtype插入word 花了两个小时&#xff0c;最终得出的极品简单的安装方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; mathype下载地址&#xff1a;https://store.wiris.com/zh/products/mathtype/download/windows 下载完傻瓜式安装&#xff0c;不要…

集成学习模型对比优化—银行业务

1.Data Understanding 2.Data Exploration 3.Data Preparation 4.Training Models 5.Optimization Model 集成学习模型对比优化—银行业务 1.Data Understanding import pandas as pd from matplotlib import pyplot as plt import seaborn as sns df pd.read_csv(&quo…

如何通过 6 种方法从 iPhone 恢复已删除的文件

想知道如何从 iPhone 恢复已删除的文件吗&#xff1f;本文将指导您如何从 iPhone 恢复数据&#xff0c;无论您是否有 iTunes/iCloud 备份。 iPhone 上已删除的文件去哪儿了&#xff1f; 许多 iPhone 用户抱怨他们经常丢失 iPhone 上的一些重要文件。由于意外删除、iOS 更新失败…

安装golang

官网:All releases - The Go Programming Language (google.cn) 下载对应的版本安装即可

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;激活码&#xff0c;点击获取 ② 这个时候就跳转到现成账号页面&#xff0c;点击获取体验号&#xff0c;如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

VRChat 2024年裁员原因与背景深度分析

VRChat&#xff0c;作为2022年元宇宙/VR社交领域的巨头&#xff0c;近期在2024年宣布裁员计划&#xff0c;其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露&#xff0c;VRChat的创始人因缺乏经验和过度自信…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

大语言模型 (LLM) 红队测试:提前解决模型漏洞

大型语言模型 (LLM) 的兴起具有变革性&#xff0c;以其在自然语言处理和生成方面具有与人类相似的卓越能力&#xff0c;展现出巨大的潜力。然而&#xff0c;LLM 也被发现存在偏见、提供错误信息或幻觉、生成有害内容&#xff0c;甚至进行欺骗行为的情况。一些备受关注的事件包括…

什么充电宝牌子好用耐用?高评分绿联、西圣、罗马仕充电宝实测

在如今这个科技飞速发展的时代&#xff0c;充电宝已经成为我们日常生活中不可或缺的电子配件之一。当我们外出旅行、办公或者日常出行时&#xff0c;充电宝能够为我们的电子设备及时补充电量&#xff0c;让我们时刻保持在线。然而&#xff0c;面对市场上众多的充电宝品牌和型号…

小程序无法调用服务端问题排查

1、问题描述 突然有一天线上的小程序不能登录&#xff0c;经查小程序无法调用。经查无法小程序页面无法调用后台服务。 2、排查过程 由于无法登录小程序发布服务器&#xff0c;无法测试小程序前端服务器到服务端网络&#xff0c;并且小程序无法看到日志。所以就得从服务端和网…

idea有这个类却报红,无法用快捷键找到

idea有这个类却报红&#xff0c;无法用快捷键找到&#xff0c;但是项目启动却没有任何问题&#xff0c;严重影响到了开发效率&#xff0c;关idea 重新打开没有用。 找了一圈&#xff0c;办法如下&#xff1a; 1、点击左上角的 File—>Invalidate Caches/Restar 2、点击 In…

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置&#xff0c;提高开发效率&#xff0c;涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

【自动部署】4.阿里云ECS服务器 IDEA自动部署项目

如何在IDEA中&#xff0c;自动部署项目到阿里云ECS服务器&#xff1f;今天我们就来实现一键部署功能。 执行maven命令打包免密登录&#xff0c;在IEDA中连接服务器执行stop脚本上传jar包到服务器执行start脚本查看运行日志 1.安装Alibaba Cloud Toolkit 2.配置host 3.自动化部…