Scala 使用保存的模型预测新数据时出现spark数据帧格式错误
我能够训练模型并保存模型(train.scala)。 现在我想使用经过训练的模型来预测新数据(predict.scala) 我在我的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
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)