特征工程--有序类别变量&单数值变量特征工程

简介: 特征工程--有序类别变量&单数值变量特征工程

有序类别特征

tt.png

有序类别特征,故名思意,就是有相对顺序的类别特征。例如:

  • 年龄段特征:"1-10,11-20,21-30,31-40"等年龄段;
  • 评分特征:"high,medium,low";

有序类别特征和无序的类别特征有些许区别,例如Label编码等,如果我们直接按照原先的LabelEncoder进行转化就会丢失特征相对大小的信息,这对于梯度提升树模型会带来负向的效果,因为序列信息可能和标签有着强烈的相关性,比如回购的问题,有“high,medium,low”三种评分,用户购物之后如果给商品打了“high“,那么他大概率还会回购,但是如果打了low,那么大概率是不会回购了,传统的LabelEncoder就直接丢失了这种信息,那么相较于无序类别特征的编码,有哪些变化呢?

  • Label编码 -> 字典编码
  • One-Hot编码 -> 很少不用
  • Frequency,Target,WOE,人工编码使用方式不变。

1.有序字典编码

有序字典编码,就是将特征中的每个字段按照相对大小构建字典,再进行转化。如下所示,我们假设:'high'>'medium'>'low',然后再进行映射。

1. from sklearn import preprocessing
2. import pandas as pd
3. df = pd.DataFrame({'ratings':['high','medium','low']})
4. le = preprocessing.LabelEncoder()
5. le.fit(df['ratings'].values)
6. df['traditional_encode'] = le.transform(df['ratings'].values) 
7. 
8. ratings_dic = {'low':0,'medium':1,'high':2}
9. df['selfdefined_encode'] = df['ratings'].map(ratings_dic).values
10. df
  ratings traditional_encode selfdefined_encode
0 high 0 2
1 medium 2 1
2 low 1 0

从上面简单的例子中,我们可以看出:

  • 无序类别特征的编码打乱了原始的内在顺序关系,可能增大梯度提升树模型训练的难度,而我们有序字典编码的方式则最大程度的保留了所有的信息。

tt.png

tt.png


1.分段编码

分段聚类编码也是一种分箱的策略,它主要基于数据的相对大小并结合业务背景知识对类别特征进行分段分组重新编码。举个简单但例子,我们现在需要预测学生的幸福指数,现在有一个类别特征:

  • 学籍特征:小学一年级,小学二年级,小学三年级,小学四年级,小学五年级,小学六年级,初中一年级,初中二年级,初中三年级,高中一年级,高中二年级,高中三年级,大学一年级,大学二年级,大学三年级,大学四年级

我们发现学籍特征是存在相对顺序的,也就是我们的有序类别特征;与此同时,我们知道,小学初中高中大学这几个阶段幸福的阶段都不一样,比如小学可能是小学壹年级最不开心,因为刚刚从幼儿园到一年级不适应造成;而小学初中高中大学在最后一个学年都会很不开心,因为那个时候压力最大,面临着人生的重要转折。所以这个时候,我们需要对特征进行分段编码,将学籍编码为小学,初中,高中,大学。还可以将各个不同阶段按照年级的大小进行分段,分为该阶段的高年级生,低年级生和中间年级的学生。

1. df = pd.DataFrame({'student_status':['小学一年级','小学二年级','小学三年级','小学四年级','小学五年级','小学六年级',\
2.                                      '初中一年级','初中二年级','初中三年级','高中一年级','高中二年级','高中三年级',\
3.                                      '大学一年级','大学二年级','大学三年级','大学四年级']})
4. le = preprocessing.LabelEncoder()
5. le.fit(df['student_status'].values)
6. df['traditional_encode'] = le.transform(df['student_status'].values) 
7. 
8. map_dic = ['小学一年级','小学二年级','小学三年级','小学四年级','小学五年级','小学六年级',\
9.                                      '初中一年级','初中二年级','初中三年级','高中一年级','高中二年级','高中三年级',\
10.                                      '大学一年级','大学二年级','大学三年级','大学四年级']
11. map_dic = {v:i for i,v in enumerate(map_dic)}
12. df['selfdefined_encode'] = df['student_status'].map(map_dic).values
13. df
  student_status traditional_encode selfdefined_encode
0 小学一年级 7 0
1 小学二年级 9 1
2 小学三年级 8 2
3 小学四年级 12 3
4 小学五年级 10 4
5 小学六年级 11 5
6 初中一年级 0 6
7 初中二年级 2 7
8 初中三年级 1 8
9 高中一年级 13 9
10 高中二年级 15 10
11 高中三年级 14 11
12 大学一年级 3 12
13 大学二年级 5 13
14 大学三年级 4 14
15 大学四年级 6 15
1. df['student_status_1st'] = df['student_status'].map(lambda x: x[:2])
2. map_dic = {'小学':0, '初中':1, '高中':2, '大学':3}
3. df['student_status_1st'] = df['student_status_1st'].map(map_dic).values
4. df
  student_status traditional_encode selfdefined_encode student_status_1st
0 小学一年级 7 0 0
1 小学二年级 9 1 0
2 小学三年级 8 2 0
3 小学四年级 12 3 0
4 小学五年级 10 4 0
5 小学六年级 11 5 0
6 初中一年级 0 6 1
7 初中二年级 2 7 1
8 初中三年级 1 8 1
9 高中一年级 13 9 2
10 高中二年级 15 10 2
11 高中三年级 14 11 2
12 大学一年级 3 12 3
13 大学二年级 5 13 3
14 大学三年级 4 14 3
15 大学四年级 6 15 3
1. map_dic = {'小学一年级':0,'小学二年级':0,'小学三年级':1,'小学四年级':1,'小学五年级':2,'小学六年级':2,\
2.                                      '初中一年级':0,'初中二年级':1,'初中三年级':2,'高中一年级':0,'高中二年级':1,'高中三年级':2,\
3.                                      '大学一年级':0,'大学二年级':1,'大学三年级':1,'大学四年级':2}
4.  
5. df['student_status_2nd'] = df['student_status'].map(map_dic).values
6. df
  student_status traditional_encode selfdefined_encode student_status_1st student_status_2nd
0 小学一年级 7 0 0 0
1 小学二年级 9 1 0 0
2 小学三年级 8 2 0 1
3 小学四年级 12 3 0 1
4 小学五年级 10 4 0 2
5 小学六年级 11 5 0 2
6 初中一年级 0 6 1 0
7 初中二年级 2 7 1 1
8 初中三年级 1 8 1 2
9 高中一年级 13 9 2 0
10 高中二年级 15 10 2 1
11 高中三年级 14 11 2 2
12 大学一年级 3 12 3 0
13 大学二年级 5 13 3 1
14 大学三年级 4 14 3 1
15 大学四年级 6 15 3 2

通过对学籍的转化,梯度提升树模型往往可以得到更好的效果。但这种特征很多时候需要有一定的业务背景才能挖掘到,不过有很多厉害但朋友也可以通过数据探索分析发现这种规律。

分段编码这种方式在数据竞赛中还是非常常见的,例如我们可以:

  • 将24小时分别编码为:上午,下午,晚上;
  • 将每个月分为月初,月中,月末等等;

基于转化之后的特征再与其它特征进行组合特征往往还能获得更多的提升。

tt.png

tt.png

3.小结

除了上面两个需要注意的情况之外,很多时候有序的类别特征在进行特征工程时和无序类别特征是类似的。

数值特征

tt.png

有序类别特征在编码之后可以认为是数值特征的一种特例。所以有序类别特征转化之后所采用的各种编码技巧,在数值特征同样适用,很多朋友会好奇,例如Frequency编码难道也可以在数值特征处适用?

  • 答案是:肯定的,而且很有意义。

比如说,用户消费,我们对用户的消费进行Frequency编码,发现某些数值的出现的次数特别多,例如100出现多次,该信息可能反映的就是用户经常去消费某类商品,这在没有其它额外辅助信息的情况是非常有帮助的。

其它的此处我们不再赘述。在单个数值特征模块,我们重点介绍数值特征的一些注意事项。

tt.png

tt.png

1.小数点之后的数值

 

很多数值特征是带有小数点的,而小数点之后的位数有些时候也能反映诸多信息,例如我们有:

  • 数值特征:10.12,10.123,10.02,10.2,10.222,10.45,100,10.23,......

tt.png

这个时候,小数点之后的长度可能就潜藏一些有意思的信息,对其长度进行统计则非常有意义。

tt.png

tt.png

tt.png

2.特殊数字

举个非常典型的案例,就是使用微信红包、微信转账等信息预测二人关系,

tt.png

tt.png

很明显,从这些特殊的数值中,我们就可以很好地预测出二人之间的关系很不一般,可能是情人,关于这些特殊数字的统计信息就能很好地反映此类信息。我们就可以单独做个二元特征来表示该笔转账是否为特殊转账。

tt.png

1. df = pd.DataFrame()
2. df['transaction'] = [100,20,1314,520,10,520,30]
3. df['is_special']  = df['transaction'].apply(lambda x: 1 if x in [520,1314] else 0)
4. df
  transaction is_special
0 100 0
1 20 0
2 1314 1
3 520 1
4 10 0
5 520 1
6 30 0

tt.png

tt.png

3.数值符号

其实数值的符号一般就两个,"+"和"-",最常见的就是银行卡里面的支出和收入。

  • “+“的次数就是收入的次数;“-“的次数就是支出的信息;

这些信息一般在和用户的ID等特征进行组合使用,发挥的价值可能会更大,这样我们就可以得到用户的支出次数和收入的次数等。

tt.png

tt.png

4.小结

关于数值特征,可以认为是编码之后的有序类别特征的扩展,所以所有在有序类别特征使用的策略在数值特征处也可以直接使用,但是因为很多时候数值特征是非常多的,如果作为单个类别特征统计信息不是很置信,往往需要进行分箱之后再当做类别特征处理效果更佳一些。除此之外,我们需要重点关注的就是符号、小数点前后的信息、特殊的数值这三点,很多时候,数值特征和其他特征的组合往往能带来巨大的提升,这些信息我们会在后面的特征工程处进行细致的介绍。

目录
相关文章
|
机器学习/深度学习 搜索推荐 算法
【王喆-推荐系统】模型篇-(task5)wide&deep模型
Wide&Deep是工业界中有巨大影响力的模型,如果直接翻译成中文是宽和深的模型,其模型结构如下所示:wide和deep让模型兼具逻辑回归和深度神经网络的特点。
1869 0
【王喆-推荐系统】模型篇-(task5)wide&deep模型
|
关系型数据库 MySQL 数据安全/隐私保护
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
|
7月前
|
安全 程序员 Windows
程序员必备工具:Xshell 7专业版安装与优化全攻略
Xshell 7 是一款由韩国 NetSarang 公司开发的终端模拟器,专为Windows系统设计,广泛用于远程连接和服务器管理。本文详细介绍其下载、安装流程及配置方法,包括界面语言设置、新建会话连接、高级功能如多窗口布局与脚本自动化,还提供了常见问题解答,帮助用户高效使用软件。
917 12
|
9月前
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
791 7
|
11月前
|
缓存 负载均衡 监控
微服务架构下的接口性能优化策略####
在当今快速迭代的软件开发领域,微服务架构以其灵活性和可扩展性成为众多企业的首选。然而,随着系统复杂性的增加,接口性能问题日益凸显,成为制约用户体验与系统稳定性的关键因素。本文旨在探讨微服务架构下接口性能优化的有效策略,通过具体案例分析,揭示从代码层面到系统架构层面的全方位优化路径,为开发者提供实战指南。 ####
|
机器学习/深度学习 数据采集 算法
特征工程与数据预处理全解析:基础技术和代码示例
在机器学习和数据科学的世界里,数据的质量是建模成功与否的关键所在。这就是特征工程和数据预处理发挥作用的地方。本文总结的这些关键步骤可以显著提高模型的性能,获得更准确的预测,我们将深入研究处理异常值、缺失值、编码、特征缩放和特征提取的各种技术。
342 0
|
8月前
|
人工智能 IDE 程序员
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
|
机器学习/深度学习 运维 大数据
【KDD2024】大数据基础工程技术集群异常检测论文入选
阿里云计算平台大数据基础工程技术团队主导,与浙江大学合作的论文《Cluster-Wide Task Slowdown Detection in Cloud System》被数据挖掘领域顶会ACM SIGKDD2024接收
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
智能化软件测试:AI驱动的自动化测试策略与实践####
本文深入探讨了人工智能(AI)在软件测试领域的创新应用,通过分析AI技术如何优化测试流程、提升测试效率及质量,阐述了智能化软件测试的核心价值。文章首先概述了传统软件测试面临的挑战,随后详细介绍了AI驱动的自动化测试工具与框架,包括自然语言处理(NLP)、机器学习(ML)算法在缺陷预测、测试用例生成及自动化回归测试中的应用实例。最后,文章展望了智能化软件测试的未来发展趋势,强调了持续学习与适应能力对于保持测试策略有效性的重要性。 ####
|
Prometheus 监控 Cloud Native
实时计算 Flink版产品使用问题之怎么关闭HDFS的Web界面
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。