当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python pyspark VectorIndexer用法及代码示例


本文简要介绍 pyspark.ml.feature.VectorIndexer 的用法。

用法:

class pyspark.ml.feature.VectorIndexer(*, maxCategories=20, inputCol=None, outputCol=None, handleInvalid='error')

用于索引 Vector 数据集中的分类特征列的类。

这有两种使用模式:

  • 自动识别分类特征(默认行为)
    • 这有助于将未知向量的数据集处理成具有一些连续特征和一些分类特征的数据集。连续和分类之间的选择基于 maxCategories 参数。

    • 将 maxCategories 设置为任何分类特征应具有的最大分类数。

    • 例如:特征 0 具有唯一值 {-1.0, 0.0},特征 1 具有唯一值 {1.0, 3.0, 5.0}。如果 maxCategories = 2,则特征 0 将被声明为分类并使用索引 {0, 1},而特征 1 将被声明为连续的。

  • 索引所有特征,如果所有特征都是分类的
    • 如果 maxCategories 设置为非常大,那么这将为所有特征建立一个唯一值的索引。

    • 警告:如果特征是连续的,这可能会导致问题,因为这会将所有唯一值收集到驱动程序。

    • 例如:特征 0 具有唯一值 {-1.0, 0.0},特征 1 具有唯一值 {1.0, 3.0, 5.0}。如果 maxCategories >= 3,那么这两个特征都将被声明为分类的。

这将返回一个模型,该模型可以将分类特征转换为使用基于 0 的索引。

index 稳定性:

  • 这不能保证在多次运行中选择相同的类别索引。

  • 如果分类特征包括值 0,则保证将值 0 映射到索引 0。这保持向量稀疏性。

  • 未来可能会增加更多的稳定性。

TODO:未来扩展:未来计划提供以下函数:

  • 在转换中保留元数据;如果特征的元数据已经存在,则不要重新计算。

  • 通过参数或通过现有元数据指定不索引的某些特征。

  • 如果分类特征只有 1 个类别,则添加警告。

1.4.0 版中的新函数。

例子

>>> from pyspark.ml.linalg import Vectors
>>> df = spark.createDataFrame([(Vectors.dense([-1.0, 0.0]),),
...     (Vectors.dense([0.0, 1.0]),), (Vectors.dense([0.0, 2.0]),)], ["a"])
>>> indexer = VectorIndexer(maxCategories=2, inputCol="a")
>>> indexer.setOutputCol("indexed")
VectorIndexer...
>>> model = indexer.fit(df)
>>> indexer.getHandleInvalid()
'error'
>>> model.setOutputCol("output")
VectorIndexerModel...
>>> model.transform(df).head().output
DenseVector([1.0, 0.0])
>>> model.numFeatures
2
>>> model.categoryMaps
{0: {0.0: 0, -1.0: 1}}
>>> indexer.setParams(outputCol="test").fit(df).transform(df).collect()[1].test
DenseVector([0.0, 1.0])
>>> params = {indexer.maxCategories: 3, indexer.outputCol: "vector"}
>>> model2 = indexer.fit(df, params)
>>> model2.transform(df).head().vector
DenseVector([1.0, 0.0])
>>> vectorIndexerPath = temp_path + "/vector-indexer"
>>> indexer.save(vectorIndexerPath)
>>> loadedIndexer = VectorIndexer.load(vectorIndexerPath)
>>> loadedIndexer.getMaxCategories() == indexer.getMaxCategories()
True
>>> modelPath = temp_path + "/vector-indexer-model"
>>> model.save(modelPath)
>>> loadedModel = VectorIndexerModel.load(modelPath)
>>> loadedModel.numFeatures == model.numFeatures
True
>>> loadedModel.categoryMaps == model.categoryMaps
True
>>> loadedModel.transform(df).take(1) == model.transform(df).take(1)
True
>>> dfWithInvalid = spark.createDataFrame([(Vectors.dense([3.0, 1.0]),)], ["a"])
>>> indexer.getHandleInvalid()
'error'
>>> model3 = indexer.setHandleInvalid("skip").fit(df)
>>> model3.transform(dfWithInvalid).count()
0
>>> model4 = indexer.setParams(handleInvalid="keep", outputCol="indexed").fit(df)
>>> model4.transform(dfWithInvalid).head().indexed
DenseVector([2.0, 1.0])

相关用法


注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.ml.feature.VectorIndexer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。