【机器学习】Spark ML 对数据特征进行 One-Hot 编码

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: One-Hot 编码是机器学习中将离散特征转换为数值表示的方法,每个取值映射为一个二进制向量,常用于避免特征间大小关系影响模型。Spark ML 提供 OneHotEncoder 进行编码,输入输出列可通过 `inputCol` 和 `outputCol` 参数设置。在示例中,先用 StringIndexer 对类别特征编码,再用 OneHotEncoder 转换,最后展示编码结果。注意 One-Hot 编码可能导致高维问题,可结合实际情况选择编码方式。

什么是 One-Hot 编码?

在机器学习中,一般需要对非数值型的特征进行编码处理,将其转化为数值型的特征。其中,One-Hot 编码是一种常见的特征编码方式。

One-Hot 编码是将一个离散特征的每个取值映射为一个唯一的整数编号,并将该编号表示成一个二进制向量的形式。具体来说,对于一个有 $k$ 个不同取值的离散特征,其 One-Hot 编码将会得到一个 $k$ 维的向量,其中只有一个元素为 1,其余元素为 0,该元素的下标对应着特征取值的编号。

例如,对于一个颜色特征,其可能的取值为红、绿、蓝三种,可以将其编码为:

  • 红色:[1, 0, 0]

  • 绿色:[0, 1, 0]

  • 蓝色:[0, 0, 1]

为什么需要 One-Hot 编码?

One-Hot 编码主要用于将离散特征转化为数值特征,并且避免了特征之间的大小关系,方便在机器学习模型中使用。

  1. 避免数值型特征带来的大小关系:如果对于一个本质上是离散的特征,使用数值型的编码方式,就可能会导致不同取值之间带来了大小关系,这可能会影响机器学习模型的训练效果。而使用 One-Hot 编码,每个取值都是独立的,不存在大小关系,不会对模型产生影响。

  2. 方便使用分类器:在机器学习中,一些分类器(比如决策树、支持向量机等)需要将数据转换为数值型的输入,One-Hot 编码可以将离散特征转换为数值特征,方便这些分类器进行训练和预测。

  3. 增加特征的独立性:在一些情况下,原始的离散特征可能存在相关性,One-Hot 编码可以将这些特征转化为互相独立的数值特征,便于在模型中使用。

需要注意的是,对于具有大量不同取值的离散特征,进行 One-Hot 编码可能会导致特征维度爆炸,影响模型的训练效率和性能。在这种情况下,可以考虑使用其他特征编码方式,比如哈希编码。

Spark ML 之 One-Hot

在 Spark MLlib 中,我们通过 OneHotEncoder 特征转换器,用于将类别特征转换为二元向量,其实现基于 One-Hot 编码,将每个类别特征映射到唯一的整数索引,并将索引编码为二元向量。该转换器适用于逻辑回归、朴素贝叶斯等需要数值特征作为输入的算法。

OneHotEncoder 转换器有两个主要参数:

  • inputCol:需要转换为二元向量的输入列名。

  • outputCol:转换后的二元向量输出列名。

那么什么是二元向量呢?

二元向量是指只包含两个元素的向量。在数学中,一个二元向量可以表示为 $(x, y)$,其中 $x$ 和 $y$ 是向量的两个分量。这样的向量也可以被看作是二维坐标系中的一个点,其中 $x$ 和 $y$ 分别表示该点在 $x$ 轴和 $y$ 轴上的坐标。

在机器学习和数据分析中,二元向量通常被用来表示二元特征,例如某个物品是否被购买,某个用户是否点击了某个广告等等。在这种情况下,向量的两个分量通常分别表示某个特征的取值为 01

Spark ML 应用示例

maven 中引入 Spark ML 的依赖。

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>

1.创建 SparkSession 对象

        val spark: SparkSession = SparkSession
                .builder()
                .master("local[*]")
                .appName("One_Hot")
                .getOrCreate()

2.创建一个示例数据集,格式为 DataFrame

        import spark.implicits._

        val data: DataFrame = Seq(
            (0, "red"),
            (1, "blue"),
            (2, "green"),
            (3, "red"),
            (4, "red"),
            (5, "blue")
        ).toDF("id", "color")

生成了一个包含 "id""color" 两个字段的 DataFrame。其中 "color" 是一个字符串类型的类别特征,包括 "red""blue""green" 三种取值。

3.创建 StringIndexer 对象,对特征进行索引编码

        val indexer: StringIndexerModel = new StringIndexer()
                .setInputCol("color")
                .setOutputCol("index_color")
                .fit(data)

        val indexData: DataFrame = indexer.transform(data)

该编码会将 "color" 特征中的三种取值分别编码为 012

StringIndexer 是 Spark 中常用的一种特征工程模型,它的作用是将字符串类型的特征值转换成数值类型的特征值。在机器学习和数据分析中,通常需要将非数值类型的特征值转换成数值类型,这样才能够使用各种算法进行训练和预测等等。

StringIndexer 可以将某个字符串特征的所有取值按照出现的次数进行排序,并为每个取值分配一个整数编号,从而将字符串类型的特征值转换成整数类型的特征值。

例如,如果某个字符串特征的取值为 ["cat", "dog", "bird", "dog", "cat"],那么经过 StringIndexer 处理后,取值 "cat" 将被编号为 0"dog" 将被编号为 1"bird" 将被编号为 2,转换后的特征值为 [0, 1, 2, 1, 0](出现次数一样会按照 ASCII 码等规则进行编号)。

4.使用 OneHotEncoder 对特征进行 One-Hot 编码

        val encoder: OneHotEncoder = new OneHotEncoder()
                .setInputCol("index_color")
                .setOutputCol("encoded_color")
                .setDropLast(false)

        val encoderModel: OneHotEncoderModel = encoder.fit(indexData)

        val encoderData: DataFrame = encoderModel.transform(indexData)

将编码后的 "index_color" 特征作为输入,将输出列设置为 "encoded_color",对其进行 One-Hot 编码,并保留每个特征中的所有取值。

这意味着对于 "color" 特征,由于有三种取值,因此编码后的结果会生成一个长度为 3 的向量,其中每个元素对应一种取值,元素值为 1 表示该取值出现,为 0 表示该取值未出现。

setDropLast 是 OneHotEncoder 类的一个方法,它用于设置是否省略最后一个编码值,其默认值为 true
如果将 setDropLast 设置为 false,则会为每个不同的类别创建一个编码列,这样最后一个类别将具有全部 1 的编码向量。如果将其设置为 true,则会为每个不同的类别创建一个编码列,但最后一个编码列将被省略。

5.输出结果

        encoderData.show(false)

输出结果如下所示:

+---+-----+-----------+-------------+
|id |color|index_color|encoded_color|
+---+-----+-----------+-------------+
|0  |red  |0.0        |(3,[0],[1.0])|
|1  |blue |1.0        |(3,[1],[1.0])|
|2  |green|2.0        |(3,[2],[1.0])|
|3  |red  |0.0        |(3,[0],[1.0])|
|4  |red  |0.0        |(3,[0],[1.0])|
|5  |blue |1.0        |(3,[1],[1.0])|
+---+-----+-----------+-------------+

encoded_color 列是进行 One-Hot 编码完成后的特征向量。

我们拿 ID 为 0 的数据来对 encoded_color 列进行说明,即:(3,[0],[1.0]),解析如下:

  • 3 表示特征数量,即:redbluegreen

  • [0] 表示特征的编码,这里 red 的编码为 0

  • [1.0] 表示该列是否为 red(其它列对应其它的颜色),1 表示0 表示否。

6.进行向量拆分

        encoderData.withColumn("new_encoded_color",vector_to_array(col("encoded_color")))
                .show(false)

结果如下:

+---+-----+-----------+-------------+-----------------+
|id |color|index_color|encoded_color|new_encoded_color|
+---+-----+-----------+-------------+-----------------+
|0  |red  |0.0        |(3,[0],[1.0])|[1.0, 0.0, 0.0]  |
|1  |blue |1.0        |(3,[1],[1.0])|[0.0, 1.0, 0.0]  |
|2  |green|2.0        |(3,[2],[1.0])|[0.0, 0.0, 1.0]  |
|3  |red  |0.0        |(3,[0],[1.0])|[1.0, 0.0, 0.0]  |
|4  |red  |0.0        |(3,[0],[1.0])|[1.0, 0.0, 0.0]  |
|5  |blue |1.0        |(3,[1],[1.0])|[0.0, 1.0, 0.0]  |
+---+-----+-----------+-------------+-----------------+

我们拿 ID 为 0 的数据来对 encoded_colornew_encoded_color 列进行说明,它们的值分别为:(3,[0],[1.0])[1.0, 0.0, 0.0]

这里主要说明 new_encoded_color 列数据,可以发现,对 One-Hot 特征向量结果 encoded_color 进行转换后,结果为 [1.0, 0.0, 0.0],它分别对应着 [red,blue,green]

那么为什么是这个顺序呢?这就要提到我们上面的特征编码了,因为它是按照 StringIndexer 编码后的顺序进行排列的。

从数据中可以看出, ID 为 0 的数据属于 red,而不属于其它两个特征,所以结果为:[1.0, 0.0, 0.0]

One-Hot 编码,仅此而已。

相关文章
|
4天前
|
机器学习/深度学习 分布式计算 算法
联邦学习是保障数据隐私的分布式机器学习方法
【6月更文挑战第13天】联邦学习是保障数据隐私的分布式机器学习方法,它在不暴露数据的情况下,通过在各设备上本地训练并由中心服务器协调,实现全局模型构建。联邦学习的优势在于保护隐私、提高训练效率和增强模型泛化。已应用于医疗、金融和物联网等领域。未来趋势包括更高效的数据隐私保护、提升可解释性和可靠性,以及与其他技术融合,有望在更多场景发挥潜力,推动机器学习发展。
14 4
|
1天前
|
SQL 分布式计算 HIVE
实时计算 Flink版产品使用问题之同步到Hudi的数据是否可以被Hive或Spark直接读取
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
机器学习/深度学习 数据采集 算法
机器学习入门:算法与数据的探索之旅
【6月更文挑战第13天】本文介绍了机器学习的基础,包括算法和数据处理的重要性。机器学习算法分为监督学习(如线性回归、决策树)、非监督学习(如聚类、降维)和强化学习。数据处理涉及数据清洗、特征工程、数据分割及标准化,是保证模型性能的关键。对于初学者,建议学习基础数学、动手实践、阅读经典资料和参与在线课程与社区讨论。
|
5天前
|
分布式计算 定位技术 Scala
使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析
使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析
|
5天前
|
SQL 分布式计算 NoSQL
使用Spark高效将数据从Hive写入Redis (功能最全)
使用Spark高效将数据从Hive写入Redis (功能最全)
|
5天前
|
消息中间件 分布式计算 关系型数据库
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
|
6天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之如何使用separator进行多值特征的分割
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
6天前
|
机器学习/深度学习 人工智能 监控
人工智能平台PAI产品使用合集之设置了7个特征,但在最后生成的数据表中只包含了6个id_feature的特征,是什么导致的
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
炸裂!PAI-DSW 和 Free Prompt Editing 图像编辑算法,成就了超神的个人 AIGC 绘图小助理!
【6月更文挑战第11天】PAI-DSW 和 Free Prompt Editing 算法引领图像编辑革命,创造出个人AIGC绘图小助理。PAI-DSW擅长深度图像处理,通过复杂模型和深度学习精准编辑;Free Prompt Editing则允许用户以文本描述编辑图像,拓展编辑创意。结合两者,小助理能根据用户需求生成惊艳图像。简单Python代码示例展示了其魅力,打破传统编辑局限,为专业人士和普通用户提供创新工具,开启图像创作新篇章。未来,它将继续进化,带来更多精彩作品和体验。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!
**摘要:** 了解AI、ML和DL的旅程。AI是模拟人类智能的科学,ML是其分支,让机器从数据中学习。DL是ML的深化,利用多层神经网络处理复杂数据。AI应用广泛,包括医疗诊断、金融服务、自动驾驶等。ML助力个性化推荐和疾病预测。DL推动计算机视觉和自然语言处理的进步。从基础到实践,这些技术正改变我们的生活。想要深入学习,可参考《人工智能:一种现代的方法》和《深度学习》。一起探索智能的乐趣!
12 1
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!

热门文章

最新文章