参考:An Overview of Encoding Techniques | Kaggle

Method 1: Label encoding 

给每个类别以一个数字label,作为分类。将类别映射到自然数数值空间上

from sklearn.preprocessing import LabelEncoder
train=pd.DataFrame()
label=LabelEncoder()
for c in X.columns:
if(X[c].dtype=='object'):
train[c]=label.fit_transform(X[c])
else:
train[c]=X[c]

Method 2 : One hot encoding 

即独热码,每一个category对应特征向量中的一位,对应位置是否为1判定是否为该类。

可以使用pd.get_dummies()或sklearn.preprocessing中OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
one=OneHotEncoder(
one.fit(X)
train=one.transform(X)

Method 3 : Feature Hashing/Hashing Trick

一个“one hot encoding style” 的编码方式,将数据编入特定维数的散度矩阵中,降维中使用了hash方法。

from sklearn.feature_extraction import FeatureHasher
X_train_hash=X.copy()
for c in X.columns:
X_train_hash[c]=X[c].astype('str')
hashing=FeatureHasher(input_type='string')
train=hashing.transform(X_train_hash.values)

Method 4 :Encoding categories with dataset statistics

尝试为模型提供较低维的每个类别的表示,且其中类似的类别的表示相近。 最简单的方法是将每个类别替换为我们在数据集中看到它的次数,即用出现频率作为他们的embedding。

X_train_stat=X.copy()
for c in X_train_stat.columns:
if(X_train_stat[c].dtype=='object'):
X_train_stat[c]=X_train_stat[c].astype('category')
counts=X_train_stat[c].value_counts()
counts=counts.sort_index()
counts=counts.fillna(0)
counts += np.random.rand(len(counts))/1000
X_train_stat[c].cat.categories=counts

对于循环出现的特征,例如日期,星期等,常用sin\cos将其转为二维空间中的数据。这是基于“循环”的性质,类似于对圆进行分割。

X_train_cyclic=X.copy()
columns=['day','month']
for col in columns:
X_train_cyclic[col+'_sin']=np.sin((2*np.pi*X_train_cyclic[col])/max(X_train_cyclic[col]))
X_train_cyclic[col+'_cos']=np.cos((2*np.pi*X_train_cyclic[col])/max(X_train_cyclic[col]))
X_train_cyclic=X_train_cyclic.drop(columns,axis=1)
one=OneHotEncoder()
one.fit(X_train_cyclic)
train=one.transform(X_train_cyclic)

Method 5 : Target encoding 

Target encoding 通过目标数据对类别变量进行编码,使用目标对应概率或平均概率替换该类别,即出现频次相近的被视为同一类(大城市,热门项等)。这个方法比较依赖训练集与测试集合的分布,要求他们数据分布一致。另外,这种方法可能会导致过拟合。

                     

X_target=df_train.copy()
X_target['day']=X_target['day'].astype('object')
X_target['month']=X_target['month'].astype('object')
for col in X_target.columns:
if (X_target[col].dtype=='object'):
target= dict ( X_target.groupby(col)['target'].agg('sum')/X_target.groupby(col)['target'].agg('count'))
X_target[col]=X_target[col].replace(target).values

为了减轻过拟合可能带来的影响,可以使用K-Fold Validation ,每次对一份样本进行目标编码时,使用的都是其他K-1份数据之中的数据。

X['target']=y
cols=X.drop(['target','id'],axis=1).columns
%%time
X_fold=X.copy()
X_fold[['ord_0','day','month']]=X_fold[['ord_0','day','month']].astype('object')
X_fold[['bin_3','bin_4']]=X_fold[['bin_3','bin_4']].replace({'Y':1,'N':0,'T':1,"F":0})
kf = KFold(n_splits = 5, shuffle = False, random_state=2019)
for train_ind,val_ind in kf.split(X):
for col in cols:
if(X_fold[col].dtype=='object'):
replaced=dict(X.iloc[train_ind][[col,'target']].groupby(col)['target'].mean())
X_fold.loc[val_ind,col]=X_fold.iloc[val_ind][col].replace(replaced).values

此外,在对特征进行编码前也需要进行特征种类的区分。常分为:

  • 0-1数值:只有两种取值,可映射到0,1
  • 类别数值:多个类别,这也是最常见的数据。
  • 时序数据:时间戳等,隐含了顺序信息,可以反应趋势。

[特征工程] encoding的更多相关文章

  1. 机器学习-特征工程-Missing value和Category encoding

    好了,大家现在进入到机器学习中的一块核心部分了,那就是特征工程,洋文叫做Feature Engineering.实际在机器学习的应用中,真正用于算法的结构分析和部署的工作只占很少的一部分,相反,用于特 ...

  2. 特征工程(Feature Engineering)

    一.什么是特征工程? "Feature engineering is the process of transforming raw data into features that bett ...

  3. 机器学习-特征工程-Feature generation 和 Feature selection

    概述:上节咱们说了特征工程是机器学习的一个核心内容.然后咱们已经学习了特征工程中的基础内容,分别是missing value handling和categorical data encoding的一些 ...

  4. 【Python数据挖掘】第六篇--特征工程

    一.Standardization 方法一:StandardScaler from sklearn.preprocessing import StandardScaler sds = Standard ...

  5. AI学习笔记:特征工程

    一.概述 Andrew Ng:Coming up with features is difficult, time-consuming, requires expert knowledge. &quo ...

  6. Alink漫谈(十) :特征工程 之 特征哈希/标准化缩放

    Alink漫谈(十) :特征工程之特征哈希/标准化缩放 目录 Alink漫谈(十) :特征工程之特征哈希/标准化缩放 0x00 摘要 0x01 相关概念 1.1 特征工程 1.2 特征缩放(Scali ...

  7. 使用sklearn做单机特征工程

    目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...

  8. 特征工程(Feature Enginnering)学习记要

     最近学习特征工程(Feature Enginnering)的相关技术,主要包含两块:特征选取(Feature Selection)和特征抓取(Feature Extraction).这里记录一些要点 ...

  9. 【转】使用sklearn做单机特征工程

    这里是原文 说明:这是我用Markdown编辑的第一篇随笔 目录 1 特征工程是什么? 2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 无量纲化与正则化的区别 ...

随机推荐

  1. 一个开源的C#和cefsharp项目:逐浪字体大师pc版上线(附源码开源)

    z01逐浪字体大师,是一款基于C#和web引擎开发的字体设计软件,可以打开直接写字,也可以链接官方资源 ,附Github开源库,欢迎大家下载.客户端技术是基于wpf设计的,整个界面精美,与逐浪CMS技 ...

  2. Mac 下安装 MySQL 步骤

    安装 MySQL Mac 下安装MySQL推荐去官网下载dmg 版本的,我使用的版本是5.7.30. 如上图所示. 之后就是傻瓜式一键狂点不过需要注意的是,不要关闭下图所示的框框!不要关闭下图所示的框 ...

  3. scrapy获取当当网多页的获取

    结合上节,网多页的获取只需要修改 dang.py import scrapy from scrapy_dangdang.items import ScrapyDangdang095Item class ...

  4. 手把手教你学Dapr - 9. 可观测性

    目录 手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须知道的概念 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 手把手教你学Dapr ...

  5. Linux 软连接与硬连接 区别

    先说结论 软连接相当于快捷方式,访问软连接会被替换为其指向的绝对路径,如果其指向的文件被删除,则无法访问. 硬连接相当于指针,与它指向的文件都指向相同的inode,当其指向的文件被删除,inode由于 ...

  6. [cf1444D]Rectangular Polyline

    由于两种线段要交替出现,有解的必要条件即为$h=v$(以下均记为$n$) 进一步的,再假设两种线段依次对应于向量$(a_{i},0)$和$(0,b_{i})$,根据题意要求向量长度为给定值且和为0,那 ...

  7. lilypond进阶——用scheme修改乐谱细节

    lilypond对乐谱内容的修改非常自由,用户可以自由根据需要做调整 调整一般都是用\override的命令,但是会比较冗长,码代码的时候比较麻烦 重新设置一个函数来概括命令,调用的时候使用的代码更短 ...

  8. vcstool是什么?

    为什么会去了解vcstool,在想要手动编译并且获取ROS源码的时候,有一个Get ROS 2 code的章节中使用到了这个工具. mkdir -p ~/ros2_foxy/src cd ~/ros2 ...

  9. CF814E An unavoidable detour for home

    考虑有每个最短路只有一条. 那么我们建出最短路树后,显然所有的非树边都是同层之间的横叉边. 那么我们考虑设\(f(i,j,k,z)\)为我们考虑到了第\(i\)个点,此时他被我们分配到了\(p\)层, ...

  10. Python使用print打印时,展示内容不换行

    原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...