如何在sparklyr中训练ML模型并在另一个数据帧上预测新值?

时间:2018-05-25 17:26:26

标签: r apache-spark apache-spark-ml sparklyr

考虑以下示例

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

这里我有一个经典的Naive Bayes示例,其中class标识了属于China类别的文档。

我可以通过执行以下操作在sparklyr中运行Naives Bayes分类器:

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测试数据框中?

  3. 测试数据:

    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 :(得分:7)

  

如何评估样本中此分类器的性能?准确度指标在哪里?

一般而言(有些模型提供某种形式的摘要),对训练数据集的评估是Apache Spark中的一个单独步骤。这非常适合原生Pipeline API。

<强>背景

Spark ML Pipelines主要由两种类型的对象构建:

  • Transformers - 提供transform方法的对象,将DataFrame映射到更新的DataFrame

    您可transform Transformer使用ml_transform方法。

  • Estimators - 提供fit方法的对象,将DataFrame映射到Transfomer。按照惯例,相应的Estimator / Transformer对称为Foo / FooModel

    您可以fit使用Estimator模型sparklyr ml_fit

此外,ML管道可以与Evaluators(请参阅ml_*_evaluatorml_*_eval方法)结合使用,这些方法可用于根据模型生成的列计算转换数据的不同指标(通常是概率列或原始预测)。

您可以使用Evaluator方法应用ml_evaluate

相关组件是否包括交叉验证器和列车验证拆分,可用于参数调整。

<强>实施例

sparklyr PipelineStages可以通过直接传递数据,或者通过传递spark_connection实例并调用上述方法({{1})来急切地评估(如在您自己的代码中) },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") )

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

备注

  • 请记住,Spark的多项Naive Bayes实施considers only binary feature (0 or not 0)
  • 如果您使用# dontrun ml_cross_validator( dtrain_spark, pipeline, list(nb=list(smoothing=list(0.8, 1.0))), # Note that name matches UID evaluator=evaluator) Pipelines列(而不是基于Vector的话),我强烈建议您使用标准化(默认)列名:

    • formula用于因变量。
    • label用于汇编的自变量。
    • featuresrawPredictionprediction分别用于原始预测,预测和概率列。