Проблемы создания RDD LabeledPoint из dataframe в pyspark [duplicate]

просто выполните это pip install mysqlclient==1.3.9

5
задан user6910411 28 December 2016 в 16:45
поделиться

2 ответа

Это маловероятно, ошибка. Вы не предоставили код , необходимый для воспроизведения проблемы , но, скорее всего, вы используете Spark 2.0 с трансформаторами ML и сравниваете неправильные объекты.

Давайте проиллюстрируем это с помощью примера. Простые данные

from pyspark.ml.feature import OneHotEncoder

row = OneHotEncoder(inputCol="x", outputCol="features").transform(
    sc.parallelize([(1.0, )]).toDF(["x"])
).first()

Теперь можно импортировать различные векторные классы:

from pyspark.ml.linalg import Vector as MLVector, Vectors as MLVectors
from pyspark.mllib.linalg import Vector as MLLibVector, Vectors as MLLibVectors
from pyspark.mllib.regression import  LabeledPoint

и выполнить тесты:

isinstance(row.features, MLLibVector)
False
isinstance(row.features, MLVector)
True

Как вы видите, у нас есть pyspark.ml.linalg.Vector not pyspark.mllib.linalg.Vector, который несовместим со старым API:

LabeledPoint(0.0, row.features)
TypeError                                 Traceback (most recent call last)
...
TypeError: Cannot convert type <class 'pyspark.ml.linalg.SparseVector'> into Vector

Вы можете преобразовать объект ML в MLLib one:

from pyspark.ml import linalg as ml_linalg

def as_mllib(v):
    if isinstance(v, ml_linalg.SparseVector):
        return MLLibVectors.sparse(v.size, v.indices, v.values)
    elif isinstance(v, ml_linalg.DenseVector):
        return MLLibVectors.dense(v.toArray())
    else:
        raise TypeError("Unsupported type: {0}".format(type(v)))

LabeledPoint(0, as_mllib(row.features))
LabeledPoint(0.0, (1,[],[]))

или просто:

LabeledPoint(0, MLLibVectors.fromML(row.features))
LabeledPoint(0.0, (1,[],[]))

, но, как правило, вам следует избегать ситуаций, когда это необходимо.

10
ответ дан user6910411 19 August 2018 в 19:23
поделиться

Если вы просто хотите преобразовать SparseVectors из pyspark.ml в pyspark.mllib SparseVectors, вы можете использовать MLUtils. Скажем, df - ваш фрейм данных, а столбец с SparseVectors называется «функциями». Затем следующие несколько строк позволяют выполнить следующее:

from pyspark.mllib.utils import MLUtils
df = MLUtils.convertVectorColumnsFromML(df, "features")

Эта проблема возникла для меня, потому что при использовании CountVectorizer из pyspark.ml.feature я не смог создать LabeledPoints из-за несовместимости с SparseVector от pyspark .ml

Интересно, почему их последняя документация CountVectorizer не использует «новый» класс SparseVector. Поскольку алгоритмы классификации нуждаются в методах LabeledPoints, это не имеет для меня никакого смысла ...

UPDATE: Я неправильно понял, что библиотека ml предназначена для объектов DataFrame, а библиотека mllib предназначена для объектов RDD. DataFrame-Datastructure рекомендуется начиная с Spark> 2,0, потому что SparkSession более совместим, чем SparkContext (но сохраняет объект SparkContext) и доставляет DataFrame вместо RDD. Я нашел этот пост, который дал мне «ага» -эффект: mllib и ml . Спасибо Альберто Бонсанто:).

Использовать f.e. NaiveBayes из mllib, мне пришлось преобразовать свой DataFrame в объекты LabeledPoint для NaiveBayes из mllib.

Но проще использовать NaiveBayes из ml, потому что вам не нужны LabeledPoints, но можно просто указать функцию - и class-col для вашего фрейма данных.

PS: Я боролся с этими проблемами часами, поэтому я почувствовал, что мне нужно опубликовать его здесь:)

5
ответ дан Community 19 August 2018 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: