One-hot vs. Word2Vec

训练模型的时候,有的时候使用的是One-hot,有的时候使用Word2Vec,这两个有什么区别的,什么时候使用One-hot,什么时候使用Word2Vec呢,谈一下自己的理解。

One-hot Encoding

One-hot编码又被称为“一位有效编码”,采用N位对特征的N个状态或者候选值进行编码,每个候选值是否有效用0和1表示,任意时刻编码只有一位有效。举个简单的例子,如果要区分水果,假设水果包括:

大小:["大"、"中"、"小"]

颜色:[“红色”、“橙色”、“黄色”、“绿色”、“青色”、“蓝色”、“紫色”]

味道:[“酸”、“甜”、“苦”、“辣”]

只考虑表皮颜色,那么大的绿色甜西瓜对应的[0, 3, 1],小的紫色酸葡萄应该是[2, 6, 1]就可以了,但是这个数据放入到机器学习算法里,并不能很好的应用于计算。

这个时候我们把西瓜的特征转换成One-hot的数据,“大”对应[1, 0, 0],“绿色”对应[0, 0, 0, 1, 0, 0, 0],“甜”对应[0, 1, 0, 0],完整的数字化特征拼合三个维度变成[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0],我们会发现整个向量非常的稀疏。

代码示例如下:

注意,代码中,one-hot的encoder自动帮我们做了编码,不是像我们例子中的大小、颜色、味道的顺序,编码后的顺序可以参考打印的feature name的顺序。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from sklearn import preprocessing
 
enc = preprocessing.OneHotEncoder()
# add sample into encode. we need care the samples
enc.fit([["大","红色","酸"],["中","橙色","甜"],["小","黄色","苦"],["大","绿色","辣"],["大","青色","酸"],["大","蓝色","甜"],["大","紫色","辣"]])
 
# encode one of test
array = enc.transform([["大","橙色","苦"]]).toarray()
 
print("econd of the test data:")
print(array)
print()
print("feature name:")
print(enc.get_feature_names())

输出如下:

econd of the test data:
[[0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]

feature name:
['x0_中' 'x0_大' 'x0_小' 'x1_橙色' 'x1_紫色' 'x1_红色' 'x1_绿色' 'x1_蓝色' 'x1_青色'
 'x1_黄色' 'x2_甜' 'x2_苦' 'x2_辣' 'x2_酸']

Word2Vec

Word2Vec的模型是基于神经网络来训练词向量的工具,通过一系列的模型和框架对原有的NNLM(神经网络语言模型)进行优化,简化了计算的同时保持很好的准确度。一般word2vec应用于自然语言处理,训练出来的词向量可以应用于其他场景,比如可以用于聚类或者其他深度学习。当然word2vec也可以用于一些时序数据的挖掘,比如学生学习情况分析、用户浏览记录分析等等,当然也可以用于个性化推荐和搜索领域。

word2vec是基于NNLM及其他语言模型的基础上做了优化产生的,常见的有CBOW模型、Skip-Gram模型、Hierarchical Softmax和Negative Sampling两个降低复杂度的方法。

1. CBOW (Continuous Bag-of-Words Model) 是一种根据上下文的词语预测当前词语的出现概率的模型,已知上下文,估计当前词语的语言模型

2. Skip-Gram和CBOW有点相反,是已知当前词语,预测上下文的模型

3. Hierarchical Softmax是借助了分类的概念,假设所有的词都作为输出,Hierarchical Softmax则是把这些词按类别区分,二叉树上的每个顶点看做是用哈夫曼编码构造的二分类器。算法实现时,模型会赋予这些抽象的中间节点一个合适的向量,真正的词会公用这些向量,这种近似的处理会显著带来性能上的提升而且不会损失很大的准确性。

4. Negative Sampling也是用二分类模拟多分类,区别在于它采用一些负例,调整模型参数使得可以区分正例和负例,它不是把分母中的所有词都算一遍,只算其中的一部分。

One-hot vs. Word2Vec

1. One-hot向量维度比较高,而且非常的稀疏;然而word embedding却是低维度的稠密数据,一般50~600维左右。当你使用One-hot作为分类器的特征向量时,特征向量会随着词表的增长而增长;而word embedding更加具有计算效率。

2. word embedding具有更好的泛化能力,因为相同的语义相似性具有相同的词向量,但是在one-hot中却不具有这个特征。词向量的每一对wi和wj有cosine的相似度cos(wi,wj)=0。

发布了83 篇原创文章 · 获赞 18 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/100778612