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

news2024/12/29 13:44:47

支持我的工作 🎉
如果您想看到更详细、排版更精美的该系列文章,请访问:2022吴恩达机器学习Deeplearning.ai课程作业
在这里插入图片描述

可选实验:特征工程和多项式回归

目标

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

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)  
  • from lab_utils_multi import zscore_normalize_features, run_gradient_descent_feng

    从自定义模块lab_utils_multi中导入两个函数,zscore_normalize_featuresrun_gradient_descent_feng。这些函数通常用于特征标准化和运行梯度下降算法

  • np.set_printoptions(precision=2)

    设置NumPy数组的打印选项,使得数组显示时的小数精度为两位。这在数据处理和调试时非常有用,因为它可以让输出更简洁,易于阅读。

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

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

f w , b = w 0 x 0 + w 1 x 1 + … + w n − 1 x n − 1 + b (1) f_{\mathbf{w},b} = w_0x_0 + w_1x_1+ \ldots + w_{n-1}x_{n-1} + b \tag{1} fw,b=w0x0+w1x1++wn1xn1+b(1)

如果你的特征/数据是非线性的或是特征的组合怎么办?例如,房价往往不会随居住面积线性变化,但会对非常小或非常大的房屋进行惩罚,导致如上图所示的曲线。我们如何使用线性回归的工具来拟合这条曲线?回顾一下,我们所拥有的“工具”是修改(1)中的参数 w \mathbf{w} w b \mathbf{b} b 以将方程“拟合”到训练数据。然而,仅通过调整(1)中的 w \mathbf{w} w b \mathbf{b} b 是无法实现对非线性曲线的拟合的。


多项式特征

上面我们考虑了数据非线性的情况。让我们尝试使用我们目前所知道的方法来拟合一条非线性曲线。我们将从一个简单的二次方程开始: y = 1 + x 2 y = 1+x^2 y=1+x2

你已经熟悉我们使用的所有程序。它们在 lab_utils.py 文件中可以查看。我们将使用 np.c_[..],这是一个 NumPy 例程,用于沿列边界连接

## 创建了目标数据
x = np.arange(0, 20, 1) # 生成一个从0到19的整数数组
y = 1 + x**2 # 定义了一个二次方程。实际值
X = x.reshape(-1, 1)

## 使用导入的梯度下降函数来拟合一个模型
model_w,model_b = run_gradient_descent_feng(X,y,iterations=1000, alpha = 1e-2)

## 绘制实际值和预测值的对比图

# 使用红色'x'标记绘制实际值。
plt.scatter(x, y, marker='x', c='r', label="Actual Value") 
# 设置图表标题
plt.title("no feature engineering")
# 绘制预测值。X @ model_w + model_b 计算每个x的预测值。
plt.plot(x, X @ model_w + model_b, label="Predicted Value")

plt.xlabel("X") # 设置x轴标签
plt.ylabel("y")
plt.legend() # 显示图例
plt.show() # 显示图表
  • X = x.reshape(-1, 1)

    这一行代码将一维数组x转换为二维数组X,这里的-11分别表示行数和列数。具体解释如下:

    • reshape方法reshape方法用于改变数组的形状,而不改变其数据
    • 参数 -1 :在 reshape 中,参数 -1 表示根据另一个维度自动计算这个维度的大小。在这个例子中,-1表示行数,由于我们指定了列数为1reshape会根据x的长度自动计算出行数。
    • 参数 1:表示列数为1。

    这样做的目的是为了将数据转换成符合线性回归算法输入要求的格式,即每个样本是一行,每个特征是一列。在这个例子中,每个样本有一个特征,所以每行有一个元素。

  • plt.plot(x, X @ model_w + model_b, label="Predicted Value")

    1. x:这是原始的自变量数组,用于x轴。

    2. X @ model_w + model_b

      • X是形状为(20, 1)的二维数组,每行一个特征。
      • model_w是通过梯度下降算法得到的权重,它是一个数组或标量。
      • model_b是通过梯度下降算法得到的偏置,它是一个标量。

      具体计算过程

      • X @ model_w:这一步是矩阵乘法。假设X的形状是(20, 1),model_w是(1, 1)(如果是标量,它会被自动广播)。结果是一个形状为(20, 1)的数组,每个元素是X中的值乘以model_w
      • 其实就是实现了线性模型,获得了预测值

在这里插入图片描述

正如预期的那样,效果并不好。我们需要的是类似多项式特征的东西。为此,你可以**修改输入数据以构造所需的特征。如果你将原始数据替换为平方后的版本,那么你可以实现对非线性曲线的拟合。让我们试试看。将下面的 X 替换为 X2。

# 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 w w b b b 的值:通过梯度下降找到的 w , b w, b w,b 值为: w : [ 1.0 ] w: [1.0] w:[1.0] b : 0.0490 b: 0.0490 b:0.0490。梯度下降将我们的初始值修改为 ( 1.0 , 0.049 ) (1.0, 0.049) (1.0,0.049),即模型为 1.0 ∗ X 2 + 0.049 1.0*X^2 + 0.049 1.0X2+0.049,非常接近我们目标的 1 + X 2 1 + X^2 1+X2。如果运行时间更长,可能会得到更好的匹配。


选择特征

上面,我们知道需要一个 x 2 x^2 x2 项。但并不总是显而易见需要哪些特征。可以添加各种潜在特征来尝试找到最有用的。例如,如果我们尝试 y = w 0 x 0 + w 1 x 1 2 + w 2 x 2 3 + b y=w_0x_0 + w_1x_1^2 + w_2x_2^3+b y=w0x0+w1x12+w2x23+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()
  • X = np.c_[x, x**2, x**3]
    • 使用numpyc_(column stack)函数将三个数组按列堆叠起来生成新的二维数组X。这里,xx**2x**3分别表示原始变量、变量的平方和变量的立方。

    • 结果X是一个二维数组,每行包含三个特征:xx的平方和x的立方。例如:

      [
       [0, 0, 0],
       [1, 1, 1],
       [2, 4, 8],
       [3, 9, 27],
       ...
       [19, 361, 6859]
      ]
      

在这里插入图片描述

请注意 w \mathbf{w} w 的值为 [0.08, 0.54, 0.03],而 b b b0.0106。这意味着模型在拟合/训练后的形式为: 0.08 x + 0.54 x 2 + 0.03 x 3 + 0.0106 0.08x + 0.54x^2 + 0.03x^3 + 0.0106 0.08x+0.54x2+0.03x3+0.0106
梯度下降通过相对于其他项增加 w 1 w_1 w1 项,强调了与 x 2 x^2 x2 数据最匹配的数据。如果运行时间很长,它将继续减少其他项的影响。

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

让我们回顾这个想法:

  • 最初,特征被重新缩放,使它们可以相互比较
  • 较小的权重值意味着特征不太重要/正确,在极端情况下,当权重变为零或非常接近零时,相关特征对将模型拟合到数据中没有帮助
  • 上面,在拟合后,与 x 2 x^2 x2 特征相关的权重比 x x x x 3 x^3 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) # 在第i个子图上绘制散点图,X[:, i]表示第i列特征,y是目标变量
    ax[i].set_xlabel(X_features[i]) # 设置第i个子图的x轴标签为对应的特征名称
ax[0].set_ylabel("y") # 设置第一个子图的y轴标签为"y"
plt.show()
  • X_features = ['x', 'x^2', 'x^3']

    创建一个列表**X_features**,包含特征的名称。这对于理解和记录数据集中的特征非常有用,特别是在可视化和报告结果时。

  • fig, ax = plt.subplots(1, 3, figsize=(12, 3), sharey=True)

    • 使用**matplotlibsubplots函数创建一个包含1行3列子图的图形对象。figsize=(12, 3)**设置图形的大小为12英寸宽,3英寸高。
    • **sharey=True**表示所有子图共享相同的y轴刻度。

在这里插入图片描述

上面很明显,与目标值 y y y 相比, x 2 x^2 x2 特征是线性的。线性回归可以很容易地使用该特征生成模型。


特征缩放

如上一个实验中所述,如果数据集的特征具有显著不同的尺度,应应用特征缩放来加速梯度下降。在上面的例子中,有 x x x x 2 x^2 x2 x 3 x^3 x3,它们的尺度自然会有很大差异。让我们对我们的例子应用 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)}")

# 均值标准化
X = zscore_normalize_features(X)
# 计算标准化后的数据的峰值范围
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X, axis=0)}")

## print
Peak to Peak range by column in Raw        X:[  19  361 6859]
Peak to Peak range by column in Normalized X:[3.3  3.18 3.28]
  • np.ptp(X, axis=0)
    • ptp 函数计算沿指定轴的峰值范围,即最大值和最小值之间的差值。axis=0表示按列计算。
    • 打印每列的峰值范围。
  • X = zscore_normalize_features(X)
    • 调用导入的 zscore_normalize_features 函数对数据 X 进行 z-score 标准化。标准化后的每个特征将具有均值0和标准差1。

现在我们可以使用更激进的 alpha 值再次尝试:

x = np.arange(0,20,1)
y = x**2

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

## print
w,b found by gradient descent: w: [5.27e-05 1.13e+02 8.43e-05], b: 123.5000
  • plt.plot(x, X @ model_w + model_b, label="Predicted Value")
    • 绘制预测值曲线。X @ model_w + model_b 表示用模型的权重和偏置计算每个**X**的预测值。

在这里插入图片描述

特征缩放使其收敛速度更快。

请再次注意 w \mathbf{w} w 的值。 w 1 w_1 w1 项,也就是 x 2 x^2 x2 项,最为突出。梯度下降几乎消除了 x 3 x^3 x3 项。


复杂函数

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

x = np.arange(0,20,1)
y = np.cos(x/2) # 计算目标变量y,其值为x/2的余弦值。np.cos表示numpy的余弦函数。

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

## print
w,b found by gradient descent: w: [ -1.34 -10.    24.78   5.96 -12.49 -16.26  -9.51   0.59   8.7   11.94
   9.27   0.79 -12.82], b: -0.0073

在这里插入图片描述

小结

  • 学习了如何使用特征工程,通过线性回归建模复杂的,甚至是高度非线性的函数
  • 认识到在进行特征工程时,应用特征缩放是很重要的

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

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

相关文章

SpringBoot:SpringBoot中调用失败如何重试

一、引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 Spring Retry为Spri…

LinkedHashMap、TreeMap

LinkedHashMap&#xff1a; 有序、不重复、无索引&#xff0c;底层是双链表 TreeMap&#xff1a;底层基于红黑树&#xff0c;可以对键进行排序 默认排序&#xff1a;integer和string都是从小到大排序 例题&#xff1a;

基于SpringBoot扶农助农政策管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

Qt:7.QWidget属性介绍(cursor属性-光标形状、font属性-控件文本样式、tooltip属性-控件提示信息)

目录 一、cursor属性-光标形状&#xff1a; 1.1cursor属性介绍&#xff1a; 1.2获取当前光标形状——cursor()&#xff1a; 1.3 设置光标的形状——setCursor()&#xff1a; 1.4 设置自定义图片为光标&#xff1a; 二、font属性-控件文本样式&#xff1a; 2.1font属性介绍…

什么样的网工才是有前途的?

最近整个就业市场的变化&#xff0c;搞得人心惶惶。 可能很多朋友都在思考这样一个问题&#xff1a;现在做网工还有前途吗&#xff1f;什么样的网工才是有前途的&#xff1f;考HCIE认证还来得及吗&#xff1f; 作为网络工程师&#xff0c;该如何确保自己的职业发展方向正确&a…

光荚含羞草基因组-文献精读26

Haplotype-resolved genome of Mimosa bimucronata revealed insights into leaf movement and nitrogen fixation 光荚含羞草单倍型解析基因组揭示了叶片运动和固氮的相关机制 摘要 背景 光荚含羞草起源于热带美洲&#xff0c;具有独特的叶片运动特征&#xff0c;其运动速度…

C语言之进程的学习2

Env环境变量&#xff08;操作系统的全局变量&#xff09;

2024年7月1日 (周一) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 《星刃》早期概念图分享 末世破败环境推主Genki分享了《星…

泛微E9开发 限制明细表列的值重复

限制明细表列的值重复 1、需求说明2、实现方法3、扩展知识点3.1 修改单个字段值&#xff08;不支持附件类型&#xff09;3.1.1 格式3.1.2 参数3.1.3 案例 3.2 获取明细行所有行标示3.2.1 格式3.2.2 参数说明 1、需求说明 限制明细表的“类型”字段&#xff0c;在同一个流程表单…

海康视频播放,包含h5和web插件

自行下载 海康开放平台 demo 都写得很清楚&#xff0c;不多描述 1.视频web插件 vue2写法&#xff0c;公共vue文件写法&#xff0c;调用文件即可 开始时需要以下配置&#xff0c;不知道的找对接平台数据的人&#xff0c;必须要&#xff0c;否则播不了 getParameterData: {po…

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

【后端面试题】【中间件】【NoSQL】MongoDB的优点和分片机制

为什么要用MongoDB 两个关键&#xff1a;灵活性和横向扩展能力 MongoDB是灵活的文档模型&#xff0c;也就是说&#xff0c;如果预计我的数据可以被一个稳定的模型来描述&#xff0c;会倾向于使用MySQL等关系型数据库。而一旦我认为我的数据模型会经常变动&#xff0c;比如我很…

斩获大奖!移远通信以高算力智能模组产品,推动工业生产智能化发展

6月27日&#xff0c;在2024 MWC上海期间&#xff0c;由通信世界全媒体主办的2024信息通信业“新智推荐”优秀企业/方案获奖名单重磅发布。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信凭借其丰富的高算力智能模组产品&#xff0c;以及相关方案在工业智能领域的…

RK3568驱动指南|第十五篇 I2C-第167章 I2C上拉电阻

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

HTML如何在图片上添加文字

HTML如何在图片上添加文字 当我们开发一个页面&#xff0c;插入图片时&#xff0c;需要有一组文字对图片进行描述。那么HTML中如何在图片上添加文字呢&#xff1f;这篇文章告诉你。 先让我们来看下效果图&#xff1a; 句子“这是一张夜空图片”被放置在了图片的左下角。 那么…

SpringBoot整合Solr进行搜索(简单)

SpringBoot整合Solr进行搜索 创建SpringBoot项目pom中加入Solr依赖配置 Solr创建实体编写一个简单的ID查询打印结果 参考文章 创建SpringBoot项目 这里基于aliyun提供的快速构建一个项目。我们这主要是整合Solr。 pom中加入Solr依赖 maven下载地址 pom中加入以下内容&#x…

Redis分布式集群部署

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

如果使用Outlook 2024出现问题

大家好&#xff0c;才是真的好。 很多企业使用Domino服务器当作POP/IMAP邮箱服务器来使用&#xff0c;虽然这不能发挥Domino最佳效能&#xff0c;但也不失为一种简单用法。 另一种企业则使用Domino仅作为应用app平台&#xff0c;邮箱早已迁移至O365或其他平台&#xff0c;他们…

安装和微调大模型(基于LLaMA-Factory)

打开终端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 创建一个名为lora的虚拟环境并指定Python版本为3.9。 https://github.com/echonoshy/cgft-llm/blob/master/llama-factory/README.mdGitHub - hiyouga/…

.net8 Syncfusion生成pdf/doc/xls/ppt最新版本

新建控制台程序 添加包Syncfusion.Pdf.Net.Core包&#xff0c;当前官方的版本号为26.1.39 直接上代码 Syncfusion.Pdf.PdfDocument pdfDocument new Syncfusion.Pdf.PdfDocument(); for (int i 1; i < 10; i) {var page pdfDocument.Pages.Add();PdfGraphics graphics…