Pyspark版本:V3.2.1
写在最前
本篇博客只单独介绍Pyspark.ml.feature包中HashingTF类和FeatureHasher类的使用方法,其他类的使用可以参考博客:Pyspark:特征处理(ml.feature包的是使用)_Sun_Sherry的博客-CSDN博客
1 HashingTF
1.1 MurmurHash算法
MurmurHash算法是一种适用于一般的基于散列查找的非加密校验函数。其当前最新版本为MurmurHash3,该算法能够产生出32-bit或128-bit哈希值。
Murmur哈希的算法包含两个基本操作:MUltiply(MU, 乘法) and Rotate(R,旋转)。因为它在哈希的过程要经历多次MU和R操作,所以就叫算法就叫MurMur了。
目前Python中的第三方包mmh3已经实现了该哈希算法,这里仅简要介绍其使用方法。具体如下:
import mmh3
a_mmh=mmh3.hash('a')
print(a_mmh)
a_mmh64=mmh3.hash64('a')
print(a_mmh64)
a_mmh128=mmh3.hash128('a')
print(a_mmh128)
其结果如下:
1.2 HashingTF类
概括地说,HashingTF类可以统计各个单词(term)在一篇文档中出现的次数(term frequence,TF),并以向量的方式保存。而在统计过程中,需要将单词跟向量的列索引一一映射起来。其映射方法如下:
- 先使用算法将单词映射成哈希值。这里使用的hash算法即为上述介绍的MurmurHash 3算法。
- 再使用模函数将上述哈希值映射到指定大小的数值内,该数值即为向量的维度。该数值由参数numFeatures决定,推荐使用2的幂次方来指定numFeatures。
HashingTF的使用方法如下:
from pyspark.sql import SparkSession
from pyspark.ml.feature import *
import os
from pyspark.ml.linalg import Vectors
os.environ['SPARK_HOME'] ='/Users/sherry/documents/spark/spark-3.2.1-bin-hadoop3.2'
spark=SparkSession.builder.appName('ml').getOrCreate()
data=spark.createDataFrame([(['a','b','c','b'],),
(['c','d','d','c'],),
(['a','e','e'],),],['words'])
tf_model=HashingTF(inputCol='words',outputCol='w_tf',numFeatures=8)
data_tf=tf_model.transform(data)
print(data_tf.toPandas())
其结果如下:
2. FeatureHasher类
FeatureHasher类的作用和x的作用基本相似,但FeatureHasher类能处理更多的数据类型。其具体处理方式如下:
- Numeric型:对于数值型特征,直接对其值进行哈希运算得到值即为对应的索引值。如果希望将Numeric型特征按照Categorical型来处理,则需要通过参数categoricalCols指定。
- String型:对于String型特征,其处理方法类似one-hot。
- Boolean型:对于Boolean型特征,其处理方法类似one-hot。
其具体用法举例如下:
df=spark.createDataFrame([(1,True,'A1','1'),
(2,False,'C1','3')],
['A','B','C','D'])
feat_hash=FeatureHasher(inputCols=['A','B','C','D'],
outputCol='features',
numFeatures=8)
df_feathash=feat_hash.transform(df)
其结果如下: