Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用保存的模型预测新数据时出现spark数据帧格式错误_Scala_Dataframe_Apache Spark_Apache Spark Sql_Apache Spark Mllib - Fatal编程技术网

Scala 使用保存的模型预测新数据时出现spark数据帧格式错误

Scala 使用保存的模型预测新数据时出现spark数据帧格式错误,scala,dataframe,apache-spark,apache-spark-sql,apache-spark-mllib,Scala,Dataframe,Apache Spark,Apache Spark Sql,Apache Spark Mllib,我能够训练模型并保存模型(train.scala)。 现在我想使用经过训练的模型来预测新数据(predict.scala) 我在我的Predict.scala中创建了一个新的VectorAssembler,对新数据进行特征化处理。对于Predict.scala文件,我是否应该在Train.scala中使用相同的VectorAssembler?因为我发现转换后要素数据类型存在问题 例如:当我读入经过训练的模型,并试图预测特征化的新数据时,我得到了以下错误: type mismatch; [erro

我能够训练模型并保存模型(train.scala)。 现在我想使用经过训练的模型来预测新数据(predict.scala)

我在我的
Predict.scala
中创建了一个新的
VectorAssembler
,对新数据进行特征化处理。对于
Predict.scala
文件,我是否应该在
Train.scala
中使用相同的
VectorAssembler
?因为我发现转换后要素数据类型存在问题

例如:当我读入经过训练的模型,并试图预测特征化的新数据时,我得到了以下错误:

type mismatch;
[error]  found   : org.apache.spark.sql.DataFrame
[error]     (which expands to)  org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
[error]  required: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] => org.apache.spark.sql.Dataset[?]
[error]     val predictions = model.transform(featureData)
培训代码: 斯卡拉火车

    // assembler
    val assembler = new VectorAssembler()
    .setInputCols(feature_list)
    .setOutputCol("features")

    //read in train data
    val trainingData = spark
      .read
      .parquet(train_data_path)

    // generate training features
    val trainingFeatures = assembler.transform(trainingData)

    //define model
    val lightGBMClassifier = new LightGBMClassifier()
        .setLabelCol("label")
        .setFeaturesCol("features")
        .setIsUnbalance(true)
        .setMaxDepth(25)
        .setNumLeaves(31)
        .setNumIterations(100) 

    // fit model
    val lgbm = lightGBMClassifier.fit(trainingFeatures)

    //save model
    lgbm
      .write
      .overwrite()
      .save(my_model_s3_path)
预测代码:Predict.scala

val assembler = new VectorAssembler()
    .setInputCols(feature_list)
    .setOutputCol("features")

// load model
val model = spark.read.parquet(my_model_s3_path)

// load new data
val inputData = spark.read.parquet(new_data_path)

//Assembler to transform new data
val featureData = assembler.transform(inputData)

//predict on new data
val predictions = model.transform(featureData) ### <- got error here
val汇编程序=新的向量汇编程序()
.setInputCols(功能列表)
.setOutputCol(“特性”)
//负荷模型
val model=spark.read.parquet(my_model_s3_路径)
//加载新数据
val inputData=spark.read.parquet(新数据路径)
//用于转换新数据的汇编程序
val featureData=assembler.transform(inputData)
//预测新数据
val predictions=model.transform(featureData)####“我是否应该在Train.scala中为Predict.scala文件使用相同的矢量汇编程序?”是的,但是,我强烈建议使用

看看这个问题是否已经解决了,只是简单地使用管道,正确地序列化/反序列化模型,更好地构建代码。另外,请确保trainingData和inputData都包含feature_list中列出的相同列。

“我是否应该在Train.scala中为Predict.scala文件使用相同的VectorAssembler?”是的,但强烈建议使用

看看这个问题是否已经解决了,只是简单地使用管道,正确地序列化/反序列化模型,更好地构建代码。另外,确保trainingData和inputData都包含功能列表中列出的相同列

// Train.scala
val pipeline = new Pipeline().setStages(Array(assembler, lightGBMClassifier))
val pipelineModel = pipeline.fit(trainingData)
pipelineModel.write.overwrite().save("/path/to/pipelineModel")

// Predict.scala
val pipelineModel = PipelineModel.load("/path/to/pipelineModel")
val predictions = pipelineModel.transform(inputData)