Spark Scala 特征向量属性数量统计问题咨询
特征总属性数统计方案
直接取normFeatures列的向量size值即可,该值就是处理后的总属性数量,无需额外统计向量中嵌套在[]、()内的数字。
原理说明
- 你用到的四个算子中,仅
OneHotEncoder、VectorAssembler会影响属性维度,Normalizer不会修改向量维度:StringIndexer仅将字符串分类值映射为整数索引,单列输入还是单列输出,不改变属性数OneHotEncoder默认会将单个分类列转换为N-1维独热向量(N为该列的分类取值总数,删除最后一个维度避免共线性)VectorAssembler会按顺序拼接所有输入的数值列、独热向量列,生成的大向量的size就是所有输入维度的总和Normalizer仅对向量每个维度的数值做L1/L2范数缩放,不会新增或减少维度
- 向量里
()、[]的数字是Spark稀疏向量的存储格式标记,格式为(总维度, [非零维度下标], [非零维度取值]),其中第一个括号内的第一个数字就是向量总维度,下标和取值是为了节省存储的优化设计,不是额外的属性。
实现代码示例
Scala 版本
取单条样本的属性总数
import org.apache.spark.ml.linalg.Vector val sampleVector = df.select("normFeatures").head.getAs[Vector](0) val totalAttrCount = sampleVector.size
校验全量数据维度一致性
// 正常处理后所有行维度相同,查询结果仅返回一个值就是总属性数 df.select("normFeatures").as[Vector].map(_.size).distinct.show()
PySpark 版本
取单条样本的属性总数
from pyspark.ml.linalg import Vector sample_vector = df.select("normFeatures").head()[0] total_attr_count = sample_vector.size
校验全量数据维度一致性
# 结果仅返回一个值即为统一的总属性数 df.select("normFeatures").rdd.map(lambda row: row[0].size).distinct().collect()
内容的提问来源于stack exchange,提问作者rayqz
相关产品推荐
相关产品推荐

