前言
本文章适合0基础学习与实现基于哈希表的机器学习特征哈希,文章将从学习之前要掌握的基础知识开始,一步一步实现相关功能。同时这也是作者记录自己0基础学习与完成这个课设的过程,希望大家能够从中获得帮助。
本节前言
本节主要学习机器学习基础与特征哈希。
本系列其他学习内容:
机器学习
特征哈希在机器学习中的作用
机器学习的步骤为:
1.获取数据
2.数据预处理
3.特征工程
4.模型的选择与训练
5.评估
而特征哈希则对应了机器学习中的特征工程。
机器学习基础
特征工程
由于用户输入的信息一般都为非结构化的杂乱无章的文本数据,而机器学习算法的数据应为固定长度的输入与输出,因此为了使得用户输入的数据能够被应用于机器学习算法,我们需要使用一定的方法将用户输入数据转化为能表示原文本信息语义的数字信息(通常为向量),这个过程即为特征工程。
常见的特征提取方法有:
独热模型(One—Hot)
独热模型的基本思想是使用是使用N维数组来对N个状态进行编码,每个状态都由他对应的的数组维度来表示,并且在任意时候只有一位有效。
例如:
句子1:今天天气真好
句子2:今天天气不错
分析:独热模型按照一定的规定将每个独特的单词转换为一个向量
处理:
今天 = [1,0,0,0]
天气 = [0,1,0,0]
真好 = [0,0,1,0]
不好 = [0,0,0,1]
通过上述分析,我们可以知道这种模型的缺点:
- 当文本中文字类别很多的时候,需要维护及其高纬的数组,这是很困难的
词袋模型(BOW)
词袋模型的基本思想是将用户的输入视作一个个单独文字的集合,即忽略其在文本中的语序、语法(即 "你好吗" 和 "好你吗" 在被模型处理后将被视为同一个输入),为了存储各文字在整个文本(用户输入)中出现的频率,我们需要使用一个N维数组,每一维度代表某一文字在文本中的频率。
例如:今天天气真好
这个文本共5种文字,可以使用5维数组存储,假设第0维存储的是“今”字的词频,
第二维存储的是“天”的词频
那么词频数组:[1,2,1,1,1]
在对文本进行特征提取处理后,我们可以通过计算两向量之间的余弦距离来预测两向量所表示的文本之间的相似程度。
经过上述分析,我们可以知道该模型的几个缺点:
- 如果文本数据中文字过多,会导致需要维护的词频数组过大
- 该模型对相似词的表达严重缺乏
例如:
句子1:今天天气好
句子2:今天天气不好
由于两个句子的词频高度相似,通过模型处理后的两向量余弦距离表现出来两文本高度相似,
然而这两个句子却是完全不同的两种语义
特征哈希
根据前一节我们所学习的哈希表与哈希函数,我们可以知道通过哈希函数可以将用户输入的高纬度信息压缩转化为一个远低于源数据维度的值(散列值),并且在很大概率上一个散列值唯一对应一个输入,因此如果使用哈希函数来进行特征提取,同时给定一个维度N,可以将上面生成的每个散列值转化再通过取余运算使得数据范围进一步缩小为规定范围内的值,从而可以克服以上两种常见的特征提取模型在面对大量输入时导致维护的数组维度过高过大的问题。
'''
定义利用哈希函数的向量转化器
输入:需要进行特性化处理的features
给定的维度N
'''
def hashing_vectorizer(features, N):
x = N * [0] # 创建N维空向量
for f in features:
h = hash(f) # 对输入的文本传入哈希函数,计算出对应的散列值(输入文本应该存放的索引)
idx = h % N # 保证索引在给定的范围内
x[idx] += 1 # 索引所在文本的词频+1
return x # 返回处理后的特征向量
但是这也会引入一个问题,如何设计合适的哈希函数,如何确定这个向量的维度N,如果设计的哈希函数最终通过NMOD后能够转化的散列值范围过小,会导致出现多次哈希冲突;而如果散列值范围过大又会导致空间利用率低,占用较大内存且训练时间也会增大。但一般情况下,会适当扩大散列值范围,尽管训练时间会有所增加,但也比出现哈希冲突这类问题要好。