Обращение к категориальным функциям с помощью одного горячего кодирования и векторного ассемблера против векторного индексатора

Убедитесь, что это соответствует параметрам module:app и module:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }
0
задан desertnaut 16 January 2019 в 18:20
поделиться

1 ответ

OneHotEncoder(Estimator) и VectorIndexer - совершенно разные звери и не подлежат обмену. OneHotEncoder(Estimator) используется главным образом, когда последующий процесс использует линейную модель ( он также может быть использован с Наивным Байесом ).

Давайте рассмотрим простое Dataset

val df = Seq(1.0, 2.0, 3.0).toDF

и Pipeline

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature._

val m1 = new Pipeline().setStages(Array(
  new OneHotEncoderEstimator()
   .setInputCols(Array("value")).setOutputCols(Array("features"))
)).fit(df)

Если такая модель будет применена к нашим данным, она будет в одно касание -кодированный (в зависимости от конфигурации OneHotEncoderEstimator поддерживает как горячее, так и фиктивное кодирование) - другими словами, каждый уровень, исключая ссылку, будет представлен в виде отдельного двоичного столбца:

m1.transform(df).schema("features").metadata
[113 ]

Обратите внимание, что такое представление неэффективно и нецелесообразно для использования с алгоритмами, которые изначально обрабатывают категориальные функции.

Напротив, VectorIndexer только анализирует данные и соответственно корректирует метаданные

val m2 = new Pipeline().setStages(Array(
  new VectorAssembler().setInputCols(Array("value")).setOutputCol("raw"),
  new VectorIndexer().setInputCol("raw").setOutputCol("features")
)).fit(df)

m2.transform(df).schema("features").metadata
org.apache.spark.sql.types.Metadata = {"ml_attr":{"attrs":{"nominal":[{"ord":false,"vals":["1.0","2.0","3.0"],"idx":0,"name":"value"}]},"num_attrs":1}}

Другими словами, это более или менее эквивалентно векторизованному варианту StringIndexer (вы можете достичь аналогичного результата, с большим контролем над выводом, используя набор StringIndexers, за которым следует VectorAssembler).

Такие функции не подходят для линейных моделей , но являются действительными входными данными для деревьев решений и ансамблей деревьев.

Подводя итог - на практике OneHotEncoder(Esitmator) и VectorIndexer являются взаимоисключающими, и выбор, какой из них следует использовать, зависит от последующего процесса.

0
ответ дан user10465355 16 January 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: