假设有猫、狗、斑马图片数据集,需要通过神经网络进行分类。输入很好理解————图像(处理成黑白图像)中的每个像素作为一个输入神经元,输出好像有点复杂。猫、狗、斑马属于类别变量,很多机器学习算法不能处理类别变量,因此需要对类别变量进行编码。
类型编码
通常编码方式有:标签编码、二值编码以及独热编码。下面进行分别说明:
标签编码
标签编码——标签被编码为连续的数值。这种方法不太适合我们的场景,猫相比于斑马更像狗吗?因为连续数值容易产生这类问题。标签编码更适合这些场景:国家人口数量、建筑物高度、价格范围(低价、中等价格、高价,编码对应1,2,3).
在神经网络中,使用标签编码,输出层仅有一个输出神经元。
二值编码
二值编码于标签编码类似————转换为二值形式(数值),在神经网络中,使用二值编码,输出有两个神经元。
独热编码
独热编码使用的列数与要编码的类的数量相同。注意,我们不再对类有任何内置的假设(标签编码连续数值假设)。
在神经网络中,使用独热编码输出层恰好有3个输出神经元。
示例
下面示例通过两种方法实现独热编码:
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from keras.utils import to_categorical
target_variable = np.array(['cat', 'dog', 'zebra', 'zebra'])
encoder = OneHotEncoder()
sk_one_hot_encoded = encoder.fit_transform(target_variable.reshape(-1, 1)).toarray()
# 使用Keras包实现独热编码
# 首先编码为整数
categorical = pd.Categorical(target_variable)
categorical_codes = categorical.codes
# [0 1 2 2]
# 基于前一步进行独热编码
one_hot_encoded = to_categorical(categorical_codes)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]
# [0. 0. 1.]]
二值编码使用下列方式:
data = np.array([1, 2, 3, 0])
data_binarized = preprocessing. Binarizer(threshold=1.4).transform(data)
标签编码示例:
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
input_classes = ['audi' , 'ford' , 'audi' , 'toyota' , 'ford' ,'bmw' ]
label_encoder.fit(input_classes)
for i, item in enumerate(label_encoder.classes_):
print(item, "-->", i)