ML 系列:机器学习和深度学习的深层次总结(04)多元线性回归 (MLR)

news2024/12/24 2:45:50

图 1.多元线性回归与简单线性回归

一、说明

        线性回归从一维推广到多维,这与单变量线性回归有很多不同,情况更加复杂,而在梯度优化也需要改成向量梯度,同时,数据预处理也成了必要步骤。

二、综述

        多元线性回归是简单线性回归的一种广义形式,它使用多个自变量来预测因变量。根据表 1,使用发动机尺寸 x_1、x_2 的气缸数和燃料消耗量x_3来估计排放的 CO2 气体 (y) 是多元线性回归。多元线性回归公式如公式 1 所示。

多元线性回归的方程 1:

        在等式 1 中,m 指的是自变量的数量,训练模型的过程类似于简单的线性回归,不同之处在于,这里我们不是确定 a 和 b,而是找到 m+1 个合适的数字(b_0、b_1、...b_m)。使用多元线性回归可以显示自变量(x_1、x_2、x_3 等)的有效性x_m) 估计因变量 (y) 并获得每个自变量的变化在改变因变量中的影响。

表 1 显示了多元线性回归中的自变量和因变量:

                                                                图 1.I个因变量和因变量

        如前所述,数据不能用高于三个维度的维度来表示,但可以针对每个自变量 (x_i) 绘制目标数据或标签。我们在本章中介绍的数据有七个特征或特征,如图 2 所示,CO2 气体的因变量 (CO2_Emissions) 与三个特征(自变量)的比较。

图 2.为每个特征绘制因变量数据

        可以看出,数据显示相对分散,它表明因变量 (y) 的输出是几个自变量的函数,换句话说,它不受一个变量的影响,几个变量在确定输出值方面发挥作用。

        我将为一个名为 “50 Startups Data” 的数据集编写一个代码来解析多元线性回归,该数据集适用于多元线性回归的任务。根据 Kaggle 网站:

我们在这里看到的数据集包含有关 50 家初创公司的数据。它有5列:“研发支出”,“管理”,“营销支出”,“状态”,“利润”。
前 3 列表示每家初创公司在研发上花费了多少,他们在营销上花费了多少,以及他们在管理成本上花费了多少,状态列表示初创公司所在的州,最后一列表示初创公司获得的利润。

如果您想访问代码和数据集,请打开我的 GitHub 仓库,并下载“50_Startups.csv”数据集。

首先,我们应该导入一些需要的库:

三、包含库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

然后我们应该用 pandas 加载 csv 数据集:

四、加载数据集

df = pd.read_csv('./Datasets/50_Startups.csv')
df.head()

图 3. 前 5 行数据

print(df.dtypes)

图 4. 列或特征的类型

我们应该将 “object” 类型转换为 “category” 类型,在 pandas 中使用此命令是可能的:

df['State'] = df['State'].astype('category')
print(df.dtypes)

图 5. 将对象转换为类别

这是清理和预处理数据的时间:

4.1. 检查并处理缺失值

我们可以使用以下命令在 pandas 中看到 null 值:

df.isnull().sum()

图 6. 查看 null 值

        如上图所示,我们在第二列中有两个 null 值,在第三列中也有一个 null 值。要查看缺失值,您可以使用另一个名为 Missingno 的出色库。Missingno 是一个 Python 库,用于可视化数据集中的缺失数据。它提供了一种识别模式和了解数据集中缺失值范围的便捷方法。

import missingno as msno
msno.matrix(df)

图 7. 缺少用于查找缺失值的输出

        您可以使用 fillna() 函数将 pandas DataFrame 中的 NaN 值替换为特定值。用于替换的常见值之一是 median,我将其填充为每列的缺失值。

        检查管理功能:

m = df['Administration'].median()
print(f"Median for Administration feature is:", m)

# Median for Administration feature is: 122699.795

使用以下命令计算每个特征的缺失值数:

print(df['Administration'].isna().sum())
# 2

最后,用这个命令填充它 (fill with median):

df['Administration'].fillna(m, inplace=True)

print(df['Administration'].isna().sum())
# 0

我们应该填补另一个功能 (Marketing Spend) 的缺失值:

med_marketing = df['Marketing Spend'].median()
df['Marketing Spend'].fillna(med_marketing, inplace=True)
df['Marketing Spend'].isna().sum()
# 0

在用每个特征的中位数填充缺失值后,现在我们再次看到 msno 库的结果:

msno.matrix(df)

图 8. Missing 填充缺失值后无输出

4.2. 编码分类特征

在我解释什么是编码以及如何进行编码之前,请先看一下 DataFrame 的输出:

df.head()

图 9. 编码前的数据输出

在机器学习中,包含非数值的分类变量(特征)很常见。但是,大多数机器学习算法都需要数字输入。为了解决这个问题,我们执行了一个称为 “编码分类特征” 的过程,该过程涉及将这些分类变量转换为机器学习模型可以理解和处理的数字表示。

对分类特征进行编码有几种常用方法:

  1. One-Hot Encoding:对于每个分类变量,将为每个唯一类别创建一个新的二进制特征。如果存在类别,则二进制特征的值为 1,否则为 0。独热编码扩展了特征空间,但保留了有关类别的信息。One-Hot Encoding 通常使用 pandas 中的函数执行。例如,我们的数据中有一个名为“State”的列,其类别为“New York”、“California”和“Florida”,使用该列将为每个类别创建新列,并根据类别是否存在分配值 1 或 0。因此,结果将包含“State_California”、“State_Florida”和“State_New York”等列,其中的二进制值指示原始“State”列中每列的存在与否。pd.get_dummies()pd.get_dummies()
  2. Label Encoding:在此方法中,为每个类别分配一个唯一的整数标签。标签的分配方式可以保留类别之间的序号关系(如果有)。我们不需要此方法,因为 State 功能没有任何订单。

这是我们在 Pandas 中使用 One-Hot 编码的方式:

df_encoded = pd.get_dummies(df, columns=['State'], dtype=np.float64)
df_encoded.head()

图 10. 对 'State' 功能进行编码后的数据输出

4.3. 更改列的顺序

        我们的标签是 Profit,标签通常位于最后一列,代码如下:我们可以按自己喜欢的任何顺序放置列:

df_encoded = df_encoded[['R&D Spend', 'Administration', 'Marketing Spend',
                         'State_California', 'State_Florida', 'State_New York', 'Profit']]

df_encoded.head()

图 11. 重新排序的要素

4.4. 重命名列名称,以便它们可以编码

        在数据分析和机器学习中,通常建议避免使用带空格的列名,而是将它们转换为更方便且与编程语言兼容的格式。最常见的方法是将空格替换为下划线或其他合适的字符。

df_encoded.rename(columns={'R&D Spend': 'R&D_Spend',
                          'Marketing Spend': 'Marketing_Spend',
                          'State_New York': 'State_New_York'}, inplace=True)
df_encoded.head()

图 12. 重命名的列

五. 异常值的箱形图

        异常值是明显偏离数据集中大多数数据的数据点。它们可以是与其他值相比异常大或异常小的观测值。异常值可能由于各种原因而发生,例如测量错误、数据损坏或罕见事件。

        在机器学习模型中考虑异常值非常重要,因为它们会对模型的性能和结果产生重大影响。异常值可能会扭曲统计度量,例如平均值和标准差,从而导致估计值有偏差和预测不准确。它们还会影响某些算法的假设,例如线性回归,这些算法假定数据服从正态分布。

        识别和可视化异常值的一种常用技术是箱形图(也称为箱须图)。箱形图通过显示四分位数、中位数和潜在异常值来提供数据集分布的可视化摘要。该框表示四分位距 (IQR),其中包含中间 50% 的数据。晶须从框延伸到一定范围内(通常是 IQR 的 1.5 倍)内的最小和最大数据点。超出此范围的数据点被视为潜在的异常值,并绘制为单个点。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 4, figsize=(20, 8))
axes_flat = axes.flatten()

for i, col in enumerate(df_encoded.columns):
    ax = axes_flat[i]
    ax.boxplot(df_encoded[col])
    ax.set_title(col)

图 13. 用于查找异常值的箱形图

注意:使用独热编码特征时,无需像处理数值特征那样考虑异常值。独热编码特征由二进制值(0 或 1)组成,没有数字分布来评估异常值。独热编码特征不是测量值的大小或偏差,而是关注某个类别的存在或不存在。因此,离群值的概念在 one-hot 编码特征的上下文中是无关紧要的。但是,我为所有特征绘制了箱形图。

有几种方法可以从数据集中删除异常值,其中一种常见且有用的方法称为 IQR,我将在下面解释它:

  • 通过从第三个四分位数 (Q3) 中减去第一个四分位数 (Q1) 来计算数据集的四分位数间距 (IQR)。
  • 定义下限 (Q1–1.5 * IQR) 和上限 (Q3 + 1.5 * IQR)。
  • 删除低于下限或高于上限的任何数据点。

下图显示 IQR 方法的工作原理:

图 14. 用于异常值检测的 IQR 方法

计算 df_encoded 中每列的第一四分位数 (q1)、第三四分位数 (q3) 和四分位距 (iqr)。这有助于确定大多数数据点所在的范围。

q1 = df_encoded.quantile(0.25)
q3 = df_encoded.quantile(0.75)
iqr = q3 - q1

根据四分位距计算下限和上限截止值。这些截止值用作确定异常值的阈值。低于 cutoff_low 或高于 cutoff_high 的数据点被视为潜在异常值。

cutoff_low  = q1 - (1.5 * iqr)
cutoff_high = q3 + (1.5 * iqr)

创建一个布尔掩码,用于标识哪些数据点 df_encoded 属于截止值定义的可接受范围。对于不被视为异常值的数据点,此掩码为 True;对于潜在异常值,此掩码为 False。

mask = (df_encoded >= cutoff_low) & (df_encoded <= cutoff_high)

应用布尔掩码以从 df_encoded 中筛选出可能的异常值行。mask.all(axis=1) 检查掩码每行中的所有值是否均为 True,这表示该行中的任何列都不包含异常值。生成的df_filtered仅包含没有异常值的行。

df_filtered = df_encoded[mask.all(axis=1)]

用于删除异常值的集成代码如下:

q1 = df_encoded.quantile(0.25)
q3 = df_encoded.quantile(0.75)
iqr = q3 - q1

cutoff_low  = q1 - (1.5 * iqr)
cutoff_high = q3 + (1.5 * iqr)

mask = (df_encoded >= cutoff_low) & (df_encoded <= cutoff_high)

df_filtered = df_encoded[mask.all(axis=1)]
df_filtered.head()

现在是时候创建一个新的 DataFrame 了,其中包含根据布尔掩码识别为异常值的行 df_encoded。

# see outliers with ~ [~mask.all]
df_outliers = df_encoded[~mask.all(axis=1)]
df_outliers.head()

图 15. 包含离群值的新 DataFrame

六、特征选择/缩减

        特征选择或减少与相关性涉及根据特征与目标变量或彼此之间的相关性来识别和选择或减少数据集中的特征。通过检查特征之间关系的强度和方向,这种方法有助于确定与给定任务最相关和信息量最大的特征,从而有可能提高模型性能并降低计算复杂性。

        Pearson 相关系数通常用于测量线性相关,其他相关度量可以捕获不同类型的关系。例如:

  1. 皮尔逊相关系数:它衡量两个连续变量之间线性关系的强度和方向。
  2. Spearman 相关系数:它评估变量之间的单调关系,它捕获变量之间的任何增加或减少趋势,而不管线性如何。
  3. Kendall 的 tau:它度量变量之间的序数关联,适用于排名或有序数据。
correlation = df_filtered.corr(method='pearson')
correlation

图 16. 特征之间的关联

我们需要知道每个功能对标签 (Profit) 的影响,通过这些代码行我们可以做到这一点:

corr = df_filtered.corr()
corr[['Profit']].abs().sort_values(by='Profit', ascending=False)

图 17. 基于标签的排序相关性

        我们想做 Feature selection or reduce with correlation 涉及根据特征与目标变量或彼此之间的相关性来识别和选择或减少数据集中的特征。在本例中,我想删除与标签 (Profit) 相关性较低的特征:

df_copy = df_filtered.copy()
df_copy.drop(['State_California', 'State_Florida', 'State_New_York'], axis=1, inplace=True)
df_copy.head()

图 18. 删除部分特征后的数据集

七、训练测试拆分

        在这里,我们分配 X 和 y 变量,其中 X 特征变量具有自变量,y 特征变量具有因变量。

X = df_copy.iloc[:, :-1].values
y = df_copy.iloc[:, -1].values

然后我们应该分为 train 和 test 集。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42, shuffle=True)

x_train.shape, y_train.shape, x_test.shape, y_test.shape
# ((37, 3), (37,), (10, 3), (10,))

7.1 Model

from sklearn.linear_model import LinearRegression

# create model
model = LinearRegression()

7.2 训练

model.fit(x_train, y_train)
model.intercept_, model.coef_

7.3 测试

# Test model score for train data
model.score(x_train, y_train)
# 0.966
# Test model score for test data
model.score(x_test, y_test)
# 0.91
# Test model score for test data
model.score(x_test, y_test)
# 0.91

7.4 预测

y_hat = model.predict(x_test[[0], :])
y_hat

# array([103132.59393452])

八、结论

        在 第 4 部分 中,我们讨论了多元线性回归以及我们应该如何预处理数据。在第 5 部分:非线性回归,我们讨论了非线性回归是一种回归分析形式,其中观察数据由函数建模,该函数是模型参数的非线性组合,并取决于一个或多个自变量。

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

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

相关文章

基于flask常见trick——unicode进制编码绕过

前言 Flask 是一个轻量级的 Python Web 框架&#xff0c;设计上追求简洁和灵活性&#xff0c;适合构建中小型的 Web 应用程序。 其出题方便&#xff0c;经常能在CTF比赛中见到&#xff0c;常见题型有debug模式算pin码、ssti、原型链污染等&#xff0c;其中后两者属于通用漏洞…

IPLOOK百万级用户容量核心网惊艳亮相北京PT展

2024年9月25日&#xff0c;以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;本届中国国际信息通信展&#xff08;PT展&#xff09;在北京国家会议中心正式拉开帷幕。 广州爱浦路网络技术有限公司&#xff08;简称&#xff1a;IPLOOK&#xff09;&#xff…

SocialAI:拉满情绪价值的社交情感依托平台

​近日&#xff0c;SocialAI这款人工智能社交应用在苹果商店上线仅三天便引发广泛关注。它以独特的功能和创新的社交体验迅速走红&#xff0c;为社交领域带来了新的变革。 其亮点包括注册送百万虚拟粉丝&#xff0c;皆AI 生成回复和点赞&#xff0c;用户可自由定制关注者类型&…

鸿蒙开发(NEXT/API 12)【硬件(外设扩展驱动客户端开发)】驱动开发服务

Driver Development Kit&#xff08;驱动开发套件&#xff09;为外设驱动开发者提供高效、安全、丰富的外设扩展驱动开发解决方案C-API&#xff0c;支持外设驱动开发者为消费者带来外设即插即用的极致体验。 支持开发者开发外设配件的高阶功能&#xff0c;满足消费者高阶使用场…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

three.js----快速上手,如何用vue在web页面中导入 gltf/glb , fbx , obj 模型

首先去three.js官网下载three.js包,或者在直接在vue项目中 npm install three0.158.0 --save (学three.js需要有一点前端基础,基础掌握不牢的还是从基础开始) 这个0.158.0是版本号,不用纠结选新的还是选旧的,新手先不考虑这些,three.js基本上个把月就会更新一次,选一个不太新…

【CSS】字体文本

color 颜色font-size 大小font-family 字体font-style 样式font-weight 加粗text-decoration 下划线text-shadow 阴影text-transform 大小写变换text-indent 缩进text-align 水平对齐 、vertical-align垂直对齐text-overflow 溢出word-wrap 换行word-break 截断white-space 空白…

Uptime Kuma运维监控服务本地部署结合内网穿透实现远程在线监控

目录 前言 主要功能 一、前期准备 本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。 本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma 三、实现公网查看网站监控 四、使用固定公…

一文看懂英伟达系列显卡特点及性能参数对比

英伟达介绍 英伟达(NVIDIA)是美国一家专业的计算机图形芯片制造商&#xff0c;作为全球领先的GPU生产商&#xff0c;英伟达显卡产品系列涵盖GeForce、Quadro、Tesla、NVS、GRID等消费级、专业级和企业级市场。并被广泛应用于游戏、深度学习、科学计算和图形处理等领域。 NVID…

建筑智能,推动智慧社区发展

建筑智能已经成为现代城市建设的热门词汇。它不仅是提高城市建筑现代化水平的必由之路&#xff0c;也是未来城市智能化的重要标志。其中&#xff0c;智能社区是建筑智能化的重要环节之一。 智能社区是指以信息技术为基础&#xff0c;通过信息技术实现社区设施设备网络化、监管…

JS设计模式之模板方法模式:打破束缚,解密代码复用的精髓

一. 前言 在前端开发中&#xff0c;模板方法模式是一种常用的设计模式&#xff0c;它能够有效地提高代码的复用性和扩展性。在 JavaScript 中&#xff0c;模板方法模式的应用广泛&#xff0c;常被用于组件的生命周期管理、请求封装和拦截器设计、表单验证等多个场景。 本篇文…

数据结构和算法之树形结构(3)

文章出处&#xff1a;数据结构和算法之树形结构(3) 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01; 四、平衡二叉树(接前篇) 上一章节讲到为了避免二叉查找树退化成链表后的极度不平衡带来的低效率而衍生出了平衡二叉树&#xff0c;平衡二叉树的严格定义…

CDGA|数据治理:策略与价值的深度融合

在当今这个数据驱动的时代&#xff0c;企业数据治理的重要性日益凸显。数据不仅是企业的核心资产&#xff0c;更是驱动业务决策、优化运营流程、创新产品服务的关键力量。然而&#xff0c;要让数据治理真正发挥价值&#xff0c;企业需要采取一系列策略来确保数据的准确性、完整…

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具 一&#xff0c;前言二&#xff0c;资源包内容三&#xff0c;免费获取资源包 一&#xff0c;前言 Unity 开发者们&#xff0c;今天要为大家介绍一款极具创新性的工具 ——PoseAI。 PoseAI 是一种最先进的基于肌肉的姿势创作工具&…

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎&#xff0c;用于对无界数据流和有界数据流进行有状态计算&#xff0c;它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流&#xff1a;具有明确的开始和结束时间&#xff0c;数据量有限。适合使用批处理技术&#xf…

Elasticsearch实战宝典:从日志分析到实时数据监控,全方位解锁搜索与分析的无限可能!

Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;常用于处理大规模数据。它提供了强大的全文搜索、结构化搜索、实时统计分析等功能。以下是一些 Elasticsearch 的实战应用案例。 1. 日志分析系统 Elasticsearch 经常被用于集中式日志管理&#xff08;Centralized…

使用SSE流式输出(Javaweb前后端实战)

目录 一.什么是SSE&#xff1f; 主要特点&#xff1a; 二.SSE的实现过程&#xff1a; 三.SSE的前端实现&#xff1a; 1.创建 EventSource 对象&#xff1a; 2.处理接收到的信息&#xff1a; 3.处理特定事件&#xff1a; 4.处理连接错误问题&#xff1a; 5.关闭连接&am…

网络安全的方方面面

目录 一、网络安全概述二、数据加密三、消息完整性与数字签名四、身份认证五、密钥分发中心(KDC)与证书认证(CA)六、防火墙与入侵检测系统七、网络安全协议八、网络安全攻防 -- 黑客攻击简要流程九、网络安全常用术语 一、网络安全概述 网络安全的基本特征&#xff1a;相对性、…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(上篇:地图拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

基于Java的学生档案管理系统

基于springbootvue实现的学生档案管理系统 &#xff08;源码L文ppt&#xff09;4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面&#xff0c;支…