1.系统学习-线性回归

系统学习-线性回归

  • 前言
  • 线性回归介绍
  • 误差函数
  • 梯度下降
    • 梯度下降示例
  • 回归问题常见的评价函数
    • 1. MAE, mean absolutely error
    • 2. MSE, mean squared error
    • 3. R square (决定系数或R方)
  • 机器学习建模流程
  • 模型正则化
  • 拓展阅读
  • 作业

链接: 2.系统学习-逻辑回归

前言

线性回归是一种应用非常广泛的回归模型:销量预测、网站流量、生物指标预测等。其中包含的一些知识点例如:梯度下降、L1/L2正则化等在其他机器学习、深度学习模型中也会应用,需要认真掌握。本章会以房价预测案例介绍机器学习建模流程。
链接: Kaggle房价预测竞赛
学习目标:

  • 线性回归定义
  • 梯度下降法求解回归系数
  • 常用的回归任务评价指标
  • 机器学习建模流程
  • 【选修拓展阅读】:过拟合、正则化,多重共线性
  • 完成课后QA及代码作业

线性回归介绍

回归分析是一种预测性的回归建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系,用于预测各种连续变量的值,例如通过父亲的身高、母亲的身高、家庭收入等预测同学的身高,通过地段、面积等预测房屋价格。 线性回归基于简单的假设: 假设自变量和因变量之间的关系是线性的, 即因变量可以表示为自变量中元素的加权和。

我们把特征表示为向量x =(x1,x2,…,xm)项 ,加权权重表示为向量 w=(w1,w2,…,wm),线性回归模型可以表示为:

y = w T x + b y = w^T x + b y=wTx+b
为了方便表示,我们把偏置项也移动到特征里,作为x0 ,且其值总为1,也为偏置项增加一个权重 ,那么线性回归可以表示为:

y = w T x y = w^T x y=wTx
这样就简洁多了,现在问题来了,如何求解影响权重 呢,因为影响因素的值我们是已知的,只要知道权重,我们就可以通过模型得到一个预测结果。

误差函数

一个很自然的想法是,我们首先定义个误差函数,去求解这个误差函数最小的时候所对应的 就可以了。其中对于一个回归问题,我们通常采用MSE (Mean Square Error )作为误差函数:
MSE = 1 n ∑ i = 1 n ( y true ( i ) − w T x ( i ) ) 2 . \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_{\text{true}}^{(i)} - w^T x^{(i)} \right)^2. MSE=n1i=1n(ytrue(i)wTx(i))2.
在这里插入图片描述

梯度下降

链接: 梯度下降直观理解小视频
梯度是函数关于参数的徧导数,这里以我们的MSE函数为例,grad,
表示函数的某处最小值到最大值的指向与最大值与最小值的差异程度。那么意味着梯度不仅告诉我们,函数变大的方向,也告诉了我们变大的程度。我们的函数(MSE)是越小越好,那么我们只要朝着梯度的反方向迈进就可以了。
在这里插入图片描述
在上图中,我们绘制了一个函数 func(x1,x2),其中底部的两个坐标为 ,纵轴坐标为函数对应的取值,底部的箭头是在不同 取值下的梯度。可以看到,梯度总是指向让函数取值变大的方向,梯度的箭头越长意味着变化越大。因此,我们只需要让 的取值,不断朝着梯度的反方向更新,就可以一步步走向函数的最低点。

利用求导公式可知,梯度等于:

∂ MSE ∂ w i = − 1 n ∑ j = 1 n 2 ⋅ ( y true ( j ) − w T x ( j ) ) ⋅ x i ( j ) . \frac{\partial \text{MSE}}{\partial w_i} = -\frac{1}{n} \sum_{j=1}^{n} 2 \cdot \left( y_{\text{true}}^{(j)} - w^T x^{(j)} \right) \cdot x_i^{(j)} . wiMSE=n1j=1n2(ytrue(j)wTx(j))xi(j).
那么,在线性回归中,我们可以沿着梯度的反方向进行更新:
w i = w i − learning_rate ⋅ ∂ MSE ∂ w i . w_i = w_i - \text{learning\_rate} \cdot \frac{\partial \text{MSE}}{\partial w_i} . wi=wilearning_ratewiMSE.

梯度下降示例

下面我们就利用梯度下降,来解决一个房价预测的问题。

import numpy as np x = np.array([1, 2, 1.2, 1.5]) 
y = x * 2 + np.random.randn(4) print("假设我们有一组房屋的面积数据:") 
print(x) 
print("其对应的房屋价格:") 
print(y) 

在这里插入图片描述

import matplotlib.pyplot as plt 
%matplotlib inline
# 房屋面积和房价可以从散点图看出具备某种线性关系plt.scatter(x, y) 
plt.xlabel("house area") 
plt.ylabel("house price")

在这里插入图片描述

 # 定义我们的误差函数def mse(y_true, y_pred): return np.mean((y_true - y_pred) ** 2) #隐藏了累加和除以 n 的细节# 定义梯度的计算公式def grad(y_true, w, x): return np.mean(2 * (y_true - w*x) * -x) # 定义梯度下降迭代过程def grad_decent(y_true, w, x, learning_rate): w = w - learning_rate * grad(y_true, w, x) return w 
w = np.random.rand()  # w赋值一个随机初始值learning_rate = 0.001 
num_iteration = 2000 
loss = [] 
for step in range(num_iteration): w = grad_decent(y, w, x, learning_rate) loss_step = mse(y, w*x) loss.append(loss_step) 
plt.plot(loss) 
plt.xlabel("#iteration") 
plt.ylabel("mse_loss") 

在这里插入图片描述

plt.scatter(x, y, label="true") 
plt.scatter(x, w*x, label="predict", marker="^") 
plt.legend() 

在这里插入图片描述

回归问题常见的评价函数

1. MAE, mean absolutely error

MAE = 1 n ∑ i = 1 n ∣ y true ( i ) − y pred ( i ) ∣ . \text{MAE} = \frac{1}{n} \sum_{i=1}^n \left| y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)} \right| . MAE=n1i=1n ytrue(i)ypred(i) .
计算简单,但是在0处不可导,所以在使用梯度下降需要特殊处理,值越大则误差越大,值域在0到正无穷大。
我们用 来计算一下之前的预测误差:

y_pred = w * x 
from sklearn.metrics import mean_absolute_error as mae 
mae(y, y_pred)

2. MSE, mean squared error

在梯度下降已经介绍,这里直接计算:

from sklearn.metrics import mean_squared_error as mse 
mse(y, y_pred)

领域基于MSE,也有一些衍生指标,比如RMSE,MSE,就是对 开根号,这里不再详述。

3. R square (决定系数或R方)

统计领域常用,但是在机器学习领域用的很少的一种回归评价指标,值域在负无穷大到1,越接近1越好,代表预测值对真实值解释程度越高。
R 2 = 1 − 残差平方和 总平方和 . R^2 = 1 - \frac{\text{残差平方和}}{\text{总平方和}} . R2=1总平方和残差平方和.
残差平方和 = ∑ i = 1 n ( y true ( i ) − y pred ( i ) ) 2 . \text{残差平方和} = \sum_{i=1}^n \left( y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)} \right)^2 . 残差平方和=i=1n(ytrue(i)ypred(i))2.
总平方和 = ∑ i = 1 n ( y true ( i ) − y ˉ ) 2 . \text{总平方和} = \sum_{i=1}^n \left( y_{\text{true}}^{(i)} - \bar{y} \right)^2 . 总平方和=i=1n(ytrue(i)yˉ)2.
在这里插入图片描述

 from sklearn.metrics import r2_score as r2 r2(y, y_pred) 

机器学习建模流程

我们以Kaggle房价预测竞赛为例,利用线性回归,搭建一套完整的机器学习建模流程。

  1. 加载数据&分析
  2. 数据处理
  3. 特征工程
  4. 数据划分
  5. 模型训练
  6. 模型评估
# 加载数据
import pandas as pdtrain = pd.read_csv("./house-prices-advanced-regression-techniques/train.csv")
test = pd.read_csv("./house-prices-advanced-regression-techniques/test.csv")
sample_submission = pd.read_csv("./house-prices-advanced-regression-techniques/sample_submission.csv")# 查看数据形状
print("Train shape:", train.shape)  # (1460, 81)
print("Test shape:", test.shape)   # (1459, 80)# 查看前几行
print(train.head())
print(test.head())# 提取目标变量 SalePrice
target = train['SalePrice'].values
test_ids = test['Id'].values# 删除不必要的列
train.drop(['SalePrice', 'Id'], axis=1, inplace=True)
test.drop(['Id'], axis=1, inplace=True)# 合并训练和测试数据,方便统一处理
data = pd.concat([train, test], axis=0).reset_index(drop=True)# 检查数据类型
print(data.dtypes.value_counts())# 丢弃缺失比例>80% 的特征
data.drop(data.isnull().mean()[data.isnull().mean() >0.8].index.tolist(), axis=1,inplace=True) # 处理缺失值:数值型用中位数填充,类别型用 "NULL" 填充
data.loc[:, data.dtypes != 'object'] = data.loc[:, data.dtypes != 'object'].fillna(data.loc[:, data.dtypes != 'object'].median()
)
data.loc[:, data.dtypes == 'object'] = data.loc[:, data.dtypes == 'object'].fillna("NULL")# 确保没有缺失值
print("缺失值总数:", data.isnull().sum().sum())# 对目标变量进行对数变换
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltsns.displot(target)
sns.displot(np.log1p(target))# 恢复对数化后的目标值
sns.displot(np.expm1(np.log1p(target)))# 对类别型特征进行 OneHot 编码
from sklearn.preprocessing import OneHotEncodercat_feature = OneHotEncoder().fit_transform(data[data.columns[data.dtypes == 'object']])
print("类别特征形状:", cat_feature.shape)# 对数值型特征进行标准化
from sklearn.preprocessing import StandardScalernum_feature = StandardScaler().fit_transform(data[data.columns[data.dtypes != 'object']])
print("数值特征均值:", num_feature.mean(0))
print("数值特征标准差:", num_feature.std(0))# 合并类别特征和数值特征
feature = np.concatenate([cat_feature.todense(), num_feature], axis=1)
print("合并后特征形状:", feature.shape)# 划分训练和测试数据
num_train = len(train)
train_feature = feature[:num_train]
test_feature = feature[num_train:]# 对目标变量标准化
from sklearn.preprocessing import StandardScalertarget_log1p = np.log1p(target)
scaler = StandardScaler()
target_log1p_scale = scaler.fit_transform(target_log1p.reshape(-1, 1))# 模型训练
from sklearn.linear_model import Ridgemodel = Ridge()
model.fit(train_feature, target_log1p_scale)# 模型预测
def predict(model, feature):pred = model.predict(feature)pred = scaler.inverse_transform(pred)pred = np.expm1(pred)return predtrain_pred = predict(model, train_feature)# 计算均方误差
from sklearn.metrics import mean_squared_error as msetrain_mse = np.sqrt(mse(target, train_pred))
print("训练集均方误差:", train_mse)# 测试集预测
test_pred = predict(model, test_feature)# 保存结果
sample_submission["SalePrice"] = test_pred.reshape(-1)
sample_submission.to_csv("submission.csv", index=False)

模型正则化

在这里插入图片描述
L1&L2 正则化
通过在误差函数中添加关于参数的1阶或2阶模,达到限制模型能力的作用。
L 1 = MSE + ∑ ∣ w i ∣ . L1 = \text{MSE} + \sum |w_i| . L1=MSE+wi∣.
L 2 = MSE + ∑ w i 2 . L2 = \text{MSE} + \sum w_i^2 . L2=MSE+wi2.
其中L1正则化线性回归叫做Lasso
,
L2正则化线性回归叫做Ridge.在sklearn中可以很方便的调用。
from sklearn.linear_model import Ridge, Lasso, LinearRegression

L1&L2如何发挥作用?

在这里插入图片描述

拓展阅读

链接: 欠拟合、过拟合及如何防止过拟合
链接: 机器学习中常常提到的正则化到底是什么意思?
链接: 多重共线性问题

作业

  1. 回答L1与L2正则化的线性回归分别具备什么特性?
  2. 注册Kaggle平台,阅读文档了解Kaggle平台使用,参加Kaggle房价预测竞赛,分别采用普通LinearRegression/Ridge(L2正则化线性回归)/Lasso(L1正则化线性回归)进行建模,尝试构造更多的
    特征,对比三种模型精度,最优模型Kaggle提交得分低于0.14

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

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

相关文章

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具,特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top,top 会显示一个实时更新的界面,其中包含系统的关键指标&am…

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码? 前言什么是 GitHub1s?使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实(VR)技术,为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅,从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍: 一、主要功能 …

TowardsDataScience 博客中文翻译 2018~2024(一百二十三)

TowardsDataScience 博客中文翻译 2018~2024(一百二十三) 引言 从 2018 年到 2024 年,数据科学的进展超越了许多技术领域的速度。Towards Data Science 博客依然是这个领域的关键平台,记录了从基础工具到前沿技术的多方面发展。…

Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程

简介 Docker 通过提供轻量级、可移植和高效的解决方案,彻底改变了软件开发和部署。docker build 命令是 Docker 镜像创建过程的核心。本文将探讨 docker build 命令、其语法、用法以及优化 Docker 构建的最佳实践。本教程的目标是手把手教你如何在 Linux 服务器上使…

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中,Bean 的作用域是一个关键概念,它决定了 Bean 的生命周期和实例化方式,对应用的性…

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码:题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题:给定一个整数 columnNumber,将其转换为 Excel 表中的列名称。…

基于艾伦方差的频率稳定性分析

某个授时系统通过串口或网口采集时间间隔计数器、频率计数器、相位噪声分析仪设备的重要信息,用于评估和分析频率源的频率稳定度,确保测量的准确性和可靠性。 数据处理: 读取保存在文件中的时间间隔计数器测量的时差数据,计算时间稳定度(用TDEV表示)并保存。TDEV包括秒稳…

秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解

​ 别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff…

虚幻引擎结构之ULevel

在虚幻引擎中,场景的组织和管理是通过子关卡(Sublevel)来实现的。这种设计不仅提高了资源管理的灵活性,还优化了游戏性能,特别是在处理大型复杂场景时。 1. 场景划分模式 虚幻引擎采用基于子关卡的场景划分模式。每个…

CentOS7下的vsftpd服务器和客户端

目录 1、安装vsftpd服务器和ftp客户端; 2、配置vsftpd服务器,允许普通用户登录、下载、上传文件; 3、配置vsftpd服务器,允许anonymous用户登录、下载、上传文件; 4、配置vsftpd服务器,允许root用户登录…

系统思考—全局思维

昨天接到一个企业需求,某互联网公司VP希望N-1的核心团队一起学习系统思考,特别是在新业务快速发展的阶段。公司增长势头不错,但如何解决跨部门的协作问题,成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据,预测房价中值。 环境要求: ancondajupyter notebookpython3.10.10 虚拟环境: pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…

LabVIEW软件开发的未来趋势

LabVIEW软件开发的未来趋势可以从以下几个方面来分析: ​ 1. 与AI和机器学习的深度结合 趋势:LabVIEW正在向集成AI和机器学习方向发展,尤其是在数据处理、预测性维护和自动化控制领域。 原因:AI技术的普及使得实验和工业场景中的…

使用Amazon Bedrock的无服务器的智能工作流

使用Amazon Bedrock的无服务器的智能工作流 智能工作流基于用户输入处理不可预见的任务,比如发起API调用。无服务器架构可以高效地管理这些任务和不同的工作负载,而无需维护服务器,从而加快部署速度。 你将学习如何通过使用带有保护措施的智能…

近实时”(NRT)搜索、倒排索引

近实时(Near Real-Time, NRT)搜索 近实时(NRT)搜索是 Elasticsearch 的核心特性之一,指的是数据在被写入到系统后,可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时,但它的延迟通…

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库,如果想要支持其他数据库,可以通过使用插件方式实现。对于该插件的使用,官方说明文档较为粗略(不过也没问题,实际上整个过程就是很简单,只是使用者想复杂了),网…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…