Когда я пытаюсь передать df2 в kmeans, я получаю следующую ошибку

clusters = KMeans.train(df2, 10, maxIterations=30,
                        runs=10, initializationMode="random")

Я получаю ошибку:

Cannot convert type <class 'pyspark.sql.types.Row'> into Vector

Df2 - это фрейм данных, созданный следующим образом:

df = sqlContext.read.json("data/ALS3.json")
df2 = df.select('latitude','longitude')

df2.show()


     latitude|       longitude|

   60.1643075|      24.9460844|
   60.4686748|      22.2774728|

Как я могу преобразовать эти два столбца в вектор и передать их в KMeans?

8
chessosapiens 22 Мар 2016 в 01:39

1 ответ

Лучший ответ

ML

Проблема в том, что вы пропустили пример документации, и довольно ясно, что метод train требует DataFrame с Vector в качестве функций.

Чтобы изменить текущую структуру данных, вы можете использовать VectorAssembler. В вашем случае это может быть что-то вроде:

from pyspark.sql.functions import *

vectorAssembler = VectorAssembler(inputCols=["latitude", "longitude"],
                                  outputCol="features")

# For your special case that has string instead of doubles you should cast them first.
expr = [col(c).cast("Double").alias(c) 
        for c in vectorAssembler.getInputCols()]

df2 = df2.select(*expr)
df = vectorAssembler.transform(df2)

Кроме того, вам также следует нормализовать свой features с помощью класса MinMaxScaler для получения лучших результатов.

MLLib

Чтобы добиться этого с помощью MLLib, вам нужно сначала использовать функцию карты, чтобы преобразовать все ваши значения string в Double и объединить их вместе в DenseVector.

rdd = df2.map(lambda data: Vectors.dense([float(c) for c in data]))

После этого вы можете тренировать свой модель KMeans из MLlib с помощью переменной rdd.

13
Alberto Bonsanto 22 Мар 2016 в 03:34