PySpark MLPC Multi Target классификация - PullRequest
0 голосов
/ 25 декабря 2018

PySpark 2.4.0

Как обучить модель, которая имеет несколько целевых столбцов?

Вот пример набора данных,

+---+----+-------+--------+--------+--------+
| id|days|product|target_1|target_2|target_3|
+---+----+-------+--------+--------+--------+
|  1|   6|     55|       1|       0|       1|
|  2|   3|     52|       0|       1|       0|
|  3|   4|     53|       1|       1|       1|
|  1|   5|     53|       1|       0|       0|
|  2|   2|     53|       1|       0|       0|
|  3|   1|     54|       0|       1|       0|
+---+----+-------+--------+--------+--------+

id, days and product - столбцы объектов.Чтобы обучиться с использованием PySpark ML - MLPC, я преобразовал объекты в векторы функций.

Вот код,

from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler

assembler = VectorAssembler(
    inputCols=['id', 'days', 'product'],
    outputCol="features")
output = assembler.transform(data)

, и у меня есть столбец функций, как показано ниже,

+---+----+-------+--------+--------+--------+--------------+
| id|days|product|target_1|target_2|target_3|      features|
+---+----+-------+--------+--------+--------+--------------+
|  1|   6|     55|       1|       0|       1|[1.0,6.0,55.0]|
|  2|   3|     52|       0|       1|       0|[2.0,3.0,52.0]|
|  3|   4|     53|       1|       1|       1|[3.0,4.0,53.0]|
|  1|   5|     53|       1|       0|       0|[1.0,5.0,53.0]|
|  2|   2|     53|       1|       0|       0|[2.0,2.0,53.0]|
|  3|   1|     54|       0|       1|       0|[3.0,1.0,54.0]|
+---+----+-------+--------+--------+--------+--------------+

Теперь, если я возьму каждый целевой столбец как одну метку, я в конечном итоге создаю 3 модели.Но есть ли способ конвертировать все 3 цели (они двоичные - 0 или 1) в метки.

Например, если я возьму каждый столбец цели отдельно, то мой слой MLPC будет выглядеть так:

target_1 >> layers = [3, 5, 4, 2]
target_2 >> layers = [3, 5, 4, 2]
target_3 >> layers = [3, 5, 4, 2]

Поскольку целевой столбец содержит только 0 или 1. Могу ли я создать слой, как показано ниже,

layers = [3, 5, 4, 3]

3 выводит для каждого целевого столбца, они должны давать выходные данные 0 или 1 из каждого выходанейрон.

from pyspark.ml.classification import MultilayerPerceptronClassifier

trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers,blockSize=128, seed=1234)

Я пытался объединить все цели в одну метку,

assembler_label = VectorAssembler(
    inputCols=['target_1', 'target_2', 'target_3'],
    outputCol="label")
output_with_label = assembler_label.transform(output)

И полученные данные выглядят так:

+---+----+-------+--------+--------+--------+--------------+-------------+
| id|days|product|target_1|target_2|target_3|      features|        label|
+---+----+-------+--------+--------+--------+--------------+-------------+
|  1|   6|     55|       1|       0|       1|[1.0,6.0,55.0]|[1.0,0.0,1.0]|
|  2|   3|     52|       0|       1|       0|[2.0,3.0,52.0]|[0.0,1.0,0.0]|
|  3|   4|     53|       1|       1|       1|[3.0,4.0,53.0]|[1.0,1.0,1.0]|
|  1|   5|     53|       1|       0|       0|[1.0,5.0,53.0]|[1.0,0.0,0.0]|
|  2|   2|     53|       1|       0|       0|[2.0,2.0,53.0]|[1.0,0.0,0.0]|
|  3|   1|     54|       0|       1|       0|[3.0,1.0,54.0]|[0.0,1.0,0.0]|
+---+----+-------+--------+--------+--------+--------------+-------------+

Когда я пыталсясоответствовать данным,

model = trainer.fit(output_with_label)

я получил ошибку,

IllegalArgumentException: u'requirement failed: Column label must be of type numeric but was actually of type struct<type:tinyint,size:int,indices:array<int>,values:array<double>>.'

Итак, есть ли способ обработки данных, подобных этой?

...