当前位置: 首页 > news >正文

Spark MLlib 特征工程

Spark MLlib 特征工程

  • 预处理
  • 特征选择
  • 归一化
  • 离散化
  • Embedding
  • 向量计算

特征工程制约了模型效果 :

  • 决定了模型效果的上限 , 而模型调优只是在不停地逼近上限
  • 好的特征工程才能有好的模型

特征处理函数分类 :

  1. 预处理 : 将模型无法直接消费的数据,转为可消费的数据形式
  2. 特征选择 : 提取与预测标的关联度更高的特征,精简模型尺寸、提升模型泛化能力
  3. 归一化 : 去掉不同特征之间量纲的影响,避免因量纲不一致而导致的梯度下降震荡、模型收敛效率低下等问题
  4. 离散化 : 降低连续数值特征的多样性,让特征与预测标的之间建立更强的关联性
  5. Embedding : 将特征映射到向量空间,以向量形式刻画特征本身
  6. 向量计算 : 完成向量的拆分、拼接、运算,从而构建特征向量 (Feature Vectors),进而生成模型可消费的训练样本

在这里插入图片描述

预处理

预处理 : 把非数值字段转为数值字段
StringIndexer 作用 : 以数据列为单位,把字段中的字符串转为数值索引

  • 如 : 把 GarageType 中的字符串转换为数字

StringIndexer 效果 :

在这里插入图片描述

StringIndexer 步骤 :

  1. 实例化 StringIndexer 对象
  2. 用 setInputCol 和 setOutputCol 指定输入列和输出列
  3. 用 fit 和 transform 函数,完成数据转换

读取房屋源数据并创建 DataFrame

import org.apache.spark.sql.DataFrame// 这里的下划线"_"是占位符,代表数据文件的根目录
val rootPath: String = _
val filePath: String = s"${rootPath}/train.csv"val sourceDataDF: DataFrame = spark.read.format("csv").option("header", true)

选出所有的非数值字段,并用 StringIndexer 转换

// 导入StringIndexer
import org.apache.spark.ml.feature.StringIndexer// 所有非数值型字段,即 : StringIndexer所需的“输入列”
val categoricalFields: Array[String] = Array("MSSubClass", "MSZoning", "Street");// 非数值字段对应的目标索引字段,也即StringIndexer所需的“输出列”
val indexFields: Array[String] = categoricalFields.map(_ + "Index").toArray// 将engineeringDF定义为var变量,后续所有的特征工程都作用在这个DataFrame之上
var engineeringDF: DataFrame = sourceDataDF// 核心代码:循环遍历所有非数值字段,依次定义StringIndexer,完成字符串到数值索引的转换
for ((field, indexField) <- categoricalFields.zip(indexFields)) {// 定义StringIndexer,指定输入列名、输出列名val indexer = new StringIndexer().setInputCol(field).setOutputCol(indexField)// 使用StringIndexer对原始数据做转换engineeringDF = indexer.fit(engineeringDF).transform(engineeringDF)// 删除掉原始的非数值字段列engineeringDF = engineeringDF.drop(field)
}

与 GarageType 数据列与数值索引 :

engineeringDF.select("GarageType", "GarageTypeIndex").show(3)/** 结果打印
+----------+---------------+
|GarageType|GarageTypeIndex|
+----------+---------------+
| Attchd| 0.0|
| Detchd| 1.0|
| Attchd| 0.0|
+----------+---------------+
*/

特征选择

特征选择 : 根据一定的标准,对特征字段进行选择

特征选择的标准 :

  • 专家的经验初步选出特征集
  • 用统计方法计算候选特征与预测标的的关联性

在这里插入图片描述

利用 ChiSqSelector 封装的统计方法是卡方检验与卡方分布

ChiSqSelector 选择数值型字段的步骤 :

  1. 用 VectorAssembler 创建特征向量
  2. 基于特征向量,用 ChiSqSelector 完成特征选择

VectorAssembler 作用 : 把多个数值列捏合为一个特征向量

  • 例子 : 房屋的三个数值列 , 进行捏合成一个新的向量字段

在这里插入图片描述

VectorAssembler 用法 :

// 所有数值型字段,共有27个
val numericFields: Array[String] = Array("LotFrontage", "LotArea", "MasVnrArea");// 预测标的字段
val labelFields: Array[String] = Array("SalePrice")import org.apache.spark.sql.types.IntegerType// 将所有数值型字段,转换为整型Int
for (field <- (numericFields ++ labelFields)) {engineeringDF = engineeringDF.withColumn(s"${field}Int",col(field).cast(IntegerType);
} import org.apache.spark.ml.feature.VectorAssembler// 所有类型为Int的数值型字段
val numericFeatures: Array[String] = numericFields.map(_ + "Int").toArray
// 定义并初始化VectorAssembler
val assembler = new VectorAssembler().setInputCols(numericFeatures).setOutputCol("features")// 在DataFrame 应用 VectorAssembler,生成特征向量字段"features"
engineeringDF = assembler.transform(engineeringDF)

基于特征向量进行特征选择

import org.apache.spark.ml.feature.ChiSqSelector
import org.apache.spark.ml.feature.ChiSqSelectorModel// 定义并初始化ChiSqSelector
// 挑选最影响的前 20 个特征
val selector = new ChiSqSelector().setFeaturesCol("features").setLabelCol("SalePriceInt").setNumTopFeatures(20)// 调用fit函数,在DataFrame之上完成卡方检验
val chiSquareModel = selector.fit(engineeringDF)
// 获取ChiSqSelector选取出来的入选特征集合(索引)
val indexs: Array[Int] = chiSquareModel.selectedFeaturesimport scala.collection.mutable.ArrayBufferval selectedFeatures: ArrayBuffer[String] = ArrayBuffer[String]()
// 根据特征索引值,查找数据列的原始字段名
for (index <- indexs) {selectedFeatures += numericFields(index)
}

ChiSqSelector工作流程 :

  • ChiSqSelector 记录了 0/1 索引,对应 LotFrontage / BedroomAbvGr

在这里插入图片描述

归一化

归一化 (Normalization) 作用 : 把一组数值,统一映射到同一个值域,该值域通常是 [0, 1]

归一化的意义 :

  • 当原始数据之间的量纲差异较大时,模型训练时,梯度下降不稳定、抖动较大,模型不容易收敛,从而导致训练效率较差
  • 当所有特征数据都被约束到同一个值域时,模型训练的效率就会大幅提升

MinMaxScaler 用法 :

  1. 用 VectorAssembler 创建特征向量
  2. 基于特征向量,用 MinMaxScaler 完成归一化
// 所有类型为Int的数值型字段
// val numericFeatures: Array[String] = numericFields.map(_ + "Int").toArray// 遍历每一个数值型字段
for (field <- numericFeatures) {// 定义并初始化VectorAssemblerval assembler = new VectorAssembler().setInputCols(Array(field)).setOutputCol(s"${field}Vector")// 调用transform把每个字段由Int转换为Vector类型engineeringData = assembler.transform(engineeringData)
}import org.apache.spark.ml.feature.MinMaxScaler// 锁定所有Vector数据列
val vectorFields: Array[String] = numericFeatures.map(_ + "Vector").toArray
// 归一化后的数据列
val scaledFields: Array[String] = vectorFields.map(_ + "Scaled").toArray// 循环遍历所有Vector数据列
for (vector <- vectorFields) {// 定义并初始化MinMaxScalerval minMaxScaler = new MinMaxScaler().setInputCol(vector).setOutputCol(s"${vector}Scaled")// 使用MinMaxScaler,完成Vector数据列的归一化engineeringData = minMaxScaler.fit(engineeringData).transform(engineeringData)
}

MinMaxScaler 归一化 :

在这里插入图片描述

离散化

离散化作用 : 把原本连续的数值打散,降低原始数据的多样性(Cardinality)

  • 如 : 居室数量 (BedroomAbvGr),包含从 1 - 8 的连续整数

离散化的意义 : 提升特征数据的区分度与内聚性,实现与预测标的产生更强的关联

BedroomAbvGr离散化 :

在这里插入图片描述

离散化的用法 :

// 原始字段
val fieldBedroom: String = "BedroomAbvGrInt"
// 包含离散化数据的目标字段
val fieldBedroomDiscrete: String = "BedroomDiscrete"// 指定离散区间,分别是[负无穷, 2]、[3, 4]和[5, 正无穷]
val splits: Array[Double] = Array(Double.NegativeInfinity, 3, 5, Double.PositiveInfinity)import org.apache.spark.ml.feature.Bucketizer// 定义并初始化Bucketizer
val bucketizer = new Bucketizer()// 指定原始列.setInputCol(fieldBedroom)// 指定目标列.setOutputCol(fieldBedroomDiscrete)// 指定离散区间.setSplits(splits)// 调用transform完成离散化转换
engineeringData = bucketizer.transform(engineeringData)

离散化前后对比 :

在这里插入图片描述

Embedding

Embedding 过程 : 把数据集合映射到向量空间,进而把数据进行向量化的过程

热独编码 (One Hot Encoding) :

  • 通过 StringIndexer 把 GarageType 映射成六个数值
  • 用热独编码,把每个数值都转为一个向量

在这里插入图片描述

把索引字段转为向量字段 :

import org.apache.spark.ml.feature.OneHotEncoder// 非数值字段对应的目标索引字段,也即StringIndexer所需的“输出列”
// val indexFields: Array[String] = categoricalFields.map(_ + "Index").toArray// 热独编码的目标字段,也即OneHotEncoder所需的“输出列”
val oheFields: Array[String] = categoricalFields.map(_ + "OHE").toArray// 循环遍历所有索引字段,对其进行热独编码
for ((indexField, oheField) <- indexFields.zip(oheFields)) {val oheEncoder = new OneHotEncoder().setInputCol(indexField).setOutputCol(oheField)engineeringData= oheEncoder.transform(engineeringData)
}

向量计算

向量计算作用 : 构建训练样本中的特征向量 (FeatureVectors)

构建特征向量 :

import org.apache.spark.ml.feature.VectorAssembler/**
入选的数值特征:selectedFeatures
归一化的数值特征:scaledFields
离散化的数值特征:fieldBedroomDiscrete
热独编码的非数值特征:oheFields
*/
val assembler = new VectorAssembler().setInputCols(selectedFeatures ++ scaledFields ++ fieldBedroomDiscrete ++ oheFields).setOutputCol("features")engineeringData = assembler.transform(engineeringData)

定义出线性回归模型 :

// 定义线性回归模型
val lr = new LinearRegression().setFeaturesCol("features").setLabelCol("SalePriceInt").setMaxIter(100)// 训练模型
val lrModel = lr.fit(engineeringData)
// 获取训练状态
val trainingSummary = lrModel.summary// 获取训练集之上的预测误差
println(s"Root Mean Squared Error (RMSE) on train data: ${trainingSummary.root}");

相关文章:

Spark MLlib 特征工程

Spark MLlib 特征工程预处理特征选择归一化离散化Embedding向量计算特征工程制约了模型效果 : 决定了模型效果的上限 , 而模型调优只是在不停地逼近上限好的特征工程才能有好的模型 特征处理函数分类 : 预处理 : 将模型无法直接消费的数据&#xff0c;转为可消费的数据形式特…...

CentOS7 完全卸载 php

在 CentOS 7 使用 yum install 简单安装 php 后&#xff0c;发现 php 版本 5.4 &#xff0c;太低了&#xff01; 然后&#xff0c;使用 yum remove 简单卸载后&#xff0c;发现 php 还在&#xff0c;不干净&#xff01; 只好 rpm 慢慢卸载 rpm -qa |grep php php-gd-5.4.16-4…...

关于OCS认证里必须知晓的内容

【关于OCS认证里必须知晓的内容】美国非营利组织Textile Exchange推出的有机认证标准——有机含量标准(The Organic Content Standard)&#xff0c;简称OCS。该标准通过跟踪有机原材料的种植从而监管整个有机产业链。OCS将应用于各种有机种植原料的验证&#xff0c;而不只限于有…...

创业做电商难不难?新人做电商怎么才能挣钱?

这几年经济不景气&#xff0c;创业做电商的人越来越多&#xff0c;但是&#xff0c;对于多数人来说&#xff0c;一开始做电商&#xff0c;都是试错成本&#xff0c;没有系统学习或者是跟着半吊子二把刀学的&#xff0c;结果赔钱就算了&#xff0c;新人创业做电商到底难不难&…...

【项目设计】高并发内存池(七)[性能测试和提升]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…...

PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换

目录问题描述问题解决方式一&#xff1a;自定义属性方式二&#xff1a;继承覆写方式三&#xff1a;trait复用方式四&#xff1a;定义Cast子类update不生效参考文章问题描述 Model示例 class UserModel extends Model {protected $table tb_user;protected $casts [alias …...

自动化测试总结--断言

采购对账测试业务流程中&#xff0c;其中一个测试步骤总是失败&#xff0c;原因是用例中参数写错及断言不明确 一、问题现象&#xff1a; 采购对账主流程中&#xff0c;其中一个步骤失败了&#xff0c;会导致这个套件一直失败 图&#xff08;1&#xff09;测试报告视图中&…...

传输线的物理基础(三):传输线的瞬时阻抗

每个信号都有一个上升时间 RT&#xff0c;通常是从 10% 到 90% 的电压电平测量的。当信号沿传输线向下移动时&#xff0c;前沿在传输线上展开并具有空间范围。如果我们可以冻结时间并观察电压分布向外移动时的大小&#xff0c;我们会发现类似下图的东西。传输线上上升时间的长度…...

第六章:多线程

第六章&#xff1a;多线程 6.1&#xff1a;程序、进程、线程基本概念 程序 程序program是为了完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 进程 ​ 进程process是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一个…...

铁路与公路

蓝桥杯集训每日一题acwing4074 某国家有 n 个城市&#xff08;编号 1∼n&#xff09;和 m 条双向铁路。 每条铁路连接两个不同的城市&#xff0c;没有两条铁路连接同一对城市。 除了铁路以外&#xff0c;该国家还有公路。 对于每对不同的城市 x,y&#xff0c;当且仅当它们之…...

GitHub Copilot 全新升级,工作效率提升 55%

2021年 6 月&#xff0c;GitHub 和 OpenAI 推出了 GitHub Copilot 预览版&#xff0c;可根据命名或者正在编辑的代码上下文为开发者提供代码建议&#xff0c;被称为“你的 AI 结对程序员”。 近日&#xff0c;GitHub 宣布&#xff0c;经过去年 12 月以来的短暂测试后&#xff…...

【IoT】《天道》中音响案例的SWOT分析

在20世纪80年代初&#xff0c;SWOT最初是由美国知名管理学教授海因茨韦里克提出的。 之后这个工具就经常被用于企业的战略分析、竞争对手分析等场景。 在每年例行的公司产品规划过程中&#xff0c;我个人也经常使用这个工具。 由于涉及一些公司商业上的信息&#xff0c;下面会用…...

如何实现接口幂等性

1 什么是幂等 幂等操作的特点是一次或者任意多次执行所产生的影响均与一次执行的影响相同&#xff0c;不会因为多次的请求而产生不一样的结果。换句话说&#xff0c;就是我使用相同的请求参数&#xff0c;去请求同一个接口&#xff0c;不管请求多少次获取到的响应数据应该是一…...

相恨见晚的office办公神器(不坑盒子/打工人Excel插件2023年最新版)

不坑盒子 这是一个非常好用的插件工具&#xff0c;专门应用在Word文档和wps&#xff0c;支持Office 2010以上的版本&#xff0c;操作也简单且实用。 不坑盒子下载及使用说明 一键排版功能 像是下面的自动排版功能&#xff0c;可以在配置里面先设定好需要的格式&#xff0c;…...

matlab基础到实战(1)

目录概述sin函数例子四则运算实数复数逻辑运算复数运算模幅角共轭向量二维向量定义序列生成向量向量索引方式加减乘除向量间运算加减乘法除法概述 MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理…...

谷歌发布编写分布式应用的框架Service Weaver

一个新的框架&#xff0c;在本地以模块化单体的形式运行&#xff0c;一旦部署&#xff0c;则为分布式微服务架构 转载请注明来源&#xff1a;https://janrs.com/2023/03/%e8%b0%b7%e6%ad%8c%e5%8f%91%e5%b8%83%e7%bc%96%e5%86%99%e5%88%86%e5%b8%83%e5%bc%8f%e5%ba%94%e7%94%a8…...

详解FPGA:人工智能时代的驱动引擎观后感

详解FPGA&#xff1a;人工智能时代的驱动引擎观后感 本书大目录 第一章 延续摩尔定律 第二章 拥抱大数据的洪流 第三章 FPGA在人工智能时代的独特优势 第四章 更简单也更复杂——FPGA开发的新方法 第五章 站在巨人肩上——FPGA发展新趋势 文章目录详解FPGA&#xff1a;人工智能…...

Rest/Restful接口

Rest Rest的全称是Representational State Transfer 。Rest是一种架构风格。Rest有很多原则和限制: 客户端-服务端架构模式无状态可缓存统一接口分层系统按需缓存 Rest对我们开发人员来说基本上就是资源&#xff0c;我们一般通过URI表示我们请求的一个资源。例如&#xff1a…...

【vue init】三.项目引入axios、申明全局变量、设置跨域

教程目录 一&#xff1a;《【vue init】使用vue init搭建vue项目》 二&#xff1a;《【vue init】项目使用vue-router,引入ant-design-vue的UI框架&#xff0c;引入less》 三&#xff1a;《【vue init】项目引入axios、申明全局变量、设置跨域》 根据前文《【vue init】项目使…...

搭建nextcloud私有云盘

要搭建Nextcloud&#xff0c;需要在服务器上安装和配置Nginx、PHP和SQLite3。下面是一些基本步骤&#xff1a; 安装Nginx 可以使用包管理器进行安装。例如&#xff0c;在Ubuntu上可以运行以下命令&#xff1a; sudo apt update sudo apt install nginx配置Nginxwget -P /home/u…...

05 | 如何安全、快速地接入OAuth 2.0?

05 | 如何安全、快速地接入OAuth 2.0&#xff1f; 构建第三方软件应用 第一点&#xff0c;注册信息 小兔软件的研发人员提前登录到京东商家开放平台进行手动注册&#xff0c;以便后续使用这些注册的相关信息来请求访问令牌。兔软件需要先拥有自己的 app_id 和 app_serect 等信…...

nest.js学习笔记(一)

nest.js学习笔记&#xff08;一&#xff09;一、安装nest.js前置条件运行项目目录介绍二、nest.js cli 常用命令三、RESTful 风格设计1.接口url2.RESTful 版本控制四、获取前端传过来的参数1.获取Get请求参数2.获取Post请求参数3.动态路由4.获取Header信息5.自定义状态码nest.j…...

win下载配置CIC Flowmeter环境并提取流量特征

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、下载CIC Flowmeter二、安装java、maven、gradle和IDEA1.java 1.82.maven3.gradle4.IDEA三、CICFlowMeter-master使用四、流量特征1.含义2.获取前言 配了一整…...

【LeetCode刷题-Java/Python】二分查找

二分查找704.二分查找题目实现总结35.搜索插入位置题目实现34. 在排序数组中查找元素的第一个和最后一个位置题目实现69.x的平方根题目实现367. 有效的完全平方数题目实现704.二分查找 题目 题目链接 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一…...

Linux 6.2 已正式发布

Linus Torvalds 发布了稳定的 Linux 6.2 内核&#xff0c;这是 2023 年的第一个主要内核版本。硬件方面&#xff0c;Linux 6.2 提升了 Intel Arc 显卡 (DG2/Alchemist) 的稳定性&#xff0c;真正做到开箱即用。英特尔的 On Demand 驱动程序现在状态良好&#xff0c;适用于第 4 …...

Kubernetes 101,第一部分,基础知识

已经有一段时间了,我想花点时间坐下来写写关于Kubernetes 的文章。时机已到。 简而言之,Kubernetes是一个用于自动化和管理容器化应用程序的开源系统。Kubernetes 就是关于容器的。 ❗如果你对什么...

企业级信息系统开发学习笔记1.7 基于XML配置方式使用Spring MVC

文章目录零、本节学习目标一、Spring MVC概述1、MVC架构2、Spring MVC3、使用Spring MVC的两种方式二、基于XML配置与注解的方式使用Spring MVC&#xff08;一&#xff09;创建Spring项目【SpringMVCDemo01】&#xff08;二&#xff09;在pom文件里添加相关依赖&#xff08;三&…...

java反射,动态代理

1. 反射 1.1 反射的概述&#xff1a; ​ 专业的解释&#xff08;了解一下&#xff09;&#xff1a; ​ 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; ​ 对于任意一个对象&#xff0c;都能够调用它的任意属性和方法…...

React(六):Redux的使用、react-redux简化代码、redux模块化、RTK的使用

React&#xff08;六&#xff09;一、Redux测试项目搭建1.创建store仓库2.创建reducer函数&#xff08;纯函数&#xff09;3.constants.js保存action名字4.修改store中的数据5.动态生成action二、React中如何使用redux1.安装redux2.创建store3.组件中订阅store4.派发action修改…...

静态库和动态库的打包与使用

静态库和动态库 静态库和动态库的打包 生成可执行程序时链接使用 运行可执行程序时加载使用 提前声明&#xff0c;笔者示例的文件有mian.c/child.c/child.h。OK&#xff0c;我们先了解一下&#xff0c;库文件是什么&#xff1f;它其实就是打包了一堆实现常用功能的代码文件. ⭐…...

网站开发工作平时做什么/爱站网挖掘关键词

简介&#xff1a; 挺不错的一个简约导航模板 网盘下载地址&#xff1a; http://kekewl.org/XLCQkWrvFdi0 图片&#xff1a;...

电子商务网站基本功能/天津关键词优化专家

微信公众号&#xff1a;infoQc如有问题或建议&#xff0c;请公众号留言最近更新&#xff1a;2018-08-19 包装类型 在讲解正文之前&#xff0c;我很想问这么一个问题&#xff1a;"Java为我们提供了8种基本数据类型&#xff0c;为什么还需要提供各自的包装类型呢&#xff1f…...

网站制作经典案例/电脑培训速成班多少钱

这篇笔记是一篇安装教程&#xff0c;没有什么实际的意义&#xff0c;仅为了记录一下……距离上次弄这东西不知道多长时间了&#xff0c;以至于这次再次使用时很是生疏&#xff0c;于是就想着把过程记录下来方便之后查看。 这里不涉及VMware Workstation 15 Pro的安装。仅为如何…...

css入门教程/云优化

1&#xff1a;Exception in thread "main" org.hibernate.QueryException: could not resolve property: deptid of 无法解析属性 deptid转载于:https://www.cnblogs.com/m-xy/archive/2013/05/03/3056160.html...

土木特网站建设/目前最新的营销模式有哪些

图卷积&#xff08;3&#xff09;——谱域图卷积&#xff08;2&#xff09; 图傅里叶变换 将图中的nnn个节点表示为x[x1,x2,⋯,xn]T∈Rnx\left[x_{1}, x_{2}, \cdots, x_{n}\right]^{T} \in \mathbb{R}^{n}x[x1​,x2​,⋯,xn​]T∈Rn&#xff0c;每一个节点上有一个信号值&am…...

寻找南京帮助做网站的单位/南昌百度推广公司

在我们为 IDEA 等编辑器配置 svn 时&#xff0c;经常需要配置 svn.exe 文件的目录 C:\Program Files\TortoiseSVN\bin\svn.exe &#xff1b; 但打开 svn.exe 文件的安装目录 C:\Program Files\TortoiseSVN\bin&#xff0c;却发现没有 svn.exe 文件&#xff0c;其原因是由于安…...