Ошибка типа в деревьях с усилением градиента из mllib

#pyspark #apache-spark-mllib

#pyspark #apache-spark-mllib

Вопрос:

Я пытаюсь запустить алгоритм дерева с усилением градиента для некоторых данных со смешанными типами:

 [('feature1', 'bigint'),
 ('feature2', 'int'),
 ('label', 'double')]
  

Я попробовал следующее

 from pyspark.mllib.tree import GradientBoostedTrees, GradientBoostedTreesModel
from pyspark.ml.feature import VectorAssembler
from pyspark.mllib.linalg import Vector as MLLibVector, Vectors as MLLibVectors
from pyspark.mllib.regression import LabeledPoint

vectorAssembler = VectorAssembler(inputCols = ["feature1", "feature2"], outputCol = "features")

data_assembled = vectorAssembler.transform(data)
data_assembled = data_assembled.select(['features', 'label'])
data_assembled = data_assembled.select(F.col("features"), F.col("label"))
  .rdd
  .map(lambda row: LabeledPoint(MLLibVectors.fromML(row.label), MLLibVectors.fromML(row.features)))

(trainingData, testData) = data_assembled.randomSplit([0.9, 0.1])

model = GradientBoostedTrees.trainRegressor(trainingData,
                                            categoricalFeaturesInfo={}, numIterations=100)
  

Однако я получаю следующую ошибку:

TypeError: Unsupported vector type <class 'float'>

Но ни один из моих типов на самом деле не является float. Кроме того, feature2 является двоичным, если это имеет значение.

Ответ №1:

В итоге я избежал реализации mllib и вместо этого использовал Spark ML:

 from pyspark.ml.feature import VectorAssembler
from pyspark.ml.regression import GBTRegressor

vectorAssembler = VectorAssembler(inputCols = ["feature1", "feature2"], outputCol = "features")

data_assembled = vectorAssembler.transform(data)
data_assembled = data_assembled.select(F.col("label"), F.col("features"))

(trainingData, testData) = data_assembled.randomSplit([0.7, 0.3])

gbt_model = GBTRegressor(featuresCol="features", maxIter=10).fit(trainingData)
  

В Python нет требуемого двойного типа для объектов LabeledPoint, поэтому я предполагаю, что сопоставление из pyspark приводит к преобразованию в float .