我有一个带有分类列的pyspark数据框,该列通过...被转换为onehot编码的矢量
si = StringIndexer(inputCol="LABEL", outputCol="LABEL_IDX").fit(df)
df = si.transform(df)
oh = OneHotEncoderEstimator(inputCols=["LABEL_IDX"], outputCols=["LABEL_OH"]).fit(df)
df = oh.transform(df)
[之后看数据帧时,我看到一些onehot编码的向量看起来像...
(1,[],[])
我希望稀疏向量看起来像(1,[0],[1.0])
或(1,[1],[1.0])
,但是这里的向量只是零。
任何想法在这里会发生什么?
这与mllib中的值编码方式有关。1hot不会像这样对二进制值进行编码...
[1, 0] or [0, 1]
以[这种,那种]方式,而是
[1] or [0]
在稀疏向量格式中,[0]情况看起来像(1,[],[])
,这意味着长度= 1,没有位置索引具有非零值,并且(因此)没有非零值要列出(可以了解更多关于mllib如何表示稀疏向量[C0 ])。就像二进制类别只需要一个位来表示两个选择一样,1hot编码在向量中使用单个索引。从另一个here开始编码...
[如果您不希望onehot编码器删除最后一个类别以简化表示,可以将mllib类设置为dropLast参数,请参见article一种热编码非常流行。我们可以用N-1表示所有类别(N =类别的编号),因为这足以对不包含的类别进行编码[... [[但是请注意]进行分类推荐是使用所有N列,因为大多数基于树的算法都基于所有可用的树来构建树]