【问题标题】:How to handle categorical features with large amount of unique values in pysparkml如何在pysparkml中处理具有大量唯一值的分类特征
【发布时间】:2021-05-08 06:05:39
【问题描述】:

我正在使用 pysparkml 库及其模型来解决回归问题,并且我的数据具有一些具有大量唯一值(超过 1000 个)的分类特征。 处理它们的正确决定是什么?

据说几乎所有地方都使用 OneHotEncoder,但在 ohe 之后会有超过 10000 个稀疏列,并且后续建模需要很长时间。使用我的数据(4m 行)和集群配置,它花费了超过 14 小时,但我没有得到结果。 在这种情况下,升级集群效率不高,因为我曾经查看过 Ganglia 报告,其中显示了集群负载,并且内存使用量和 cpu 使用量都小于可用最大值的 20%。

我读到的另一个变体是在结果列上使用 OneHotEncoder + PCA。但它似乎工作的时间更长,我认为这种方式不太正确,因为 PCA 是为连续变量设计的。

也许还有其他变体如何使用此类分类特征,例如一些 LabelEncoder(StringIndexer 本身不是一个 laber 编码器,因为它会留下有关分类信息的额外元数据)

OneHotEncoder 使用的代码

  indexers = []
  for name in strings_to_index:
      indexers.append(StringIndexer(inputCol=name, outputCol=name+'_index', handleInvalid ='skip'))
      feature_list.append(name+'_ohe_enc')
      feature_list.remove(name)
  encoder = OneHotEncoderEstimator(inputCols=[name +'_index' for name in strings_to_index], outputCols=[name +'_ohe_enc' for name in strings_to_index])
  assembler = VectorAssembler(inputCols=feature_list, outputCol="features")
  rf = RandomForestRegressor(labelCol="label", featuresCol="features", cacheNodeIds=True, seed = 42)
  

  paramGrid = ParamGridBuilder() \
        .addGrid(rf.numTrees, [10, 20]) \
        .addGrid(rf.maxDepth, [5, 10]) \
      .build()


  evaluator = RegressionEvaluator(labelCol="label", predictionCol="prediction", metricName="mae")

  # Train model
  crossval = CrossValidator(estimator=rf,
                        estimatorParamMaps=paramGrid,
                        evaluator=evaluator,   
                        numFolds=2)
  
  pipeline = Pipeline(stages=indexers+[encoder,assembler, crossval])
  cvModel_rf = pipeline.fit(data_train)

配置

  • Databricks 运行时版本 6.4(包括 Apache Spark 2.4.5、Scala 2.11)
  • 驱动节点 Standard_DS4_v2
  • 3 个工作节点 Standard_DS4_v2
  • 使用 pyspark.ml 库进行建模和编码

【问题讨论】:

  • 我不精通 pyspark,但让人们帮助您回答问题的好方法可能是添加一些您尝试过的代码示例。这样他们就可以看到你前进的方向。

标签: python machine-learning pyspark encoding databricks


【解决方案1】:

如何在 pyspark 中使用散列 https://spark.apache.org/docs/2.2.0/api/python/pyspark.ml.html#pyspark.ml.feature.HashingTF

这会将一列中的 1000 个不同值压缩为 n(选择 2^X)个不同值

【讨论】:

  • 感谢您的回答,但 HashingTF 正在用于另一个数据之王(通常用于处理文本)。它不适用于简单的分类列,例如 CustomerID 或 City。
猜你喜欢
  • 2021-01-01
  • 2021-07-27
  • 1970-01-01
  • 2018-04-12
  • 2021-01-16
  • 2015-04-27
  • 2015-06-19
  • 2013-06-23
  • 2017-06-28
相关资源
最近更新 更多