✨机器学习笔记(三)—— 多元线性回归、特征缩放、Scikit-Learn

news2025/2/24 15:10:12
Course1-Week2:
https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week2

机器学习笔记(三)

  • 1️⃣多元线性回归及矢量化
  • 2️⃣特征缩放(Feature Scaling)
  • 3️⃣学习率(Learning Rate)
  • 4️⃣特征工程(Feature Engineering)
  • 5️⃣多项式回归
  • 6️⃣Scikit-Learn

1️⃣多元线性回归及矢量化

多元线性回归(multiple linear regression)

🎈对于一元线性回归问题,我们只是考虑将 Size 作为 input 的情况来得出房屋的价格。

在这里插入图片描述

🎈而在现实中考虑房屋价格的因素绝不止有一个,所以我们引入了多维特征(房屋大小,卧室的数量,楼层数量,房屋的年龄)四个维度的特征来得出房价,数据集及说明如下图:

在这里插入图片描述

对于这四个维度分别表示为 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4 ,为了方便使用向量 x ⃗ \vec x x 来表示,即对于第 i i i 组案例有 x ⃗ ( i ) = ( x 1 ( i ) , x 2 ( i ) , x 3 ( i ) , x 4 ( i ) ) \vec x^{(i)}=({x_1}^{(i)},{x_2}^{(i)},{x_3}^{(i)},{x_4}^{(i)}) x (i)=(x1(i),x2(i),x3(i),x4(i)),所以可以写出这样的线性回归方程:
f w , b ( x ) = w 1 x 1 + w 2 x 2 + w 3 x 3 + w 4 x 4 + b f_{w,b}(x)=w_1x_1+w_2x_2+w_3x_3+w_4x_4+b fw,b(x)=w1x1+w2x2+w3x3+w4x4+b,而对于 w w w也可用向量来表示 w ⃗ = ( w 1 , w 2 , w 3 , w 4 ) \vec w=({w_1},{w_2},{w_3},{w_4}) w =(w1,w2,w3,w4)

✨ 扩展到 n n n 维,可以得出多元线性回归模型
f w ⃗ , b ( x ⃗ ) = w ⃗ ⋅ x ⃗ + b = w 1 x 1 + w 2 x 2 + . . . + w n x n + b \begin{align} f_{\vec w,b}({\vec x}) &= \vec w \cdot \vec x + b \\ &= w_1x_1+w_2x_2+...+w_nx_n+b \end{align} fw ,b(x )=w x +b=w1x1+w2x2+...+wnxn+b


多元线性回归模型的梯度下降法
在这里插入图片描述


矢量化(Vectorization)

🎈指在数值计算或机器学习中,将循环操作转换为向量或矩阵运算的过程。通过矢量化,可以利用现代处理器的并行计算能力,极大地提升代码的执行效率,尤其是在处理大量数据时。矢量化通常应用于使用 NumPy 或类似库来替代原本的显式循环(for-loop)操作。

在这里插入图片描述

🎈使用 NumPy 的 dot 函数去计算,很好地利用了处理器并行计算的能力,下面通过代码来演示显式循环和矢量化的性能差距。

在这里插入图片描述

# 引入库
import numpy as np    
import time

自定义一个函数用来显式循环计算

def my_dot(a, b): 
    """
   Compute the dot product of two vectors
 
    Args:
      a (ndarray (n,)):  input vector 
      b (ndarray (n,)):  input vector with same dimension as a
    
    Returns:
      x (scalar): 
    """
    x=0
    for i in range(a.shape[0]):
        x = x + a[i] * b[i]
    return x

print(a.shape[0])

用两个数组 a , b a,b a,b 来模拟一下计算过程

np.random.seed(1)
a = np.random.rand(10000000)  # very large arrays
b = np.random.rand(10000000)

tic = time.time()  # capture start time
c = np.dot(a, b)
toc = time.time()  # capture end time

print(f"np.dot(a, b) =  {c:.4f}")
print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ")

tic = time.time()  # capture start time
c = my_dot(a,b)
toc = time.time()  # capture end time

print(f"my_dot(a, b) =  {c:.4f}")
print(f"loop version duration: {1000*(toc-tic):.4f} ms ")

del(a);del(b)  #remove these big arrays from memory

在这里插入图片描述
通过演示,可以明显看到两种计算方式之间的性能差距。

2️⃣特征缩放(Feature Scaling)

🎈对于不同的特征,例如房屋的大小和卧室数量两种参数,由于房屋的大小这个值是远远大于卧室数量的,如果当选择差不多大的 w w w 时,bedrooms 这个参数对于代价的影响将微乎其微。如果想让两者的影响相当的话可能要让一方选择较大的 w w w,而另一方选择较小的 w w w 去平衡对代价 J J J 的影响。
在这里插入图片描述

🎈我们最好还是想让两个参数一视同仁,对代价有着同等的影响。

✨特征缩放起到了这个作用,本质上是将每个特征除以用户选定的一个值,让参数得到 -1 到 1 的范围。
在这里插入图片描述

在这里插入图片描述


🎊还有两种方法也能达到目的:

✨均值归一化(Mean normalization):
x i = x i − μ i m a x − m i n , μ i 是所有特征 x 的平均值 x_i= \frac {x_i-\mu_i} {max-min}, \mu_i是所有特征 x 的平均值 xi=maxminxiμi,μi是所有特征x的平均值

在这里插入图片描述

✨Z-score标准化(Z-score normalization):

To implement z-score normalization, adjust your input values as shown in this formula:
x j ( i ) = x j ( i ) − μ j σ j {x_j}^{(i)}= \frac {{x_j}^{(i)}-\mu_j} {\sigma_j} xj(i)=σjxj(i)μj
where j j j selects a feature or a column in the X matrix. µ j µ_j µj is the mean of all the values for feature(j) and σ j \sigma_j σj is the standard deviation of feature(j).

μ j = 1 m ∑ i = 0 m − 1 x j ( i ) \mu_j=\frac 1 m \sum_{i=0}^{m-1}{x_j}^{(i)} μj=m1i=0m1xj(i)

σ j 2 = 1 m ∑ i = 0 m − 1 ( x j ( i ) − μ j ) 2 {\sigma_j}^2=\frac 1 m \sum_{i=0}^{m-1}({x_j}^{(i)}-\mu_j)^2 σj2=m1i=0m1(xj(i)μj)2

在这里插入图片描述

3️⃣学习率(Learning Rate)

🎈在梯度下降法中可以看到学习率 α \alpha α 的使用,它能控制参数更新的大小,而 α \alpha α 如果太小可能会导致梯度下降代价函数收敛的过程很缓慢;而 α \alpha α 如果过大,很可能会导致代价函数发散。因此选取一个合适的 α \alpha α 对模型来说是很重要的。

在这里插入图片描述

✨寻找 α \alpha α 的一种方法,找一个过小的学习率,逐渐倍数找到个过大的学习率,再从其中寻找合适的 α \alpha α
在这里插入图片描述

4️⃣特征工程(Feature Engineering)

🎈特征工程,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用,而之前面对的特征都是线性,然而当面对的特征是非线性的或者是特征的组合又该怎么办?下面开始考虑数据非线性的场景。

在这里插入图片描述

如下是对房价预测的特征方程的考虑,显然都是多项式方程:
在这里插入图片描述
在这里插入图片描述

5️⃣多项式回归

# 导入Lab中的自定义函数和NumPy以及matplotlib 库
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

🎈我们开始尝试用已知的知识去拟合非线性曲线,例如: y = 1 + x 2 y=1+x^2 y=1+x2

对于一个有着平方关系的数据 y y y ,使用线性回归去拟合:

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

在这里插入图片描述

由此可见效果确实不太好,可以需要一个类似 y = w 0 x 0 2 + b y=w_0x_0^2+b y=w0x02+b 的曲线,或者一个多项式特征。如果使用特征工程将 x x x 换为 x 2 x^2 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()

在这里插入图片描述

在这里插入图片描述
🎉我们获得了一个很好的拟合曲线, y = 1 ∗ x 0 2 + 0.049 y=1*x_0^2+0.049 y=1x02+0.049,非常接近目标 y = 1 ∗ x 0 2 + 1 y=1*x_0^2+1 y=1x02+1,如果迭代更久效果可能会更好。

✨当对于不是很明显的特征关系,我们可以尝试添加各种潜在的特征来找到一个最合适的拟合曲线,这就是特征工程。我们也许会找到类似 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 这种形式。如果对于数据集有着明显不同规模的尺寸,别忘了我们还有特征缩放,让每个特征的影响大致不差,并且可以加速梯度下降的过程同时收敛各个参数。

6️⃣Scikit-Learn

官网:https://scikit-learn.org/stable/index.html

🎈Scikit-learn 是一个强大开源的机器学习 Python 库,它建立在 NumPy、SciPy 和 Matplotlib 之上,提供了大量的机器学习算法和工具,用于机器学习和数据分析。它包含了一系列简单易用且高效的工具,用于分类、回归、聚类、降维、模型选择和预处理等。

下面来利用 Scikit-Learn 使用梯度下降实现线性回归。

# You will utilize functions from scikit-learn as well as matplotlib and NumPy.
import numpy as np
np.set_printoptions(precision=2)
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.preprocessing import StandardScaler
from lab_utils_multi import  load_house_data
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0'; 
plt.style.use('./deeplearning.mplstyle')

Scikit-learn 有一个梯度下降回归模型 sklearn.linear_model.SGDRegressor,该模型在标准化输入时表现最佳。而 sklearn.preprocessing.StandardScaler 可以实现 Z-score 标准化。

# Load the data set
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']

使用 sklearn.preprocessing.StandardScaler 将训练集标准化

scaler = StandardScaler()
X_norm = scaler.fit_transform(X_train)
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)}")

在这里插入图片描述

使用 sklearn.linear_model.SGDRegressor 创建并拟合回归模型。

sgdr = SGDRegressor(max_iter=1000)
sgdr.fit(X_norm, y_train)
print(sgdr)
print(f"number of iterations completed: {sgdr.n_iter_}")

在这里插入图片描述

对比一下之前的 Lab 的模型参数

b_norm = sgdr.intercept_
w_norm = sgdr.coef_
print(f"model parameters:                   w: {w_norm}, b:{b_norm}")
print(f"model parameters from previous lab: w: [110.56 -21.27 -32.71 -37.97], b: 363.16")

在这里插入图片描述

做出预测

# make a prediction using sgdr.predict()
y_pred_sgd = sgdr.predict(X_norm)
# make a prediction using w,b. 
y_pred = np.dot(X_norm, w_norm) + b_norm  
print(f"prediction using np.dot() and sgdr.predict match: {(y_pred == y_pred_sgd).all()}")

print(f"Prediction on training set:\n{y_pred[:4]}" )
print(f"Target values \n{y_train[:4]}")

在这里插入图片描述

绘制预测值与目标值的关系图

# plot predictions and targets vs original features    
fig,ax=plt.subplots(1,4,figsize=(12,3),sharey=True)
for i in range(len(ax)):
    ax[i].scatter(X_train[:,i],y_train, label = 'target')
    ax[i].set_xlabel(X_features[i])
    ax[i].scatter(X_train[:,i],y_pred,color=dlorange, label = 'predict')
ax[0].set_ylabel("Price"); ax[0].legend();
fig.suptitle("target versus prediction using z-score normalized model")
plt.show()

在这里插入图片描述

✨恭喜你,已初次使用开源机器学习包 scikit-learn,并知道了如何使用工具包中的 梯度下降 SGDRegressor特征归一化 StandardScaler 实现线性回归。

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

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

相关文章

JSON对接发送短信验证码怎么获取状态报告

现在很多网站的用户注册都会加一个短信验证功能&#xff0c;也就是需要用户填写手机号&#xff0c;然后点击“获取短信验证码”&#xff0c;将收到的短信验证码输入验证通过后方能进行下一步完成注册&#xff0c;现在短信验证码被广泛应用于网站用户注册&#xff0c;还被广泛应…

向量空间与函数空间的类比分析

目录 基与向量空间基本概念向量空间的基向量空间中的表示系数计算步骤二维空间中的向量 向量在不同基下的表示 基与函数空间基本概念常见的函数基 两者之间的关系相同点不同点 基与向量空间 基本概念 向量空间&#xff1a;一个向量空间是由一组遵循特定加法和数乘运算规则的元…

sqlgun新闻管理系统

一&#xff0c;打开主页 1.输入框测试回显点 -1union select 1,2,3# 出现回显点2 2.查看数据库表名 -1union select 1,database(),3# 3.查看表名 -1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasqlgunnews# 4.查看admin中…

CSS---序号使用css设置,counter-reset、counter-increment、content配合实现备注文案的序号展示

直接上代码&#xff0c;全代码copy即可使用! <template><div class"reminder"><span class"Bold_12_body" style"line-height: 8vw">温馨提示&#xff1a;</span><br /><div class"rule-container"…

NLP-transformer学习:(6)dataset 加载与调用

NLP-transformer学习&#xff1a;&#xff08;6&#xff09;dataset 加载与调用 平常其实也经常进行trainning等等&#xff0c;但是觉得还是觉得要补补基础&#xff0c;所以静下心&#xff0c;搞搞基础联系 本章节基于 NLP-transformer学习&#xff1a;&#xff08;5&#xff0…

【AI-19】Adam为什么会过拟合

Adam 算法可能会导致过拟合的原因主要有以下几点&#xff1a; 过拟合和欠拟合的概念 过拟合&#xff1a; 就好比一个学生在准备考试时&#xff0c;把课本上的每一个例子都背得滚瓜烂熟&#xff0c;但是考试的时候题目稍微变一下&#xff0c;他就不会做了。 在机器学习中&#…

tomcat项目报错org.apache.jasper.JasperException: java.lang.NullPointerException

现象&#xff1a; 访问tomcat项目报错&#xff0c;查看tomcat日志有报错 Sep 12, 2024 5:15:59 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception java.lang.NullPointerExce…

【linux006】目录操作命令篇 - pwd 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 pwd命令在 Linux 中用于显示当前工作目录的绝对路径。它是一个非常基础且常用的命令&#xff0c;帮助用户确认自己在文件系统中的位置。 1、基本用法 pwd [选项]2、常见选项 -L&#xff08;逻辑路径&#xff09;&#xff…

实现LED流水灯效果 -(附代码和仿真)

流水灯程序分为三个模块&#xff08;顶层&#xff0c;流水灯控制模块&#xff0c;时钟分频模块&#xff09;&#xff1b; 流水灯程序有三个输入&#xff08;时钟&#xff0c;复位信号&#xff0c;控制开关&#xff09;&#xff0c;一个输出&#xff08;16位led灯&#xff09;实…

7-6 列出连通集

输入样例: 8 6 0 7 0 1 2 0 4 1 2 4 3 5输出样例: { 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 } 注: bfs中 queue的 进 出 顺序一样&#xff0c;可以在进队列时输出&#xff0c;也可在出队列时。 代码&#xff1a; #include<iostream> #include<que…

胤娲科技:“斯坦福最新研究揭示:‘AI科学家‘创新能力获百位学者高分认可“

在科技浪潮的汹涌推动下&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度重塑着我们的世界&#xff0c;其影响力已远远超出了最初的设想。 最近&#xff0c;一篇关于自动化AI研究的论文在网络上引起了轩然大波&#xff0c;其核心观点犹如一颗重磅炸弹&#xff0c…

Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 消息队列的认识 2.0 基于 List 实现消息队列 2.1 基于 List 实现消息队列的优缺点 3.0 基于 PubSub 实现消息队列 3.1 基于 PubSub 的消息队列优缺点 4.0 基于 St…

2009-2023年上市公司华证esg评级、评分年度数据(含细分项)

2009-2023年上市公司华证esg评级、评分年度数据&#xff08;含细分项&#xff09; 1、时间&#xff1a;2009-2023年 2、来源&#xff1a;整理自wind 3、指标&#xff1a;证券代码、年份、证券简称、评级日期、综合评级、综合得分、E评级、E得分、S评级、S得分、G评级、G得分…

《论负载均衡技术在Web系统中的应用》写作框架,软考高级系统架构设计师

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术&#xff0c; 可将负载(工作任务) 进行平衡、分摊到多个操作单元上执行&#xff0c; 从而协同完成工作任务&#xff0c; 达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题&…

《计算机组成原理:探索数字世界的基石》

《计算机组成原理&#xff1a;探索数字世界的基石》 在当今数字化的时代&#xff0c;计算机已经成为人们生活和工作中不可或缺的一部分。而要深入理解计算机的运作&#xff0c;就必须掌握计算机组成原理。 计算机组成原理是一门研究计算机硬件系统的学科&#xff0c;它涵盖了…

Linux-Curl使用

在 Linux 中&#xff0c;curl是一个强大的命令行工具&#xff0c;用于从服务器或其他 URL 地址获取数据或与网络服务进行交互。 对于自己写不明白的curl&#xff0c;可以使用postman、apipost等接口工具生成curl请求&#xff0c;用于测试 # 下载单个文件 默认将输出打印到标准…

Zabbix监控k8s云原生环境

传统监控的本质就是收集、分析和使用信息来观察一段时间内监控对象的运行进度&#xff0c;并且进行相应的决策管理的过程&#xff0c;监控侧重于观察特定指标。是随着云原生时代的到来&#xff0c;我们对监控的功能提出了更多的要求&#xff0c;要实现这些功能&#xff0c;就要…

python画图|3D垂线标记

在前述学习过程中&#xff0c;我们学习了二维坐标上的垂线标记画图&#xff0c;链接如下&#xff1a; python画图|垂线标记系列_python画点相对x轴的垂线-CSDN博客 也学习了3D作图基本方法&#xff1a; python画图|3D图基础教程-CSDN博客 现在我们尝试将这二者结合&#x…

自定义WPF滑块样式-Slider

在Windows应用程序开发中&#xff0c;滑块&#xff08;Slider&#xff09;是一个非常常见且有用的控件。它可以让用户通过拖动滑块来选择一个范围内的值。然而&#xff0c;WPF或UWP应用程序中的默认滑块样式可能并不总是符合我们的设计需求。因此&#xff0c;我们需要自定义滑块…

华为OD机试 - 伐木工 - 动态规划(Java 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…