На самом деле нет необходимости использовать OneHotEncoder
/ OneHotEncoderEstimator
для меток (целевые переменные) , и вам на самом деле не следует.Это создаст вектор (type org.apache.spark.ml.linalg.VectorUDT
).
StringIndexer
достаточно, чтобы определить, что ваши ярлыки являются категориальными.
Давайте проверим это в небольшом примере:
val df = Seq((0, "a"),(1, "b"),(2, "c"),(3, "a"),(4, "a"),(5, "c")).toDF("category", "text")
// df: org.apache.spark.sql.DataFrame = [category: int, text: string]
val indexer = new StringIndexer().setInputCol("category").setOutputCol("categoryIndex").fit(df)
// indexer: org.apache.spark.ml.feature.StringIndexerModel = strIdx_cf691c087e1d
val indexed = indexer.transform(df)
// indexed: org.apache.spark.sql.DataFrame = [category: int, text: string ... 1 more field]
indexed.schema.map(_.metadata).foreach(println)
// {}
// {}
// {"ml_attr":{"vals":["4","5","1","0","2","3"],"type":"nominal","name":"categoryIndex"}}
Как вы заметили, StringIndexer
фактически прикрепляет метаданные к этому столбцу (categoryIndex
) и помечает его как nominal
aka категоричны .
Вы также можете заметить, что в атрибуте столбца у вас есть список категорий.
Подробнее об этом в моем другом ответе о Как обрабатывать категориальные функции с помощью spark-мл?
Относительно подготовка данных и метаданные с spark-ml , я настоятельно рекомендую вам прочитать следующую запись:
https://github.com/awesome-spark/spark-gotchas/blob/5ad4c399ffd2821875f608be8aff9f1338478444/06_data_preparation.md
Отказ от ответственности: Я являюсь соавтором записи в ссылке.
Примечание: (выдержка из документа)
Поскольку этот существующий OneHotEncoder
является преобразователем без сохранения состояния, его нельзя использовать для новых данных, где количество категорий может отличаться от данных обучения.Чтобы это исправить, был создан новый OneHotEncoderEstimator, который выдает OneHotEncoderModel
при подгонке.Для получения более подробной информации см. SPARK-13030 .
OneHotEncoder
устарел устарел в 2.3.0 и будет удален в 3.0+0,0.Пожалуйста, используйте OneHotEncoderEstimator
вместо.