特征组合 二阶特征组合举例

news/2024/7/24 13:18:23 标签: 机器学习

以广告点击预估问题为例,假设原始数据有语言和类型两种 离散特征。为了提高拟合能力,语言和类型可以组成二阶特征。 

上面是在百面机器学习上看到的一个小问题,尝试一下。

这里我采用特征交叉的方法来处理。将语言和类型两个特征的取值进行两两组合,

假设现在样本中语言特征取值为"English",类型特征取值为"video",我将其组成一个新的二阶特征"English_video"。

实现思路:

        先将语言和类型特征进行编码,例如使用独热编码或二进制编码将其转换为数值特征

        然后对这些编码后的特征进行两两交叉,得到新的二阶特征。

        最终得到一个特征向量,其中包含原始特征和二阶特征。

代码尝试:

import numpy as np

# 原始特征
language = ["English", "Chinese", "French"]
type = ["video", "article", "audio"]

# 对特征进行编码
language_encoded = np.eye(len(language))
type_encoded = np.eye(len(type))

# 特征交叉,得到新的二阶特征 将二阶特征存储在一个大小为 (len(language) * len(type), len(language) + len(type)) 的二维矩阵中

feature_cross = np.zeros((len(language) * len(type), len(language) + len(type)))
for i in range(len(language)):
    for j in range(len(type)):
        feature_cross[i*len(type)+j] = np.concatenate((language_encoded[i], type_encoded[j]))

# 打印特征交叉后的结果
print(feature_cross)

在这里我也使用到了np.concatenate()函数:

        这个函数将多个数组沿着指定的轴进行拼接。其中,axis参数用于指定拼接的轴,默认为 0。当 axis=0 时,表示将多个数组在纵向方向进行拼接,即增加行数;当 axis=1 时,表示将多个数组在横向方向进行拼接,即增加列数。

输出一下结果可以看到:

[[1. 0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1.]
 [0. 1. 0. 1. 0. 0.]
 [0. 1. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1.]
 [0. 0. 1. 1. 0. 0.]
 [0. 0. 1. 0. 1. 0.]
 [0. 0. 1. 0. 0. 1.]]

这就得到了一个由原始特征语言和类型组成的二阶特征数组。

但是,这还存在一个问题,如果原始特征分别对应 m个和 n 个,那么二阶特征的数量将会是 m*n,二阶交叉特征的数量会随着原始特征数量的增加而呈指数级增长,导致模型的复杂度和训练难度也会随之增加。

我们需要在这个基础上引入降维操作。比如我们可以使用特征哈希(Feature Hashing),主成分分析(PCA)、奇异值分解(SVD)、独立成分分析(ICA)等。

这里使用特征哈希举例:

特征哈希将原始特征映射到一个固定大小的哈希空间中,通过哈希函数的随机映射将原始特征映射到相应的二阶特征上。

它将原始特征值看作哈希表中的键,然后将其哈希到一个固定大小的桶(bucket)中。哈希函数可以是任意的映射函数,可以是简单的模运算,也可以是更复杂的哈希函数。通过将原始特征哈希到桶中,我们可以将原始特征的维度降低到一个固定的值。

这种方法的优点是:

        可以在不显式地计算二阶特征交叉的情况下,实现特征的组合和降维,

        从而避免了二阶特征数量过大导致的维度爆炸问题。

缺点是:

        存在哈希冲突。不同的原始特征可能被哈希到同一个桶中,导致信息损失。

代码实现:(使用sklearn中的FeatureHasher类来实现)

from sklearn.feature_extraction import FeatureHasher

# 原始特征
language = ["English", "Chinese", "French"]
type = ["video", "article", "audio"]

# 创建 FeatureHasher 对象
n_features = 100  # 哈希表大小
hasher = FeatureHasher(n_features=n_features, input_type='string')

# 将原始特征哈希到固定大小的向量中
X = [{"language": lang, "type": t} for lang in language for t in type]
# 使用transform()方法将原始特征映射到哈希表中,得到哈希后的向量。
X_hashed = hasher.transform(X)

# 输出哈希后的向量
print(X_hashed.toarray())

转换成一个普通的二维数组,输出:

[[ 0. -1. -1. ... -1. -1.  1.]
 [ 0. -1.  0. ...  0. -1.  1.]
 [ 0. -1.  1. ... -1. -1.  1.]
 ...
 [ 0.  1.  0. ... -1. -1.  1.]
 [ 0.  1. -1. ...  0. -1.  1.]
 [ 0.  1.  1. ...  1. -1.  1.]]

得到一个哈希后的稀疏矩阵,其大小为 (len(language)*len(type), n_features)

每一行对应原始特征中的一个组合,每一列对应哈希表中的一个桶。

如果哈希后的特征值落入了某个桶中,那么该桶所在的列的值就为 1,否则为 0。
哈希函数是随机的,因此在同一个哈希表中,相同的特征值可能被映射到不同的桶中,从而得到不同的哈希特征向量。

以上。


http://www.niftyadmin.cn/n/303674.html

相关文章

5月7日 2H55min|5月8日8H50min|时间轴复盘|14:00~14:30

5月8日 todo list list4 40min ✅ |实际上用了50+50 list6 40min ✅ |实际上用了30+60 阅读+听力连做 100min ✅ 口语 day01 ✅ 口语 day02 口语 day03

VirtualBox 安装ubuntu22.04-live-server版本

文章目录 一、安装过程二、启动过程三、测试网络连通四、设置共享文件夹 一、安装过程 1、新建一个虚拟机 2、设置名称和位置 3、设置内存大小 4、设置虚拟硬盘,选择现在创建虚拟硬盘 5、选择虚拟硬盘文件类型,这里选择VDI 6、选择存储方式&#x…

蓝牙网状网络的基本原理及应用开发

借助蓝牙 5 的网状网络功能,开发人员可以增强无线连接系统(如物联网设备)的通信范围和网络可用性。但是,网状网络的低功耗无线硬件设计与网状网络软件开发之间存在着复杂的层次,这可能会使开发人员迅速陷入混乱并危及项…

MySQL基础(十七)触发器

在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如商品信息和库存信息分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加…

054、牛客网算法面试必刷TOP101--堆/栈/队列(230509)

文章目录 前言堆/栈/队列1、BM42 用两个栈实现队列2、BM43 包含min函数的栈3、BM44 有效括号序列4、BM45 滑动窗口的最大值5、BM46 最小的K个数6、BM47 寻找第K大7、BM48 数据流中的中位数8、BM49 表达式求值 其它1、se基础 前言 提示:这里可以添加本文要记录的大概…

内存安全:Arm 内存标记扩展如何应对业内安全挑战

作者:Arm 终端事业部安全和隐私战略总监卢旻盛 计算的未来将由我们日常生活各个方面的日益数字化所驱动,这也将导致软件和系统复杂性的不断增加。据相关数据报告称,2022 年报告的漏洞数量超过 23,000 个 (其中超过 17,000 个被归类为严重漏洞…

【IoT】<硬件产品经理进阶课> 正式在CSDN学院上线

目录 课程目录 适用人群 课程介绍 课程地址 课程目录 001-产品经理进阶:开课介绍 002-产品经理进阶:产品经理简介 003-产品经理进阶:产品经理所需具备的核心素质 004-产品经理进阶:产品经理的进阶路径 005-产品经理进阶&a…

fbx sdk的使用介绍

我们平时需要围绕fbx写一些小工具,虽说使用ascii格式的fbx可以直接进行字符串解析,并且网上也有一些基于ascii解析的开源库,但在制作一些通用的工具时,使用fbx sdk进行编写肯定是最好的。 1.下载fbx sdk和cmake 要用cmake生成vi…