【问题标题】:User defined transformer in Pyspark pipelinePyspark 管道中用户定义的转换器
【发布时间】:2017-12-24 17:11:44
【问题描述】:

我正在尝试创建一个 pyspark 管道来运行分类模型。我的数据集有一列是一个字符串。所以我在管道中应用模型之前使用'StringIndexer'将其转换为数字。

我的管道仅包含 2 个阶段 StringIndexerClassificationModel

StringIndexer 正在创建一个带有索引的新列,但旧列也被保留。我想在管道中引入一个新的变压器来删除一个“字符串”列。这可能吗?

还有其他方法可以删除 StringIndexer 中的实际列吗?

谢谢

【问题讨论】:

    标签: python apache-spark machine-learning pyspark spark-dataframe


    【解决方案1】:

    是的,您可以扩展 abstract class Transformer 并创建自己的转换器来删除不必要的列。

    这应该如下所示:

    import org.apache.spark.ml.Transformer
    import org.apache.spark.ml.param.ParamMap
    import org.apache.spark.ml.util.Identifiable
    import org.apache.spark.sql.{DataFrame, Dataset}
    import org.apache.spark.sql.types.{
      ArrayType,
      StringType,
      StructField,
      StructType
    }
    import org.apache.spark.sql.functions.collect_list
    
    class Dropper(override val uid: String) extends Transformer {
    
      def this() = this(Identifiable.randomUID("dropper"))
    
      override def transform(dataset: Dataset[_]): DataFrame = {
        dataset.drop("your-column-name-here")
      }
    
      override def copy(extra: ParamMap): Transformer = defaultCopy(extra)
    
      override def transformSchema(schema: StructType): StructType = {
        //here you should right your result schema i.e. the schema without the dropped column
      }
    
    }
    

    我已经这样做了一段时间,对我来说效果很好。

    请注意,您还可以扩展 abstract class Estimator

    希望对您有所帮助。最好的问候

    【讨论】:

    • @Deva 如果工作正常,请将答案设为正确,否则请评论您的问题
    猜你喜欢
    • 2020-03-08
    • 2017-05-14
    • 2020-12-20
    • 2018-11-04
    • 2019-11-20
    • 2018-08-24
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多