动机
最近在针对ASRS(Aviation Safety Reporting System)数据集做航空安全风险分析的项目时,发现数据分布十分不均衡:
- 大部分为空值属性列
- 各列均为字符类别
- 各列类别大多为上千维
对于该种数据,若进行One-Hot编码,则会有极为稀疏的六万多维属性。并且One-Hot编码方式实际上假设了每个属性之间是独立的,但是例如“晴天”、“阴天”、“雨天”之间并不应该是各自独立,“阴天”和“雨天”的距离应该离的更近。
Label Encode
该方法实际上为每个属性之间增加了一层数值大小的关系,而实际上每个属性之间并不具备这样的大小关系,并不适合作为神经网络的编码方式。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data[列名] = le.fit_transform(data[列名].values)
One-hot Encode
Onehot编码方式假设了每个属性之间都是相互独立的,并且参数量较大。
import pandas as pd
data = [
['男', 23, '研究生'],
['女', 25, '小学生'],
['男', 25, '工作']
]
data = pd.DataFrame(data)
data = pd.get_dummies(data)
Multi-Class Embedding
1. 实际含义
在数学上表示一个
m
a
p
i
n
g
→
f
:
X
?
>
Y
maping → f: X -> Y
maping→f:X?>Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于multi-class embedding,就是将类别属性映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。
2. 分布式假设
然而每个属性并不是彼此无关的,并不是完全独立的关系。
3. 降低参数量
若假设网络只有输入层和输出层,网络参数的计算公式为:
θ
=
(
i
n
p
u
t
_
n
u
m
)
?
(
n
_
c
l
a
s
s
)
+
n
_
c
l
a
s
s
\theta=(input\_num)*(n\_class)+n\_class
θ=(input_num)?(n_class)+n_class 风险等级一共分五类,因此
n
_
c
l
a
s
s
=
5
n\_class=5
n_class=5,若One-Hot输入维度为30000维,则
θ
1
=
30000
?
5
+
5
=
150005
\theta_1=30000*5+5=150005
θ1?=30000?5+5=150005个参数,而实际上当multi-class embedding一共映射的维度为1000维的时候,实验效果已经超过One-Hot的30000维,并且此时
θ
2
=
1000
?
5
+
5
=
5005
\theta_2=1000*5+5=5005
θ2?=1000?5+5=5005个,在提高了网络性能的同时,参数量降低了30倍,模型效率大大提升。
4. Embedding目标
从数据中自动学习从输入到向量空间的映射
f
e
a
t
u
r
e
=
f
(
i
n
p
u
t
)
feature=f(input)
feature=f(input),得到的结果是在对应的向量空间中可以衡量两个类别属性距离的关系。
5. 训练方法
无监督学习中常用思想是:当得到数据后,我们又不知道目标输出时x→y(
y
=
f
(
x
)
y=f(x)
y=f(x)),于是可以连接另一个任务,先学习从x→z:
z
=
g
(
x
)
z=g(x)
z=g(x)的映射,通过设定的损失来优化该映射,然后通过
f
f
f映射的输出,直接输入到目标任务中
y
=
f
(
z
)
y=f(z)
y=f(z)。
在该任务中,实际上就是学习两个映射,从input到embedding、从embedding到output:
z
=
E
m
b
e
d
d
i
n
g
(
x
)
,
y
=
f
(
z
)
=
f
(
E
m
b
e
d
d
i
n
g
(
x
)
)
z=Embedding(x), y=f(z)=f(Embedding(x))
z=Embedding(x),y=f(z)=f(Embedding(x)) 其中,
y
=
f
(
x
)
y=f(x)
y=f(x)是我们目标任务的映射。
|