LabelEncoder与OneHotEncoder

在处理真实的数据集的时候,我们经常会遇见一个或多个的类别数据的特征。类别数据可以被分为标称特征(nominal feature)和有序特征(ordinal feature)。有序特征指的是类别的值是有序的或者是可以排序的,例如,衣服的尺码S、M、X、XL、XXL...就是属于有序特征。再例如,衣服的颜色,黑色、蓝色、白色、黄色...这些就属于标称特征

一、有序特征的映射

我们可以将有序特征装换成为整数,整数包含一定的顺序。没有一个合适的方法可以自动将尺寸特征转换成为正确的顺序,所以我们需要手动来指定相应的映射关系。例如,S:1,M:2,X:3,我们可以利用pandas的map方法来实现

import pandas as pd
 
if __name__ == "__main__":
    #定义衣服尺寸的映射关系
    size_mapping = {"S":1,"M":2,"X":3,"XL":4}
    #定义一个DataFrame数据
    data = pd.DataFrame([
        ["green","S",100],
        ["blue", "M", 110],
        ["red", "X", 120],
        ["black", "XL", 130]
    ])
    #设置列名
    data.columns = ["color","size","price"]
    #对size列的类别数据进行映射
    data["size"] = data["size"].map(size_mapping)
    print(data)

二、类标的编码

许多的机器学习算法都要求将类标换成整数值来进行处理。对于类标进行编码与之前对于有序特征的映射有所不同,类标并不要求是有序的,对于特定的字符串类标赋予哪个整数值给它对于我们来说并不重要,所以在对于类标进行编码的时候我们可以使用枚举的方式从0开始设定类标。

import pandas as pd
import numpy as np
 
if __name__ == "__main__":
    # 定义一个DataFrame数据
    data = pd.DataFrame([
        ["green", "S", 100,"label1"],
        ["blue", "M", 110,"label2"],
        ["red", "X", 120,"label3"],
        ["black", "XL", 130,"label4"]
    ])
    # 设置列名
    data.columns = ["color", "size", "price","label"]
    #通过枚举获取类标与整数之间的映射关系
    label_mapping = {label:idx for idx,label in enumerate(np.unique(data["label"]))}
    print(label_mapping)
    #对label列进行映射
    data["label"] = data["label"].map(label_mapping)
    print(data)

通过下面的方法可以将整数类标还原为字符串

 inv_label_mapping = {v:k for k,v in label_mapping.items()}
    data["label"] = data["label"].map(inv_label_mapping)
    print(data)


还可以通过sklearn的LabelEncoder类来实现类标的编码

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
 
if __name__ == "__main__":
    # 定义一个DataFrame数据
    data = pd.DataFrame([
        ["green", "S", 100,"label1"],
        ["blue", "M", 110,"label2"],
        ["red", "X", 120,"label3"],
        ["black", "XL", 130,"label4"]
    ])
    # 设置列名
    data.columns = ["color", "size", "price","label"]
    class_label = LabelEncoder()
    data["label"] = class_label.fit_transform(data["label"].values)
    print(data)


通过sklearn的inverse_transform方法可以将整数类标还原为原始的字符串

  

  data["label"] = class_label.inverse_transform(data["label"])
    print(data)


三、标称特征上的独热编码(one-hot encoding)
我们对上面衣服的颜色特征进行编码,将颜色映射为{"green":0,"blue":1,"red":2,"black":3}。看起来这样映射好像没什么问题,真的没有问题吗?实则不然,我们这样映射实际上给颜色强加了一个大小关系,即black>red>blue>green,实际上颜色是不存在这种关系的,很显然结果肯定也不是最优的。这时,我们可以通过独热编码(one-hot encoding)来解决这一类问题。独热编码是通过创建一个新的虚拟特征,虚拟特征的每一列各代表标称数据的一个值。例如,颜色一共有四个取值green、blue、red、black,独热编码是通过四位二进制来表示,如果是green就表示为[1,0,0,0],对应的颜色是[green,blue,red,black],如果属于哪一种颜色,则取值为1,否则为0。

使用sklearn的OneHotEncoder实现OneHot编码

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
 
if __name__ == "__main__":
    # 定义一个DataFrame数据
    data = pd.DataFrame([
        ["green", "S", 100, "label1"],
        ["blue", "M", 110, "label2"],
        ["red", "X", 120, "label3"],
        ["black", "XL", 130, "label4"]
    ])
    # 设置列名
    data.columns = ["color", "size", "price", "label"]
    X = data[["color", "price"]].values
    #通过类标编码将颜色装换成为整数
    color_label = LabelEncoder()
    X[:,0] = color_label.fit_transform(X[:,0])
    print(X)
    #设置颜色列使用oneHot编码  参数categorical_fratures表示编码的列 可以设为[0][1][0,1]
    one_hot = OneHotEncoder(categorical_features=[0])
    print(one_hot.fit_transform(X).toarray())


注意:在使用OneHotEncoder进行OneHot编码的时候,需要先将字符串转换成为整数之后才能进行OneHot编码,不然会报错。

使用pandas来实现oneHot编码

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
 
if __name__ == "__main__":
    # 定义一个DataFrame数据
    data = pd.DataFrame([
        ["green", "S", 100, "label1"],
        ["blue", "M", 110, "label2"],
        ["red", "X", 120, "label3"],
        ["black", "XL", 130, "label4"]
    ])
    # 设置列名
    data.columns = ["color", "size", "price", "label"]
    X = data[["color", "price"]].values
    #pandas的get_dummies方法只对字符串列进行转换,其他的列保持不变
    print(pd.get_dummies(data[["color","price"]]))


原文:https://blog.csdn.net/sinat_29957455/article/details/79452141

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值