Pyspark многослойная текстовая классификация - PullRequest
0 голосов
/ 16 мая 2018

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

+-----------------+-----------+
|      label      |   text    |
+-----------------+-----------+
| [0, 1, 0, 1, 0] | blah blah |
| [1, 1, 0, 0, 0] | foo bar   |
+-----------------+-----------+

Первый столбец закодирован с использованием метода бинаризации с несколькими метками.Мой конвейер:

tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lsvc = LinearSVC(maxIter=10, regParam=0.1)
ovr = OneVsRest(classifier=lsvc)

pipeline = Pipeline(stages=[tokenizer, hashingTF, ovr])

model = pipeline.fit(result)

Когда я запускаю этот код, я получаю эту ошибку:

ValueError: invalid literal for int() with base 10: '[1, 0, 1, 0, 1, 1, 1, 0, 0]'

Есть идеи, что случилось?

1 Ответ

0 голосов
/ 16 мая 2018

Глядя на ошибку

недопустимый литерал для int ()

Мы видим, что проблема в том, что ожидаемый тип метки - это не массив, аодиночное значение, соответствующее классу выборки.Другими словами, вам нужно преобразовать метку из бинаризационной кодировки с несколькими метками в одно число.

Один из способов сделать это - сначала преобразовать массив в строку, а затем использовать StringIndexer:

to_string_udf = udf(lambda x: ''.join(str(e) for e in x), StringType())
df = df.withColumn("labelstring", to_string_udf(df.label))

indexer = StringIndexer(inputCol="labelstring", outputCol="label")
indexed = indexer.fit(df).transform(df)

Это создаст отдельную категорию (метка класса) для каждого уникального массива.

...