PySpark & ​​Tensorflow - фиктивные строковые данные кодирования - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу фиктивно закодировать (или аналогичные) данные, чтобы передать их Keras.

Сейчас я обрабатываю свои табличные данные с помощью Spark, а затем обучаю их с помощью Keras.

Я получил столбец со строковыми данными и не могу передать его непосредственно Keras, поэтому мне нужно преобразовать его в целые числа.

Я уже сделал StringIndexer + OneHotEncoding, но дело в том, что я получилстолбцы разреженного вектора, и это не то, что я хочу, я хочу дать Керасу.

data = sqlContext.createDataFrame(
    [(1, "a", 23.0, "mak"), (3, "B", -23.0, "kaks"), (3, "a", -22.0, "kaks"), (3, "a", -22.0, "chochon")], ("x1", "x2", "x3", "x4"))

data.show()

+---+---+-----+-------+--------+--------+-------------+-------------+
| x1| x2|   x3|     x4|x2_index|x4_index|    x2_vector|    x4_vector|
+---+---+-----+-------+--------+--------+-------------+-------------+
|  1|  a| 23.0|    mak|     0.0|     1.0|(1,[0],[1.0])|(2,[1],[1.0])|
|  3|  B|-23.0|   kaks|     1.0|     0.0|    (1,[],[])|(2,[0],[1.0])|
|  3|  a|-22.0|   kaks|     0.0|     0.0|(1,[0],[1.0])|(2,[0],[1.0])|
|  3|  a|-22.0|chochon|     0.0|     2.0|(1,[0],[1.0])|    (2,[],[])|
+---+---+-----+-------+--------+--------+-------------+-------------+

Есть ли у вас что-то, что нужно сделать, чтобы дать «хорошие данные» керасу?

I though something like that : 
+---+---+-----+-------+--------+--------+-------------+-------------+-------------+-------------+
| x1| x2|   x3|     x4|x2_index|x4_index|    x2_vector|         x4_0|         x4_1|         x4_2|
+---+---+-----+-------+--------+--------+-------------+-------------+-------------+-------------+
|  1|  a| 23.0|    mak|     0.0|     1.0|(1,[0],[1.0])|            1|            0|            0|
|  3|  B|-23.0|   kaks|     1.0|     0.0|    (1,[],[])|            0|            1|            0|
|  3|  a|-22.0|   kaks|     0.0|     0.0|(1,[0],[1.0])|            0|            1|            0|
|  3|  a|-22.0|chochon|     0.0|     2.0|(1,[0],[1.0])|            0|            0|            1|
+---+---+-----+-------+--------+--------+-------------+-------------+-------------+-------------+

Но я не знаю, хорошо ли это делать тоже.

1 Ответ

0 голосов
/ 05 ноября 2019

Я собираюсь частично повторить то, что вы имеете в виду, с колонкой x4. Я предполагаю, что вы хотите превратить строки в числа для использования ML, а не редкие векторы.

Код

from pyspark.ml.feature import StringIndexer
from pyspark.ml.feature import OneHotEncoderEstimator

data = spark.createDataFrame(
    [('mak',), ('kaks',), ('kaks',), ('chochon',)], ('x4',))

indexer = StringIndexer(inputCol='x4', outputCol='x4_index')
indexed = indexer.fit(data).transform(data)

encoder = OneHotEncoderEstimator(inputCols=['x4_index'],outputCols=['x4_vector'], dropLast=False)
encoded = encoder.fit(indexed).transform(indexed)

#at this stage, you have
#encoded.show()
#+-------+--------+-------------+
#|     x4|x4_index|    x4_vector|
#+-------+--------+-------------+
#|    mak|     2.0|(3,[2],[1.0])|
#|   kaks|     0.0|(3,[0],[1.0])|
#|   kaks|     0.0|(3,[0],[1.0])|
#|chochon|     1.0|(3,[1],[1.0])|
#+-------+--------+-------------+

#further process it one more step to get what you have in mind
def mfunc(row):
    return [row['x4'],row['x4_index']] + list(map(int,row['x4_vector'].toArray().tolist()))

encoded.rdd.map(mfunc).toDF(['x4','x4_index', 'x4_0', 'x4_1', 'x4_2']).show()

#+-------+--------+----+----+----+
#|     x4|x4_index|x4_0|x4_1|x4_2|
#+-------+--------+----+----+----+
#|    mak|     2.0|   0|   0|   1|
#|   kaks|     0.0|   1|   0|   0|
#|   kaks|     0.0|   1|   0|   0|
#|chochon|     1.0|   0|   1|   0|
#+-------+--------+----+----+----+

#alternatively, if you want dense vectors, then use this
from pyspark.mllib.linalg import DenseVector

def mfunc1(row):
    return [row['x4'],row['x4_index']] + [list(map(int, DenseVector(row['x4_vector'])))]

encoded.rdd.map(mfunc1).toDF(['x4','x4_index', 'x4_dense']).show()

#+-------+--------+---------+
#|     x4|x4_index| x4_dense|
#+-------+--------+---------+
#|    mak|     2.0|[0, 0, 1]|
#|   kaks|     0.0|[1, 0, 0]|
#|   kaks|     0.0|[1, 0, 0]|
#|chochon|     1.0|[0, 1, 0]|
#+-------+--------+---------+

Я надеюсь, что один из них работает с Keras и поможет вам решить, что"хорошо".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...