как обучить модель ML в sparklyr и предсказать новые значения на другом кадре данных? - PullRequest
0 голосов
/ 25 мая 2018

Рассмотрим следующий пример

dtrain <- data_frame(text = c("Chinese Beijing Chinese",
                              "Chinese Chinese Shanghai",
                              "Chinese Macao",
                              "Tokyo Japan Chinese"),
                     doc_id = 1:4,
                     class = c(1, 1, 1, 0))

dtrain_spark <- copy_to(sc, dtrain, overwrite = TRUE)

> dtrain_spark
# Source:   table<dtrain> [?? x 3]
# Database: spark_connection
  text                     doc_id class
  <chr>                     <int> <dbl>
1 Chinese Beijing Chinese       1     1
2 Chinese Chinese Shanghai      2     1
3 Chinese Macao                 3     1
4 Tokyo Japan Chinese           4     0

Здесь у меня есть классический пример Наивного Байеса, где class идентифицирует документы, попадающие в категорию China.

Я могу запуститьНаивный байесовский классификатор в sparklyr делает следующее:

dtrain_spark %>% 
ft_tokenizer(input.col = "text", output.col = "tokens") %>% 
ft_count_vectorizer(input_col = 'tokens', output_col = 'myvocab') %>% 
  select(myvocab, class) %>%  
  ml_naive_bayes( label_col = "class", 
                  features_col = "myvocab", 
                  prediction_col = "pcol",
                  probability_col = "prcol", 
                  raw_prediction_col = "rpcol",
                  model_type = "multinomial", 
                  smoothing = 0.6, 
                  thresholds = c(0.2, 0.4))

, который выдает:

NaiveBayesModel (Transformer)
<naive_bayes_5e946aec597e> 
 (Parameters -- Column Names)
  features_col: myvocab
  label_col: class
  prediction_col: pcol
  probability_col: prcol
  raw_prediction_col: rpcol
 (Transformer Info)
  num_classes:  int 2 
  num_features:  int 6 
  pi:  num [1:2] -1.179 -0.368 
  theta:  num [1:2, 1:6] -1.417 -0.728 -2.398 -1.981 -2.398 ... 
  thresholds:  num [1:2] 0.2 0.4 

Однако у меня есть два основных вопроса:

  1. Как я могу оценить производительность этого классификатора в выборке?Где метрики точности?

  2. Что еще более важно, как я могу использовать эту обученную модель для прогнозирования новых значений, скажем, в следующем spark тестовом фрейме данных?

Данные испытаний:

dtest <- data_frame(text = c("Chinese Chinese Chinese Tokyo Japan",
                             "random stuff"))

dtest_spark <- copy_to(sc, dtest, overwrite = TRUE)

> dtest_spark
# Source:   table<dtest> [?? x 1]
# Database: spark_connection
  text                               
  <chr>                              
1 Chinese Chinese Chinese Tokyo Japan
2 random stuff 

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Как я могу оценить производительность этого классификатора в выборке?Где находятся показатели точности?

В целом (есть некоторые модели, которые предоставляют некоторую форму сводки), оценка набора обучающих данных - это отдельный шаг в Apache Spark.Это прекрасно вписывается в собственный Pipeline API.

Фон :

Spark ML Трубопроводы в основном создаются из двух типов объектов:

  • Transformers - объекты, которые предоставляют метод transform, который сопоставляет DataFrame с обновленным DataFrame.

    Вы можете transform, используя Transformer с ml_transform методом.

  • Estimators - объекты, которые предоставляют метод fit, которые отображают DataFrame в Transfomer.По соглашению соответствующие пары Estimator / Transformer называются Foo / FooModel.

    . Вы можете fit Estimator в sparklyr, используя ml_fit модель.

Кроме того, ML Pipelines можно комбинировать с Evaluators (см. ml_*_evaluator и ml_*_eval методы), которые можно использовать для вычисления различных метрик для преобразованных данных на основе столбцов, сгенерированных моделью (обычностолбец вероятности или необработанный прогноз).

Вы можете применить Evaluator, используя метод ml_evaluate.

Связанные компоненты включают в себя перекрестный валидатор и разбиения валидации поезда, которые можно использовать для настройки параметров.

Примеры :

sparklyr PipelineStages можно оценить с нетерпением (как в вашем собственном коде), передавая данные напрямую или лениво, передавая spark_connection экземпляр и вызов вышеупомянутых методов (ml_fit, ml_transform и т. д.).

Это означает, что вы можете определить Pipeline следующим образом:

pipeline <- ml_pipeline(
  ft_tokenizer(sc, input.col = "text", output.col = "tokens"),
  ft_count_vectorizer(sc, input_col = 'tokens', output_col = 'myvocab'),
  ml_naive_bayes(sc, label_col = "class", 
              features_col = "myvocab", 
              prediction_col = "pcol",
              probability_col = "prcol", 
              raw_prediction_col = "rpcol",
              model_type = "multinomial", 
              smoothing = 0.6, 
              thresholds = c(0.2, 0.4),
              uid = "nb")
)

Fit PipelineModel:

model <- ml_fit(pipeline, dtrain_spark)

Преобразование и применение одного из доступных Evaluators:

ml_transform(model, dtrain_spark) %>% 
  ml_binary_classification_evaluator(
    label_col="class", raw_prediction_col= "rpcol", 
    metric_name = "areaUnderROC")
[1] 1

или

evaluator <- ml_multiclass_classification_evaluator(
    sc,
    label_col="class", prediction_col= "pcol", 
    metric_name = "f1")

ml_evaluate(evaluator, ml_transform(model, dtrain_spark))
[1] 1

Еще более важно, как я могу использовать эту обученную модель для прогнозирования новых значений, скажем, в следующем фрейме данных искрового теста?

Используйте либо ml_transform, либо ml_predict (последний является убедительной оболочкой, которая применяет дальнейшие преобразования к выходу):

ml_transform(model, dtest_spark)
# Source:   table<sparklyr_tmp_cc651477ec7> [?? x 6]
# Database: spark_connection
  text                                tokens     myvocab   rpcol   prcol   pcol
  <chr>                               <list>     <list>    <list>  <list> <dbl>
1 Chinese Chinese Chinese Tokyo Japan <list [5]> <dbl [6]> <dbl [… <dbl …     0
2 random stuff                        <list [2]> <dbl [6]> <dbl [… <dbl …     1

Перекрестная проверка :

В примере недостаточно данных, но вы проверяете и подгоняете гиперпараметры, как показано ниже:

# dontrun
ml_cross_validator(
  dtrain_spark,
  pipeline, 
  list(nb=list(smoothing=list(0.8, 1.0))),  # Note that name matches UID
  evaluator=evaluator)

Примечания :

  • Пожалуйста, имейте в виду, что полиномиальная наивная байесовская реализация Spark учитывает только двоичную функцию (0 или нет 0) .
  • Если вы используетеPipelines с Vector столбцами (не для вызовов formula), я настоятельно рекомендую использовать стандартные (по умолчанию) имена столбцов:

    • label для зависимой переменной.
    • features для собранных независимых переменных.
    • rawPrediction, prediction, probability для необработанного прогнозирования, прогнозирования и рстолбцы робастности соответственно.
...