为机器学习算法准备数据(Machine Learning 研习之八)

本文还是同样建立在前两篇的基础之上的!

属性组合实验

希望前面的部分能让您了解探索数据并获得洞察力的几种方法。您发现了一些数据怪癖,您可能希望在将数据提供给机器学习算法之前对其进行清理,并且发现了属性之间有趣的相关性,特别是与目标属性
之间的相关性。您还注意到一些属性具有向右倾斜的分布,因此您可能需要转换它们(例如,通过计算它们的对数或平方根)。当然,你的里程会因每个项目而有很大的不同,但大致的想法是相似的。

在为机器学习算法准备数据之前,您可能需要做的最后一件事是尝试各种属性组合。例如,如果你不知道一个地区有多少住户,那么这个地区的房间总数就不是很有用。你真正想要的是每个家庭的房间数量。同样,卧室总数本身也不是很有用:你可能想对比一下房间的数量。每个家庭的人口似乎也是一个有趣的属性组合。创建这些新属性如下:

housing["rooms_per_house"] = housing["total_rooms"] / housing["households"]
housing["bedrooms_ratio"] = housing["total_bedrooms"] / housing["total_rooms"]
housing["people_per_house"] = housing["population"] / housing["households"]

然后你再看一遍相关矩阵:
在这里插入图片描述

!新的bedrooms_ratio属性与房屋中值的相关性要比与房间或卧室总数的相关性大得多。显然,卧室/房间比率较低的房子往往更贵。每个家庭的房间数量也比一个地区的房间总数更能说明问题-很明显,房
子越大,就越贵。

这一轮的探索不需要绝对彻底;关键是从正确的角度出发,并迅速获得见解,这将帮助您获得第一个相当好的原型。但是这是一个迭代的过程:一旦你建立并运行了一个原型,你就可以分析它的输出以获得更多的见解,然后再回到这个探索步骤。

为机器学习算法准备数据

是时候为您的机器学习算法准备数据了。你应该为此编写函数,而不是手工操作,这有几个很好的理由:

  • 这将允许您在任何数据集上轻松重现这些转换(例如,下次获得新数据集时)。
  • 您将逐步构建一个转换函数库,以便在未来的项目中重用。
  • 您可以在实时系统中使用这些函数来转换新数据,然后再将其输入到您的算法中。
  • 这将使您能够轻松地尝试各种转换,并查看哪种转换组合效果最好。

但首先,恢复到一个干净的训练集(通过再次复制strat_train_set)。您还应该将预测变量和标签分开,因为您不一定希望对预测变量和目标值应用相同的转换(请注意,drop()创建数据的副本,并且不影响strat_train_set):

housing = strat_train_set.drop("median_house_value", axis=1)
housing_labels = strat_train_set["median_house_value"].copy()

清除数据

大多数机器学习算法无法处理缺失的功能,因此您需要处理这些功能。例如,您之前注意到total_bedrooms属性有一些缺失值。你有三个选项可以解决这个问题:

  1. 去掉相应的区。
  2. 去掉整个属性。
  3. 将缺失值设置为某个值(零、均值、中位数等)。这就是所谓的归罪。

您可以使用PandasDataFrame的dropna () 、drop () 和fillna ()方法轻松完成这些任务:

housing.dropna(subset=["total_bedrooms"], inplace=True) # option 1
housing.drop("total_bedrooms", axis=1) # option 2
median = housing["total_bedrooms"].median() # option 3
housing["total_bedrooms"].fillna(median, inplace=True)

您决定使用选项3,因为它的破坏性最小,但是您将使用一个方便的Scikit-Learn类:Simplelmputer,而不是前面的代码。这样做的好处是,它将存储每个特征的中值:这将使得它不仅可以估算训练集上的缺失值,还可以估算验证集、测试集和输入到模型的任何新数据上的缺失值。要使用它,首先需要创建一个Simplelmputer实例,指定要将每个属性的缺失值替换为该属性的中位数:

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")

由于中位数只能在数值属性上计算,因此您需要创建一个仅具有数值属性的数据副本(这将排除文本属性ocean_proximity):

housing_num = housing.select_dtypes(include=[np.number])

现在,您可以使用fit()方法将补缺器实例拟合到训练数据:

imputer.fit(housing_num)

估算器只是计算每个属性的中位数,并将结果存储在它的statistics_instance变量中。只有total_bedrooms属性有缺失值,但您无法确定系统上线后的新数据中不会有任何缺失值,因此更安全的做法是将补缺器应用于所有数值属性:

在这里插入图片描述

现在,您可以使用这个"训练过的"估算器通过用学习到的中位数替换缺失值来转换训练集:

X = imputer.transform(housing_num)

缺失的值也可以替换为平均值(strategy=“mean”),或替换为最频繁的值(strategy=“most_frequent”),或替换为常值(strategy=“constant”, fill_value=…)。后两种策略支持非数值数据。

sklear.impute软件包中还有更强大的imputer(都仅用于数值特性):

  • KNNImputer将每个缺失值替换为该功能的k-近邻值的平均
    值。距离是基于所有可用的功能。
  • Iterativelmputer为每个特征训练回归模型,以根据所有其他可用
    特征预测缺失值。然后,它会根据更新的数据再次训练模型,并
    多次重复该过程,在每次迭代时改进模型和替换值。

Scikit-Learn转换器输出NumPy数组(或有时SciPy稀疏矩阵),即使它们被输入熊猫数据帧。“因此,inputer.Transform(Home_Num)的输出是NumPy数组:X既没有列名,也没有索引。幸运的是,在DataFrame中包装X并从宿主num中恢复列名和索引并不难:

housing_tr = pd.DataFrame(X, columns=housing_num.columns,
index=housing_num.index)

处理文本和分类属性

到目前为止,我们只处理了数字属性,但您的数据也可能包含文本属性。在这个数据集中,只有一个:ocean_proximity属性。让我们看看它的值的前几个实例:
在这里插入图片描述

它不是任意的文本:有有限数量的可能值,每个值代表一个类别。所以这个属性是一个分类属性。大多数机器学习算法更喜欢与数字打交道,所以让我们将这些类别从文本转换为数字。为此,我们可以使用Scikit-Learn的OrdinalEncoder类:

from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder = OrdinalEncoder()
housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)

housing_cat_encoded中的前几个编码值是这样的:

在这里插入图片描述

您可以使用categories_instance变量获取类别列表。它是一个列表,包含每个分类属性的一维类别数组(在本例中,列表包含单个数组,因为只有一个分类属性):

在这里插入图片描述

这种表示法的一个问题是,ML算法将假设两个附近的值比两个遥远的值更相似。这在某些情况下可能是没有问题的(例如,对于已排序的类别(如“坏”、“平均”、“好”和“优秀”),但显然海洋邻近栏的情况并非如此(例如,类别0和4显然比类别0和1更相似)。要解决这个问题,一个常见的解决方案是为每个类别创建一个二进制属性:一个属性在类别为“<1H海洋”时等于1(否则为0),另一个属性在“内陆”时等于1(否则为0),依此类推。这称为单热编码,因为只有一个属性将等于1(热),而其他属性将等于0(冷)。新属性有时被称为伪属性。Scikit-Learn提供了一个OneHotEncoder类来将分类值转换为单热向量:

from sklearn.preprocessing import OneHotEncoder
cat_encoder = OneHotEncoder()
housing_cat_1hot = cat_encoder.fit_transform(housing_cat)

默认情况下,OneHotEncoder的输出是SciPy稀疏矩阵,而不是NumPyarray:

在这里插入图片描述

稀疏矩阵是大多数包含零的矩阵的一种非常有效的表示形式。实际上,它内部只存储非零值及其位置。当一个分类属性有数百或数千个类别时,单热编码会产生一个非常大的矩阵,其中除了每行只有一个1之外,其余都是0。在这种情况下,稀疏矩阵正是您所需要的:它将节省大量内存并加快计算速度。你可以使用一个稀疏矩阵,就像一个普通的2D数组,12但是如果你想把它转换成一个(密集的)NumPy数组,只需要调用toarray()方法:

在这里插入图片描述

或者,您可以在创建OneHotEncoder时设置sparse=False,在这种情况下,transform()方法将直接返回一个常规(密集)NumPy数组。

与OrdinalEncoder一样,您可以使用编码器的categories_instance变量获取类别列表:

在这里插入图片描述

Pandas有一个名为get_dummies()的函数,它也将每个分类特征转换为单热点表示,
每个类别有一个二进制特征:

在这里插入图片描述

它看起来很好很简单,那么为什么不使用它来代替OneHotEncoder呢?OneHotEncoder的优点是它能记住训练的类别。这一点非常重要,因为一旦您的模型投入生产,就应该提供与训练期间完全相同的功能:不多也不少。看看我们的训练好的cat_encoder在转换相同的df_test时输出(使用transform(),而不是fit_transform ()):

在这里插入图片描述

看到区别了吗get_dummies()只看到两个类别,所以它输出两列,而OneHotEncoder按照正确的顺序为每个学习到的类别输出一列。而且,如果您给get_dummies()提供一个包含未知类别DataFrame(例如,“《2HOPEN”),那么它将很高兴地为其生成一列:

在这里插入图片描述

但OneHotEncoder更聪明:它将检测未知类别并引发异常。如果你愿意,你可以将handle_unknown超参数设置为"ignore",在这种情况下,它将用零表示未知类别:

在这里插入图片描述

使用DataFrame拟合任何Scikit-Learn估计器时,估计器将列名存储在feature_names_in_attribute中。Scikit-Learn然后确保任何DataFrame在此之后被馈送到该估算器(例如要转换()或预测())具有相同的列名。Transformers还提供get_feature_names_out ()方法,您可以使用该方法围绕Transformers的输出构建DataFrame:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql学习笔记--基础

一&#xff0c;SQL最重要的增删改命令格式 1&#xff0c;insert into 表名&#xff08;不写这个括号里面的内容就默认所有字段都要添加&#xff09; values&#xff08;&#xff09; 插入单条数据 2&#xff0c;insert into 表名 (里面是列名) values&#xff08;根据列名依次…

【qemu逃逸】华为云2021-qemu_zzz

前言 虚拟机用户名&#xff1a;root 无密码 设备逆向 经过逆向分析&#xff0c;可得实例结构体大致结构如下&#xff1a; 其中 self 指向的是结构体本身&#xff0c;cpu_physical_memory_rw 就是这个函数的函数指针。arr 应该是 PCI 设备类结构体没啥用&#xff0c;就直接用…

京东按关键词搜索商品列表接口:竞品分析,商品管理,营销策略制定

京东搜索商品列表接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东平台上商品的列表数据&#xff0c;包括商品的标题、价格、库存、月销量、总销量、详情描述、图片等信息。 接口的主要作用包括&#xff1a; 市场调研&#xff…

图形学及图形学进展

有段时间没有来CSDN了&#xff0c;最近一直忙于工作&#xff0c;最近图形学方面&#xff0c;特别是重建图形学方面有了比较大的进展&#xff0c;然后NeRF-SLAM向也有不少进展&#xff0c;但由于ChatGPT风光无限&#xff0c;光芒都没有发出来&#xff0c;后续还是继续创作&#…

华为MateBook X Pro笔记本录屏办法

现象&#xff1a;使用ev录屏软件时录不上耳机声音。在我自己的普惠、华硕笔记本上都没有这个问题。 解决办法&#xff0c;使用华为自己的录屏功能。具体如下&#xff1a; 1、找到‘华为控制中心’&#xff1a; 2、使用‘智慧快录’&#xff1a;

ideal一键部署SpringBoot项目jar包到服务器

一 简介 我们在开发环境部署项目一般通过ideal将项目打包成jar包&#xff0c;然后连接linux服务器&#xff0c;将jar手动上传到服务中&#xff0c;重启服务。 概括的说流程是这样的: 本地打包->上传到服务器->kill掉以前的服务->重新启动jar包服务 每次总是循环这一…

【c语言】贪吃蛇

当我们不想学习新知识的时候&#xff0c;并且特别无聊&#xff0c;就会突然先看看别人怎么写游戏的&#xff0c;今天给大家分享的是贪吃蛇&#xff0c;所需要的知识有结构体&#xff0c;枚举&#xff0c;以及easy-x图形库的一些基本函数就完全够用了&#xff0c;本来我想插入游…

Android选项卡TabHost

选项卡主要由TabHost(标签&#xff0c;主人)&#xff0c;TabWidget(微件)和FrameLayout3个组件组成&#xff0c;用于实现一个多标签页的用户界面。 1. TabHost在XML文件中添加&#xff1a; XML布局文件中添加选项卡时必须使用系统id来为各组件指定id属性。 <TabHostandro…

SAE 2.0,让容器化应用开发更简单

云原生容器化应用托管模式的演变 云原生这个概念从提出&#xff0c;到壮大&#xff0c;再到今天的极大普及&#xff0c;始终处于一个不断演进和革新的过程中。云原生体系下应用的托管形态是随着企业应用架构在不断演进的。最早的应用大多是集中式、单体式的&#xff0c;应用通…

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统&#xff0c;具有较高的准确率和实时性能。 YoloV5是一种…

【hcie-cloud】【4】华为云Stack规划设计之华为云Stack标准组网【中】

文章目录 前言、华为云Stack交付综述华为云Stack标准组网标准组网架构HCS标准组网架构单核心VS双核心组网二层组网VS三层组网 单核心和双核心组网单核心组网设计和配置单核心组网 - 计算节点2网口单核心组网 - 计算节点4网口单核心组网 - 计算节点6网口单核心架构 - 多Region组…

Linux ----------------------- 文本处理工具

&#xff08;一&#xff09;绪论 awk、grep、sed和cut 是Linux 操作文本的四大利器&#xff0c;合称文本四大金刚&#xff0c;也是必须掌握的Linux 命令之一。这四个工具的功能各有侧重&#xff1a; awk&#xff1a;功能最强大&#xff0c;用于处理和格式化文本&#xff0c;可…

IntelliJ IDEA 如何修改默认Maven仓库地址

在使用idea过程中&#xff0c;每次新建项目或者打开项目时&#xff0c;maven仓库地址都会变为默认地址。如何修改默认地址&#xff0c;让其保持不变&#xff0c;如下这种方式可以简单快捷的设置。 1.打开idea&#xff0c;取消项目自动加载 2.点击 Customize,然后再点击 All se…

vSLAM中IMU预积分的作用--以惯性导航的角度分析

作为一个学过一点惯导的工程师&#xff0c;在初次接触视觉slam方向时&#xff0c;最感兴趣的就是IMU预积分了。但为什么要用这个预积分&#xff0c;在看了很多材料和书后&#xff0c;还是感觉模模糊糊&#xff0c;云里雾里。 在接触了vSLAM的更多内容后&#xff0c;站在历史研究…

JVM虚拟机:如何查看自己的JVM默认的垃圾回收器

只需要在程序运行的时候指定下面的参数就可以看到当前自己的JVM默认的垃圾回收器是什么&#xff1f;如下所示&#xff1a; 如上所示&#xff0c;默认使用的是G1回收器&#xff0c;这是我的电脑&#xff0c;因为我的电脑安装jdk的版本是1.9 如果你的jdk的版本是1.8&#xff0c;那…

11 抽象向量空间

抽象向量空间 向量是什么函数什么是线性推论向量空间 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 可以是一个箭头&#xff0c;可以是一组实数&#xff0c;即一个坐标对。 箭头在高维&#xff08;4维&#xff0c;甚至更高&#xff09;空间&…

攻击者滥用日历服务作为 C2 基础设施

谷歌警告多个威胁参与者正在利用其日历服务作为命令和控制&#xff08;C2&#xff09;基础设施。 谷歌警告 称&#xff0c;多个威胁参与者共享一个名为“Google Calendar RAT”的公共概念验证&#xff08;PoC&#xff09;漏洞&#xff0c;该漏洞依赖日历服务来托管命令和控制&…

Redis-----SSM整合redis及redis的注解式开发以及redis的击穿,穿透,雪崩三种解决方案

目录 SSM项目整合Redis 导入pom依赖 配置文件spring-redis.xml redis.properties 配置redis的key生成策略 redis的注解式开发及应用场景 什么是redis的注解式 redis注解式的场景应用 Cacheable 自定义策略 Cacheable可以指定三个属性&#xff0c;value、key和condition…

每日汇评:黄金正在期待鲍威尔的讲话以获取新的方向动力

周三早盘&#xff0c;金价盘整了连续两天的跌势&#xff0c;等待鲍威尔发言&#xff1b; 美元在不同的美联储评论和风险偏好减弱的情况下寻求方向&#xff1b; 黄金价格确认了上升三角形的突破&#xff0c;但美债收益率较低可能会限制跌幅&#xff1b; 周二早些时候&#xf…

大数据中经常使用的指令:

1、Hadoop&#xff1a; 1、关闭Hadoop集群的安全模式&#xff1a; hdfs dfsadmin -safemode leave#查看集群的模式的状态&#xff1a; hdfs dfsadmin -safemode get 2、启动、关闭Hadoop集群&#xff1a; start-all.sh stop-all.sh 3、停止yarn中进程的命令&#xff1a; yar…