特征工程中对高基数类别特征的一种处理方法:特征哈希(FeatureHasher)

本文主要是介绍特征工程中对高基数类别特征的一种处理方法:特征哈希(FeatureHasher),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在数据挖掘的项目中经常会遇到一类尴尬的特征:高基数类别特征。那么什么是高基数类别特征呢?举个例子,比如像邮编、街道、产品货号等表示类别的特征,它们的基数很大,可能会有数十甚至数百个属性值。对于这种高基数类别特征确实有种“弃之可惜,食之无味”的尴尬。

如果用独热编码的话,对于这种高基数类别特征会产生出数十甚至数百个新特征,造成一个新的问题:特征冗余或维度爆炸。当然根据具体的业务场景可能会存在比较好的方法从这类特征中提取有效的新特征,比如取字段有类别规律的前几位或者后几位。而本文介绍的是一种面对高基数类别特征的普适性方法:特征哈希(FeatureHasher)。目前这只是本人的一种想法,具体效果如何还需要在实际项目中验证。

如果说独热编码后新生成的特征数量会跟随类别数量而变化,那么FeatureHasher的方法所新生成的特征数量是可以人为给定的。这样在特征冗余或维度爆炸问题上就不必担心了。个人感觉FeatureHasher有点像word2vec,都是将新特征压缩到一个给定的维度。

那么接下来通过代码介绍一下如何使用FeatureHasher。首先要从scikit-learn中导入:

import numpy as np
import pandas as pd
import random
from sklearn.feature_extraction import FeatureHasher

创建一个数据集,含有年龄与城市两个特征,可以看到城市这个特征的属性数量有10个。

city = ['北京', '上海', '成都', '深圳', '广州', '杭州', '天津', '苏州', '武汉', '西安']data = pd.DataFrame({'age': np.random.randint(0, 70, size=500),'city': random.choices(city, k=500)})
data.head()

data.city.value_counts()

如果用独热编码来处理的话会产生10个新特征。那么如果类别属性有上百种,并且分布比较平均那么直接用独热编码就会造成特征冗余或维度爆炸的问题。

dummy_data = pd.get_dummies(data, prefix='city')
dummy_data.head()

尝试FeatureHasher的方法,指定新生成的维度为2:

fea_hs = FeatureHasher(n_features=2, input_type='string')
hasherd = fea_hs.fit_transform(data.city)
print(hasherd.toarray().shape)

hash_data = pd.DataFrame(hasherd.toarray(), columns=[f'city_{i}' for i in range(2)])hasher_data = pd.concat([data, hash_data], axis=1, ignore_index=False)
hasher_data.head(10)

这样就将原本基数很大的特征映射到了较低的维度中。

这篇关于特征工程中对高基数类别特征的一种处理方法:特征哈希(FeatureHasher)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532480

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer