吴恩达机器学习-可选实验室:特征工程和多项式回归(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.mzph.cn/news/730800.shtml

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

相关文章

2023最新pytorch安装教程,简单易懂,面向初学者(Anaconda+GPU)

一、前言 目前是2023.1.27,鉴于本人安装过程中踩得坑&#xff0c;安装之前我先给即将安装pytorch的各位提个醒&#xff0c;有以下几点需要注意 1.判断自己电脑是否有GPU 注意这点很重要&#xff0c;本教程面向有NVIDA显卡的电脑&#xff0c;如果你的电脑没有GPU或者使用AMD显…

STM32day3

1.思维导图 1.总结任务的调度算法&#xff0c;把实现代码再写一下 /* Definitions for myTask02 */ osThreadId_t myTask02Handle; uint32_t myTask02Buffer[ 64 ]; osStaticThreadDef_t myTask02ControlBlock; const osThreadAttr_t myTask02_attributes {.name "myTa…

代码随想录算法训练营第三十九天|62.不同路径、63. 不同路径 II

62.不同路径 刷题https://leetcode.cn/problems/unique-paths/description/文章讲解https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html视频讲解https://www.bilibili.com/video/BV1ve4y1x7Eu/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…

react的diff源码

react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElement 内容与旧的 fiber 树作对比&#xff0c;比较出它们…

md5绕过

文章目录 \\和\\\md5数组绕过科学计数法绕过双md加密md5碰撞Hash长度攻击 下面会以同一道题给大家演示&#xff1a; (题目来源与nssctf) 和 在php代码中我们会看到和&#xff0c;虽然两个都是表示相等&#xff0c;但是在细节上会有所部区别 &#xff1a;是弱比较&#xff0c;只…

0201安装报错-hbase-大数据学习

1 基础环境简介 linux系统&#xff1a;centos&#xff0c;前置安装&#xff1a;jdk、hadoop、zookeeper&#xff0c;版本如下 软件版本描述centos7linux系统发行版jdk1.8java开发工具集hadoop2.10.0大数据生态基础组件zookeeper3.5.7分布式应用程序协调服务hbase2.4.11分布式…

Sora 作者被曝读博期间仅发表两篇论文,我们是否需要重塑科研价值观?

众所周知&#xff0c;在当今学术界&#xff0c;论文数量和产出速度常常被视为研究者生产力和学术成就的重要标尺。笔者也面试过很多博士生候选人&#xff0c;大家普遍会以自己读博期间发表过10几篇甚至几十篇论文而骄傲&#xff0c;很少有候选人会强调自己读博期间虽然发表论文…

Matlab|基于目标级联法的微网群多主体分布式优化调度

目录 主要内容 1.1 上层微网群模型 1.2 下层微网模型 部分程序 实现效果 下载链接 主要内容 本文复现《基于目标级联法的微网群多主体分布式优化调度》文献的目标级联部分&#xff0c; 建立微网群系统的两级递阶优化调度模型: 上层是微网群能量调度中心优化调度…

java中的字符串比较(题目作示例)

错误的代码 import java.util.Scanner; public class one {public static void main(String[] args) {Scanner scnew Scanner(System.in);String b"47568";int i0;for ( i 0; i <3; i){String asc.next();if(ab){System.out.println("密码正确&#xff0c;登…

在外包公司干了4年,技术退步2年...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

白话模电:1.绪论与半导体(考研面试常问问题)

一、什么是信号&#xff1f;什么是电信号&#xff1f; 信号反映消息的物理量&#xff0c;电信号是反应电压或电流变化的物理量。 二、什么是模拟信号&#xff1f;什么是数字信号&#xff1f; 模拟信号是时间和数值上均连续的信号&#xff0c;数字信号是时间和数值上均离散的信号…

[HackMyVM]靶场 Zeug

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

Seata 2.x 系列【5】直接部署

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 环境要…

学习嵌入式C语言要掌握到什么程度?

学习嵌入式C语言要掌握到什么程度&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#…

Java注解介绍

Java注解 注解介绍元注解RetentionTargetDocumentedInherited接口类测试结果 注解介绍 Java注解&#xff08;Annotation&#xff09;是一种元数据&#xff08;Metadata&#xff09;的形式&#xff0c;它可以被添加到Java代码中的类、方法、变量、参数等元素上&#xff0c;以提…

一分钟带你入门Selenium入门!【建议收藏】

Selenium入门 欢迎阅读Selenium入门讲义&#xff0c;本讲义将会重点介绍Selenium的入门知识以及Selenium的前置知识。 自动化测试的基础 在Selenium的课程以前&#xff0c;我们先回顾一下软件测试的基本原理&#xff0c;为我们进一步完成Selenium自动化测试做好准备。 软件…

考研数学|张宇30讲,搭配什么基础题?

如果基础跟的是张宇&#xff0c;那么基础做的题目要根据自己的题目来决定 题集的选择最好不要太难&#xff0c;而且基础也不用做太多题目&#xff0c;以数学知识点的运用&#xff0c;培养做题感觉为主。 张宇老师的课程在基础阶段也有配套的课程&#xff0c;就是《张宇基础30…

关于进程和线程

目录 前言: 1进程: 1.1定义&#xff1a; 1.1.1进程是操作系统分配资源的基本单元&#xff0c;拥有自己的独立空间和资源。 1.1.2每个进程都有一个唯一的PID&#xff08;进程标识符&#xff09;来标识。 1.2进程间通信&#xff1a; 1.2.1进程不是孤立的&#xff0c;它们之…

搜索引擎都没流量啦,官网建设还有啥意义?

百度等搜索引擎都没啥流量了&#xff0c;再建设官网还有啥用&#xff1f;如果你把官网定位于获客&#xff0c;那真的没啥太大用处&#xff0c;但是官网不仅仅是用来获客的。 一、搜索引擎的流量被稀释了 搜索引擎流量减少的原因有多个&#xff0c; 1. 社交媒体的崛起&#xf…

电机控制系列模块解析(第八篇)—— 高频注入法

一、基本原理 在电机控制领域&#xff0c;高频方波注入法常用于估计转子的位置和转速。其工作原理是每隔一定的时间间隔在电机输出电压上叠加一个电压脉冲。然后&#xff0c;在两相静止坐标系下或者同步旋转坐标系下对采样时刻的电压和电流进行相应的计算&#xff0c;以实现对…