编码方式_机器学习中常用的编码方式

在机器学习建模中,非数值或非连续分类特征需要编码。sklearn的LabelEncoder用于不连续数值,OneHotEncoder将分类特征转换为二值表示,避免数值影响权重计算。CountEncoding用类别出现次数替换类别,而TargetEncoding则用类别对应的target后验概率编码。这些方法有助于优化模型性能。
摘要由CSDN通过智能技术生成

在建模的时候,有时各个feature不是数值型或者连续数值分类,这种情况下需要对这些特征值进行编码,sklearn中提供了多种编码方法。

1.  LabelEncoder 

LabelEncoder可以对不连续的数值编码,例如:

from sklearn import preprocessing
encode = preprocessing.LabelEncoder()
test = [1,2,3,2,5]
encode.fit(test)
encode.transform(test)

返回:

 array([0, 1, 2, 1, 3])

对文本编码:

from sklearn import preprocessing
encode = preprocessing.LabelEncoder()
test = ['peking', 'shanghai', 'peking']
encode.fit(test)
encode.transform(test)

返回:

array([0, 1, 0])

 2.  OneHotEncoder 

对于有的数据,如果我们简单的用数值替换,这些数值大小会影响到权重矩阵的计算。其中一个解决方法就是采用OneHotEncoder,这种表示方式将每一个分类特征变量可能的取值转变成m个二值特征,对于每一条数据这m个值中仅有一个特征值为1,其他的都为0。比如:

from sklearn.preprocessing import OneHotEncoder

 data = [['peking',40],
        ['shanghai',22],
        ['peking',50]]

data = pd.DataFrame(data,columns=['city','number'])

# 先转为数值型
uniq_type = data['city'].unique()
for j in range(len(uniq_type)):
    data['city'] = data['city'].apply(lambda x:j if x==uniq_type[j] else x)

data2 = data[['city']]
encode2 = OneHotEncoder()
encode2.fit(data2)
encode2.transform(data2).toarray()

返回:

array([[1., 0.],

       [0., 1.],

       [1., 0.]])

这样将第一列分类特征变成了两列。效果类似于:

73bc44dc484555441f486af85bd67a66.png

 3.  CountEncoder 

Count encoding是将分类特征替换为它们的出现次数,比如某个分类中'Peking'出现了10次,那么'Peking'就会被替换为10. 我们可以用`categorical-encodings`包中的`CountEncoder`实现。

import category_encoders as ce
features = ['Peking', 'Peking', 'Shanghai', 'Peking', 'Guangzhou', 'Shanghai']
count_enc = ce.CountEncoder()
count_enc.fit_transform(features)

返回(第一列是索引):

0  3

1  3

2  2

3  3

4  1

5  2

4.  TargetEncoder 

Target encoding其实就是将分类特征替换为对应目标值的后验概率。比如以下例子:

26297f72143ea0ce186a19cd39fa5774.png

第三列编码值的计算过程其实很简单,比如说cat出现次数是5次,5次中target是1的次数有2次,因为编码值为0.4 。

744100a8168a78e38ba17e21cfe387a6.png

import pandas as pd
from category_encoders import TargetEncoder

encoder = TargetEncoder()
df['Encoded Animal '] = encoder.fit_transform(df['Animal'], df['Target'])

参考:https://medium.com/analytics-vidhya/target-encoding-vs-one-hot-encoding-with-simple-examples-276a7e7b3e64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值