数据预处理:分类变量实体嵌入做特征提取

实体嵌入(embedding)目的将表格数据中的分类属性(一个至多个)向量化。

1.实体嵌入简介:

  • 实体嵌入是主要应用于深度学习中处理表格分类数据的一种技术,或者更确切地说NLP领域最为火爆,word2vec就是在做word的embedding。
  • 神经网络相比于当下的流行的xgboost、LGBM等树模型并不能很好地直接处理大量分类水平的分类特征。因为神经网络要求输入的分类数据进行one-hot处理。当分类特征的水平很高的时候,one-hot经常带来维度爆炸问题,紧接着就是参数爆炸,局部极小值点更多,更容易产生过拟合等等一系列问题。
  • 实体嵌入是从降维这一角度来考虑改善这些问题的。它通过将分类属性放入网络的全连接层的输入单元中,后接几个单元数较输入层更少的隐藏层(连续型变量直接接入第一个隐藏层),经过神经网络训练后输出第一个隐藏层中分类变量关联的隐层单元,作为提取的特征,用于各种模型的输入。

2.用实体嵌入做特征提取的网络结构(示例)

(暂略)

3.实体嵌入代码(示例)

  1   2   3 import math
  4 import random as rn
  5 import numpy as np
  6 from keras.models import Model
  7 from keras.layers import Input, Dense, Concatenate, Reshape, Dropout
  8 from keras.layers.embeddings import Embedding
  9  10
 11 #传入分类变量数据(没有one-hot)和连续变量数据,返回一个model对象(它根据数据的组成定义好了网络框架类,这个类之后可以调用,喂入数据训练)
 12 def build_embedding_network(category_data, continus_data):
 13
 14     #获取分类变量的名称
 15     cat_cols = [x for x in category_data.columns]
 16
 17     #以字典形式存储分类变量的{名称:维度}
 18     category_origin_dimension = [math.ceil(category_data[cat_col].drop_duplicates().size) for cat_col in cat_cols]
 19
 20     #以字典形式存储分类变量 计划 在embed后的{名称:维度}
 21     category_embedding_dimension = [math.ceil(math.sqrt(category_data[cat_col].drop_duplicates().size)) for cat_col in cat_cols]
 22
 23     # 以网络结构embeddding层在前,dense层(全连接)在后;2.训练集的X必须以分类特征在前,连续特征在后。
 24     inputs = []
 25     embeddings = [] #嵌入层用list组织数据
 26
 27     #对于每一个分类变量,执行以下操作
 28     for cat_val, cat_origin_dim, cat_embed_dim in list(zip(cat_cols, category_origin_dimension, category_embedding_dimension)) :
 29
 30         # 实例化输入数据的张量对象
 31         input_cate_feature = Input(shape=(1,)) #batch_size, 空(维度)
 32
 33         #实例化embed层的节点:定义输入的维度(某个分类变量的onehot维度),输出的维度(其embed后的维度),同时传入input数据对象
 34         embedding = Embedding(input_dim = cat_origin_dim,
 35                               output_dim = cat_embed_dim,
 36                               input_length=1)(input_cate_feature)
 37
 38         # 将embed层输出的形状调整
 39         embedding = Reshape(target_shape=(cat_embed_dim,))(embedding)
 40
 41         #每遍历一个分类变量就将输入数据添加在inputs对象中
 42         inputs.append(input_cate_feature)
 43
 44         #每遍历一个分类变量就扩展一个embedding层的节点
 45         embeddings.append(embedding)
 46
 47     #dda于连续特征执行以下操作:
 48
 49     #获取连续特征的变量个数
 50     cnt_val_num = continus_data.shape[1]
 51     #连续特征原封原样迭代地加入与分类变量embedding后的输出组合在一起(没有embedding操作)
 52     for cnt_val_num in range(cnt_val_num) :
 53         input_numeric_features = Input(shape=(1,))
 54
 55         #输入的连续型数据不经过任何一种激活函数处理直接 与embed + reshape后的分类变量进行组合
 56         embedding_numeric_features = Dense(units = 16)(input_numeric_features)
 57         inputs.append(input_numeric_features)
 58         embeddings.append(embedding_numeric_features)
 59
 60     #把有不同输入的embedding 层的数据链接在一起
 61     x = Concatenate()(embeddings) #这种写法表明concatenate返回的是一个函数,第二个括号是传入这个返回的函数的参数
 62
 63     x = Dense(units = 16, activation=‘relu‘)(x)
 64
 65     #丢弃15%的节点
 66     x = Dropout( 0.15 )(x)
 67
 68     #输出层包含一个节点,激活函数是relu
 69     output = Dense(1, activation=‘relu‘)(x)
 70     model = Model(inputs, output)
 71     model.compile(loss=‘mean_squared_error‘, optimizer=‘adam‘)
 72
 73     return model
 74
 75
 76 # 训练
 77 NN = build_embedding_network(category_features_in_trainset, continus_features_in_trainset )
 78 NN.fit(X, y_train, epochs=3, batch_size=40, verbose=0)
 79
 80 #读取embedding层数据
 81 cate_feature_num = category_features_in_trainset.columns.size
 82
 83 model = NN  # 创建原始模型
 84 for i in range(cate_feature_num):
 85     # 如果把类别特征放前,连续特征放后,cate_feature_num+i就是所有embedding层
 86     layer_name = NN.get_config()[‘layers‘][cate_feature_num+i][‘name‘]
 87
 88     intermediate_layer_model = Model(inputs=NN.input,
 89                                      outputs=model.get_layer(layer_name).output)
 90
 91     # numpy.array
 92     intermediate_output = intermediate_layer_model.predict(X)
 93
 94 intermediate_output.resize([train_data.shape[0],cate_embedding_dimension[i][1]])
 95
 96     if i == 0: #将第一个输出赋值给X_embedding_trans,后续叠加在该对象后面
 97         X_embedding_trans = intermediate_output
 98     else:
 99         X_embedding_trans = np.hstack((X_embedding_trans,intermediate_output)) #水平拼接
100
101
102 #显示分类变量向量化后的数据
103 X_embedding_trans

4.个人观点

高levels的分类变量而言,多是用户ID、地址、名字等。变量如‘地址’可以通过概念分层的办法获取省、市之类的维度较少的特征;‘商品’也可以通过概念分层获取其更泛化的类别,但是这种操作实质是在平滑数据,很可能淹没掉有用的信息。我可能不会选择这种方式来建立预测模型(做细分统计、透视图的时候会经常使用到)。也有的人会不用这些分类变量,但是我觉得会损失一些有用的影响因素,所以最好物尽其用。

实体嵌入跟word2vector一样会让output相似的对象在隐藏层中的数值也相近。使用低纬度、连续型变量的数据训练模型,效果也会比用高维、稀疏的数据训练好得多。

这种针对分类变量特征提取的方法对于提升预测准确率来说是很有效的,跟模型堆叠一样有效。

原文地址:https://www.cnblogs.com/mx0813/p/12635378.html

时间: 2024-08-03 15:48:34

数据预处理:分类变量实体嵌入做特征提取的相关文章

特征提取(机器学习数据预处理)

特征提取(机器学习数据预处理) 特征提取与特征选择都是数据降维的技术,不过二者有着本质上的区别:特征选择能够保持数据的原始特征,最终得到的降维数据其实是原数据集的一个子集:而特征提取会通过数据转换或数据映射得到一个新的特征空间,尽管新的特征空间是在原特征基础上得来的,但是凭借人眼观察可能看不出新数据集与原始数据集之间的关联. 这里介绍2种常见的特征提取技术: 1)主成分分析(PCA) 2)线性判别分析(LDA) 1.主成分分析(PCA) 一种无监督的数据压缩,数据提取技术,通常用于提高计算效率,

数据预处理(完整步骤)

原文:http://dataunion.org/5009.html 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库需要对高质量的数据进行一致地集成)(3)原始数据中存在的问题:不一致 —— 数据内含出现不一致情况重复不完整 —— 感兴趣的属性没有含噪声 —— 数据中存在着错误.或异常(偏离期望值)的数据高维度二:数据预处理的方法(1)数据清洗 —— 去噪声和无关数据(2)数

《数据挖掘概念与技术》--第三章 数据预处理

一.数据预处理 1.数据如果能够满足其应用的要求,那么他是高质量的. 数据质量涉及许多因素:准确性.完整性.一致性.时效性.可信性.可解释性. 2.数据预处理的主要任务:数据清洗.数据集成.数据规约.数据变换. 二.数据清理:试图填充缺失值,光滑噪声.识别利群点.纠正数据中的不一致. 1.缺失值的处理: 1)忽略元组:缺少类标号时通常这么做.但是忽略的元组其他属性也不能用,即便是有用的. 2)人工填写:该方法很费事费时,数据集很大.缺失值很多时可能行不通. 3)使用一个全局常量填充缺失值:将缺失

第4章 数据预处理

目录 4.1 数据清洗 4.1.1 缺失值处理 4.1.2 异常值处理 4.2 数据集成 4.2.1 实体识别 4.2.2 冗余属性识别 4.3 数据变换 4.3.1 简单函数变换 4.3.2 规范化 4.3.3 连续属性离散化 4.3.4 属性构造 4.3.5 小波变换 4.4 数据规约 4..4.1 属性规约 4.4.2  数值规约 4.1 数据清洗 主要是删除原始数据集中的无关数据.重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值.异常值等. 4.1.1 缺失值处理 处理缺失

大数据预处理技术

一.大数据预处理的几个步骤 1.数据预处理 2.数据清洗 3.数据集成 4.数据归约 5.数据变换 6.数据离散化 7.大数据预处理 二.数据预处理 现实中的数据大多是“脏”数据: ①不完整 缺少属性值或仅仅包含聚集数据 ②含噪声 包含错误或存在偏离期望的离群值 比如:salary=“-10”,明显是错误数据 ③不一致 用于商品分类的部门编码存在差异 比如age=“42”Birthday=“03/07/1997” 而我们在使用数据过程中对数据有如下要求: 一致性.准确性.完整性.时效性.可信性.

数据预处理(数据的操作2)

2.常用数据预处理方法 这个部分总结的是在Python中常见的数据预处理方法. 2.1标准化(Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值,单位方差.也叫z-score规范化(零均值规范化).计算方式是将特征值减去均值,除以标准差. sklearn.preprocessing.scale(X) 一般会把train和test集放在一起做标准化,或者在train集上做标准化后,用同样的标准化去标准化test集,此时

数据预处理与特征选择

数据预处理和特征选择是数据挖掘与机器学习中关注的重要问题,坊间常说:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.特征工程就是将原始数据转化为有用的特征,更好的表示预测模型处理的实际问题,提升对于未知数据的预测准确性.下图给出了特征工程包含的内容: 本文数据预处理与特征选择的代码均采用sklearn所提供的方法,并使用sklearn中的IRIS(鸢尾花)数据集来对特征处理功能进行说明,IRIS数据集由Fisher在1936年整理,包含4个特征:Sepal.Length(花萼长

python数据分析入门——数据导入数据预处理基本操作

数据导入到python环境:http://pandas.pydata.org/pandas-docs/stable/io.html(英文版) IO Tools (Text, CSV, HDF5, ...)? The pandas I/O API is a set of top level reader functions accessed like pd.read_csv() that generally return a pandasobject. read_csv read_excel re

用scikit做特征提取

现实世界中多数特征都不是连续变量,比如分类.文字.图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. 1.分类变量的特征提取 比如城市作为一个特征,那么就是一系列散列的城市标记,这类特征我们用二进制编码来表示,是这个城市为1,不是这个城市为0 比如有三个城市:北京.天津.上海,我们用scikit-learn的DictVector做特征提取,如下: from sklearn.feature_extraction import DictVectorizer one