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

本文主要是介绍吴恩达机器学习-可选实验室:特征工程和多项式回归(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()

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

恭喜!

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

这篇关于吴恩达机器学习-可选实验室:特征工程和多项式回归(Feature Engineering and Polynomial Regression)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/789415

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件