Создание One-Hot Encoder.CountVectorizer возвращает ошибку с ArrayType (IntergerType, true) - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь создать один горячий кодировщик для следующих входных данных:

+------+--------------------+
|userid|     categoryIndexes|
+------+--------------------+
| 24868|              [7276]|
| 35335|             [12825]|
| 42634| .    [14550, 14550]|
| 51183|              [7570]|
| 61065|             [14782]|
| 70292|              [7282]|
| 72326|      [14883, 14877]|
| 96632|             [14902]|
| 99703|             [14889]|
|121994|       [16000, 7417]|
|144782|      [12139, 12139]|
|175886|        [7305, 7305]|
|221451|      [14889, 12139]|
|226945|             [18097]|
|250401|              [7278]|
|256892|        [7383, 5514]|
|270043|              [7442]|
|272338|              [7306]|
|284802|      [18310, 14898]|
+------+--------------------+

Ссылаясь на Объединение функции горячего кодирования в pyspark и Кодирование и сборканесколько функций в PySpark , я пытаюсь решить ее с помощью

from pyspark.ml.feature import CountVectorizer

df_user_catlist = df_order.groupBy("userid").agg(F.collect_list('level3_cat').alias('categoryIndexes'))
cv = CountVectorizer(inputCol='categoryIndexes', outputCol='categoryVec')
transformed_df = cv.fit(df_user_catlist).transform(df_user_catlist)
transformed_df.show()

Но поймал следующую ошибку

IllegalArgumentException: u'requirement failed: Column category must be of type equal to one of the following types: [ArrayType(StringType,true), ArrayType(StringType,false)] but was actually of type ArrayType(IntegerType,true).'

Я заметил разницу в том, что входные данные вместо IntegerTypeиз StringType, могу я узнать (а) как я могу преобразовать его в StringType, или есть лучший способ преобразовать его в OHE?

1 Ответ

0 голосов
/ 25 сентября 2018

Вам нужно привести строку к индексам категории:

from pyspark.sql import functions as F

df_user_catlist = df_user_catlist \
    .withColumn('categoryIndexes', 
         F.col('categoryIndexes').cast('array<string>'))
...