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())