我想在Keras中使用一个简单的前馈网络。我的数据中有一些分类值,我希望在将这些数据输入网络之前对其进行嵌入处理。
以下是示例数据:
+-------------+---------+|category_val | Numeric |+-------------+---------+|"A" | 0.5 |+-------------+---------+|"B" | 0.2 |+-------------+---------+|"C" | 0.1 |+-------------+---------+
我对category_val列使用了pandas.get_dummies函数,得到的结果如下:
+---+-----------+-----------+-----------+| id| category=A| category=B| category=C|+---+-----------+-----------+-----------+| 0| 1| 0| 0|| 1| 0| 1| 0|| 2| 0| 0| 1|+---+-----------+-----------+-----------+
这是否意味着我的输入层应该有4个输入特征(3个用于生成的独热向量,一个用于数值)?
看起来更简单的方法是将类别直接转换为数字,即:A=1, B=2, C=3,这样只需要2个特征。正确的做法是什么,为什么?
回答:
这是否意味着我的输入层应该有4个输入特征(3个用于生成的独热向量,一个用于数值)?
是的。这意味着输入层有4个特征。
看起来更简单的方法是将类别直接转换为数字,即:A=1, B=2, C=3,这样只需要2个特征。正确的做法是什么,为什么?
将A=1, B=2, C=3
确实更简单。然而,这会让神经网络认为C
在某种程度上大于B
,而B
大于A
。为了理解这种做法的弊端,假设你的Category
实际上是对象的颜色。将颜色视为数字会暗示红色
大于蓝色
或者蓝色
大于红色
,这显然不符合直觉。我们知道神经网络只是连接起来的数学函数,它们会将分配了较大数字的颜色视为更大的颜色,因此将数字分配给颜色是一种错误的方法。因此,将每种颜色表示为一个独立的特征是合理的。这样可以将这些0和1视为与每个特征值相关的概率。例如,红色
的值为1表示该对象为红色
的概率为1。值为0表示概率为0。