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

文章介绍了在广告点击预估问题中,如何通过特征交叉创建二阶特征,如English_video。使用编码方法如独热编码后,进行特征交叉得到新的向量。然而,这种方法可能导致维度爆炸,因此提出使用特征哈希进行降维,以减少模型复杂度并避免信息损失。特征哈希将原始特征映射到固定大小的哈希空间,以解决维度爆炸问题,但可能产生哈希冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

假设现在样本中语言特征取值为"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。
哈希函数是随机的,因此在同一个哈希表中,相同的特征值可能被映射到不同的桶中,从而得到不同的哈希特征向量。

以上。

### 信息测度在纹理特征提取中的方法与应用 #### 背景介绍 信息测度是一种衡量数据不确定性或复杂性的工具,在图像处理领域常用于量化纹理特征。通过特定的信息测度算法,可以从复杂的图像中提取出有意义的纹理特征参数[^1]。 #### 基于灰度共生矩阵(GLCM)的信息测度 灰度共生矩阵是一种经典的纹理分析方法,能够反映图像中像素之间的空间关系和灰度分布特性。通过对共生矩阵进行统计计算,可以获得一系列信息测度指标,这些指标可用于描述图像的纹理属性[^4]: - **能量**:也称为角二阶矩,反映了图像纹理的一致性程度。较高的能量值意味着图像具有更一致的纹理。 - **熵**:用来测量图像的随机性和复杂性。高熵表明图像中含有更多的细节和噪声。 - **对比度**:体现了图像局部变化的程度。较大的对比度通常对应着更强的边缘结构。 - **相关性**:评估两个方向间像素强度的相关程度。该值接近±1时表示强正负关联,而接近0则表示无明显关联。 - **均匀性**:又称逆差分矩,表征了共生矩阵元素分布的集中趋势。越高的均匀性说明矩阵内的非零元更加聚集在一起。 上述每项统计量都可以视为一种独立的信息测度,它们共同构成了全面刻画图像纹理特性的多维向量。 #### 局部二值模式(LBP) 除了传统的灰度共生矩阵外,另一种广泛应用于实际场景的技术是局部二值模式 (Local Binary Patterns)[^3]。此方法利用简单高效的阈值化操作捕获局部区域内的微细结构差异,并进一步扩展到旋转不变形式以增强鲁棒性。相比起 GLCM 手动设计的距离参数 d 和角度 θ ,LBP 更加灵活且易于实现自动化调整优化过程。 #### 实际应用场景举例 以下是几个典型的应用案例展示信息测度如何助力解决现实世界中的问题: 1. **医学影像诊断**: 利用 CT 或 MRI 数据集训练模型识别病变组织类型时,借助恰当选取后的多个组合型信息测度可有效提升分类精度; 2. **遥感数据分析**: 面对海量卫星图片资源库检索相似地貌单元任务需求下,采用综合考虑不同尺度层面下的多层次信息测度有助于提高匹配效率; 3. **工业产品质量监控**: 自动检测流水线上产品表面是否存在瑕疵缺陷过程中引入基于信息测度理论指导开发的新一代视觉传感设备方案能大幅降低误报率并节约成本开支。 ```python import numpy as np from skimage.feature import greycomatrix, greycoprops # 创建一个简单的示例数组 image = np.array([[0, 0, 1, 1], [0, 0, 1, 1], [0, 2, 2, 2], [2, 2, 3, 3]], dtype=np.uint8) # 计算灰度共生矩阵 glcm = greycomatrix(image, distances=[1], angles=[0], levels=4, symmetric=True, normed=True) # 提取信息测度 contrast = greycoprops(glcm, 'contrast')[0][0] energy = greycoprops(glcm, 'energy')[0][0] correlation = greycoprops(glcm, 'correlation')[0][0] print(f"Contrast: {contrast}, Energy: {energy}, Correlation: {correlation}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值