吴恩达机器学习-可选实验室:特征工程和多项式回归(Feature Engineering and Polynomial Regression)

文章目录

    • 目标
    • 工具
    • 特征工程和多项式回归概述
    • 多项式特征
      • 选择功能
      • 备用视图
      • 扩展功能
      • 复杂的功能
    • 恭喜!

目标

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

工具

您将利用在以前的实验中开发的函数以及matplotlib和NumPy。

import numpy as np
import matplotlib.pyplot as plt
from lab_utils_multi import zscore_normalize_features, run_gradient_descent_feng
np.set_printoptions(precision=2)  # reduced display precision on numpy arrays

特征工程和多项式回归概述

开箱即用,线性回归提供了一种构建如下形式模型的方法:

fw,b= w0x0 + w1x1+…+ wn -1xn-1+ b (1)

如果你的特征/数据是非线性的,或者是特征的组合呢?例如,房价不倾向于与居住面积成线性关系,而是对非常小或非常大的房子不利,导致上图所示的曲线。我们如何使用线性回归的机制来拟合这条曲线呢?回想一下,我们拥有的“机制”是修改(1)中的参数w, b以使方程与训练数据“拟合”的能力。然而,无论对(1)中的w,b进行多少调整,都无法实现对非线性曲线的拟合。

多项式特征

上面我们考虑的是一个数据是非线性的场景。我们试着用已知的知识来拟合非线性曲线。我们从一个简单的二次方程开始:

y=1+x^2

你对我们使用的所有例程都很熟悉。可以在lab_utils.py文件中查看它们。我们将使用np.c […]这是一个NumPy例程,用于沿着列边界进行连接。

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

X@model_w + model_b: 这是执行矩阵乘法的操作。X是一个二维数组(可能是通过x.reshape(-1,
1)得到的),model_w是模型权重,model_b是模型截距。这里计算的是线性回归模型的预测值y,即y = Xw + b。

在这里插入图片描述
在这里插入图片描述
不出所料,不太合适。需要的是y = w0x0^2+b这样的东西,或者多项式特征。要实现这一点,您可以修改输入数据来设计所需的特性。如果您将原始数据与x值平方的版本交换,那么您可以实现y = wox + b。让我们尝试一下。将x换成下面的x**2:

# create target data
x = np.arange(0, 20, 1)
y = 1 + x**2# Engineer features 
X = x**2      #<-- added engineered feature
X = 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()

在这里插入图片描述
在这里插入图片描述
太棒了!近乎完美的契合。注意图正上方的w和b的值:w, b通过梯度下降找到:w:[1.], b: 0.0490。梯度下降法将w, b的初始值修改为(1.0,0.049)或

y = 1 * x^2+ 0.049

的模型,非常接近我们的目标y = 1 *x^2 + 1。如果你把它放久一点,它可能是一个更好的匹配。

选择功能

上面,我们知道x2项是必需的。需要哪些特性可能并不总是很明显。我们可以添加各种潜在的特性来尝试找到最有用的。例如,如果我们改为:

y= w0x0 + w1x 1^2 +w2x2 ^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()

np: 指的是NumPy库,它是Python中用于科学计算的一个基础库,提供了大量的数学函数和操作数组的工具。
c_[]: 是NumPy中的一个对象,用于沿第二轴(即列)连接数组。它允许你将多个一维数组作为列拼接成一个二维数组。
在这里插入图片描述

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

注意w=[0.08 0.54 0.03]和b的值为0.0106,这意味着拟合/训练后的模型为:

0.08x+0.54x2 +0.03x2+0.0106

梯度下降通过增加相对于其他数据的wi项来强调最适合x2数据的数据。如果你要跑很长时间,它会继续减少其他条款的影响。

梯度下降是通过强调其相关参数来为我们选择“正确”的特征

让我们回顾一下这个想法:

  • 最初,特征被重新缩放,以便它们彼此比较
  • 更小的权重值意味着更不重要/正确的特征,在极端情况下,当权重变为零或非常接近零时,相关特征有助于将模型拟合到数据。
  • 上面,在拟合之后,与x2特征相关的权值比x或x3的权值大得多,因为它在拟合数据时最有用。

备用视图

上面,多项式特征是根据它们与目标数据的匹配程度来选择的。另一个考虑这个问题的方法是注意我们仍然在使用线性回归一旦我们创建了新的特性。鉴于此,最佳特征将是相对于目标的线性特征。这是最好的理解举个例子。

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

在这里插入图片描述
上面,很明显,映射到目标值y的x2特征是线性的。然后,线性回归可以很容易地使用该特征生成模型。

扩展功能

如上一个实验所述,如果数据集具有明显不同尺度的特征,则应将特征缩放应用于速度梯度下降。在上面的例子中,有x, x2和x3,它们自然会有非常不同的尺度。让我们把z分数归一化应用到我们的例子中。

# 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)}")

np.ptp() 函数是 NumPy 库中的一个函数,用于计算数组沿指定轴的数值范围(最大值与最小值之差)。这个函数名“ptp”代表“peak to peak”,直译为“峰到峰”,即从最低点到最高点的距离。当你对数据集进行分析时,了解数据的范围可以帮助你更好地理解数据的分布情况。
在这里插入图片描述

在这里插入图片描述
现在我们可以用一个更激进的alpha值再试一次:

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

在这里插入图片描述
在这里插入图片描述
w: [5.27e-05 1.13e+02 8.43e-05], b: 123.5000
特征缩放允许更快地收敛。再次注意w的值,w项,也就是x2项是最重要的。梯度下降法几乎消除了x3项。

复杂的功能

通过特征工程,即使是非常复杂的函数也可以建模:

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

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

恭喜!

在这个实验中,你:学习了如何使用特征工程对复杂的,甚至是高度非线性的函数进行线性回归建模认识到在进行特征工程时应用特征缩放的重要性

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

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

相关文章

【vue2基础教程】vue指令

文章目录 前言一、内容渲染指令1.1 v-text1.2 v-html1.3 v-show1.4 v-if1.5 v-else 与 v-else-if 二、事件绑定指令三、属性绑定指令总结 前言 Vue.js 是一款流行的 JavaScript 框架&#xff0c;广泛应用于构建交互性强、响应速度快的现代 Web 应用程序。Vue 指令是 Vue.js 中…

cf火线罗技鼠标宏最细教程(鬼跳,上箱,一键顺,usp速点,雷神三连发及压枪,AK火麒麟压枪.lua脚本)

一.前言 因为我发现火线的鼠标宏非常多&#xff0c;想着自己也有罗技鼠标&#xff0c;看能不能自己写一写让游玩的时候更方便操作一些&#xff0c;可能不一定有什么帮助&#xff0c;但也是一个学习的过程&#xff0c;下面就把我自己的心得和代码详细的记录下来&#xff0c;好多…

注意力机制(代码实现案例)

学习目标 了解什么是注意力计算规则以及常见的计算规则.了解什么是注意力机制及其作用.掌握注意力机制的实现步骤. 1 注意力机制介绍 1.1 注意力概念 我们观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的), 是因为我们大脑能够很快把注意力放在事物…

C语言从入门到精通 第十一章(文件操作)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

Vue事件处理:.passive修饰符与应用场景

.passive修饰符 passive这个修饰符会执行默认方法。你们可能会问&#xff0c;明明默认执行为什么会设置这样一个修饰符。这就要说一下这个修饰符的本意了。 浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时&#xff0c;才能知道内部是否会调用preventDefa…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

【计网】TCP协议安全与风险:深入探讨网络通信的基石

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 &#x1f310;前言 &#x1f512;正文 TCP (Transmission Control Protocol): UDP (User Datagram Protocol): HTTP (Hypertext Transfer …

【动态规划.3】[IOI1994]数字三角形 Number Triangles

题目 https://www.luogu.com.cn/problem/P1216 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7→3→8→7→5 的路径产生了最大权值。 分析 这是一个动态规划…

3.8 动态规划 背包问题

一.01背包 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 携带研究材料: 时间限制&#xff1a;5.000S 空间限制&#xff1a;128MB 题目描述: 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会…

杨辉三角(附html,Python,c++杨辉三角代码)

1、前言 杨辉三角很早学编程就知道&#xff0c;但不知道杨辉是古人&#xff01; 一次偶然的机会&#xff0c;和杨辉三角对上了眼神——杨辉&#xff01;究竟你是怎么发现杨辉三角的呢&#xff1f; 于是经过了长达3个月锲而不舍的探究。 终究也没发现自己想要的最终结果。 …

【YOLO v5 v7 v8 v9小目标改进】AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失

AFPN 渐进式特征金字塔网络&#xff1a;解决多尺度特征融合中&#xff0c;信息在传递过程丢失 提出背景AFPN 多尺度特征金字塔 非邻近层次的直接特征融合 自适应空间融合操作 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背景 论文&#xff1a;https:…

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作&#xff0c;所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容&#xff08;可能有因为安装完…

神州大地人类来源猜想

在公元前2000年以前&#xff0c;伟大的中华民族还是石器时代&#xff0c;我们有很多美好的神话和传说&#xff0c;三皇五帝就是这个时代伟大部落或者部落首领的故事。 关于人类的历史&#xff0c;从基因学上最新的研究成果大概是这样的&#xff0c;虽然从300万年前就诞生了人类…

[Buuctf] [MRCTF2020]Transform

1.查壳 64位exe文件&#xff0c;没有壳 2.用64位IDA打开 找到主函数&#xff0c;F5查看伪代码 从后往前看&#xff0c;有一个判断语句&#xff0c;是两个数组进行比较的&#xff0c;我们双击byte_40F0E0查看里面的内容 所以能够推出byte_414040的内容&#xff0c;byte_4140…

Window下编写的sh文件在Linux/Docker中无法使用

Window下编写的sh文件在Linux/Docker中无法使用 一、sh文件目的1.1 初始状态1.2 目的 二、过程与异常2.1 首先获取标准ubuntu20.04 - 正常2.2 启动ubuntu20.04容器 - 正常2.3 执行windows下写的preInstall文件 - 报错 三、检查和处理3.1 评估异常3.2 处理异常3.3 调整后运行测试…

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…

06. Nginx进阶-Nginx代理服务

proxy代理功能 正向代理 什么是正向代理&#xff1f; 正向代理&#xff08;forward proxy&#xff09;&#xff0c;一个位于客户端和原始服务器之间的服务器。 工作原理 为了从原始服务器获取内容&#xff0c;客户端向代理发送一个请求并指定目标&#xff08;即原始服务器…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…