机器学习入门-数据预处理-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码)

Posted my-love-is-python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习入门-数据预处理-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码) 相关的知识,希望对你有一定的参考价值。

1.LabelEncoder() # 用于构建数字编码

2 .map(dict_map)  根据dict_map字典进行数字编码的映射

3.OnehotEncoder()  # 进行one-hot编码,输入的参数必须是二维的,因此需要做reshape,同时使用toarray() 转换为列表形式

3  pd.get_dummies(feature,drop_first=False) 如果填单个特征的话,只对一个特征做one-hot编码映射, drop_first表示去除one-hot编码后的第一列数据

对于一些离散的文本标签,通常我们可以使用两种编码方式

比如存在[‘小明‘, ‘小红’, ‘小花‘, ‘小明‘]

数字编码:

对于数字映射的编码方式,存在一个编码映射表:比如{‘小明’: 0, ‘小红‘: 1, ‘小花‘: 2}

那么上述的特征可以通过数字编码映射为[0, 1, 2, 1]

one-hot编码:

对于one-hot编码而言:通常使用特征作为列名,如果存在该特征,对应的列名为1, 其他列名为0 

即上述的one-hot编码的结果为

     小明   小红   小花

0     1          0        0

1     0         1         0

2     0         0         1

3     1         0         0

代码:

       数字编码:

                    第一种方法: 导入LabelEncoder() 进行编码: 

                    第二种方式: 构建数字映射字典,使用.map完成映射

     one-hot编码:

                    第一种方法:使用OnehotEncoder(), 对某列样本特征进行编码,使用toarray()获得列表的格式,构建字典,变换为DataFrame格式,通过pd.concat([], axis=1) 完成DataFrame格式的拼接

                    第二种方法:导入pd.get_dummies(feature, drop_first=False) 对某一列文本特征进行onehot编码的映射,使用pd.concat完成DataFrame格式的拼接,如果不填参单个特征,将对所有的文本特征都进行onehot编码操作

import numpy as np
import pandas as pd


vg_df = pd.read_csv(datasets/vgsales.csv, encoding = "ISO-8859-1")

# print(vg_df[[‘Name‘, ‘Platform‘, ‘Year‘, ‘Genre‘, ‘Publisher‘]].iloc[1:7])

# 第一种方法数字映射编码方式:
# 使用LabelEncoder() 进行编码
from sklearn.preprocessing import LabelEncoder

Gen_encode = LabelEncoder()
Gen_labels = Gen_encode.fit_transform(vg_df[Genre])
Gen_map = {encode: label for label, encode in enumerate(Gen_encode.classes_)}
print(Gen_map)
vg_df[Genre_en] = Gen_labels
print(vg_df[[Name, Platform, Year, Genre, Genre_en]].iloc[1:7])

# 第二种方法:使用map进行直接的数字编码映射
map_dict = {Action: 0, Adventure: 1, Fighting: 2, Misc: 3, Platform: 4, Puzzle: 5, Racing: 6, Role-Playing: 7, Shooter: 8, Simulation: 9, Sports: 10, Strategy: 11}
vg_df[Genre_en] = vg_df[Genre].map(map_dict)
print(vg_df[[Name, Platform, Year, Genre, Genre_en]].iloc[1:7])

# One-hot编码方式
# 第一种方式
# 使用onehot对离散值进行编码,使用的是OneHotEncoder

from sklearn.preprocessing import OneHotEncoder, LabelEncoder

One_encode = OneHotEncoder()
label_encode = LabelEncoder()
poke_df = pd.read_csv(datasets/Pokemon.csv, encoding=utf-8)
# 将数据进行打乱
poke_df = poke_df.sample(frac=1, random_state=1).reset_index(drop=False)
label_classes = label_encode.fit_transform(poke_df[Generation])
# 打印出类别
print(label_encode.classes_)
One_val = One_encode.fit_transform(poke_df[Generation].values.reshape(-1, 1)).toarray()
One_dict_encode = {label_encode.classes_[j]: One_val[:, j] for j in range(len(label_encode.classes_))}
One_pd_encode = pd.DataFrame(One_dict_encode)
print(One_pd_encode)
# 将两个pd进行组合
poke_df[One_pd_encode.columns] = One_pd_encode[One_pd_encode.columns]


Leg_label = label_encode.fit_transform(poke_df[Legendary])
Leg_classes = label_encode.classes_

Leg_one = One_encode.fit_transform(poke_df[Legendary].values.reshape(-1, 1)).toarray()
# 作为每一列的类名
Leg_name = [Leg_+str(Leg_class) for Leg_class in Leg_classes]
Leg_dict = {Leg_name[j]:Leg_one[:, j] for j in range(len(Leg_name))}
Leg_pd = pd.DataFrame(Leg_dict)
# 使用pd.concat也可以进行组合
poke_df = pd.concat([poke_df, Leg_pd], axis=1)
# poke_df[Leg_pd.columns] = Leg_pd[Leg_pd.columns]
print(poke_df.head())

# 使用onehot编码的第二种方法:使用pd.get_dummies

poke_df = pd.read_csv(datasets/Pokemon.csv, encoding=utf-8)
poke_dummy_feature = pd.get_dummies(poke_df[Generation], drop_first=True)
poke_df = pd.concat([poke_df, poke_dummy_feature], axis=1)
print(poke_df.head())

 

以上是关于机器学习入门-数据预处理-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码) 的主要内容,如果未能解决你的问题,请参考以下文章

独热编码(One-Hot Encoding)和 LabelEncoder标签编码 区别 数据预处理:(机器学习) sklearn

机器学习多分类:为啥使用“one-hot”编码而不是数字

机器学习One-Hot编码

数据预处理之one-hot编码

数据处理——One-Hot Encoding

初识人工智能:机器学习:sklearn数据特征预处理