考虑以下示例
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
但是,我有两个主要问题:
如何在样本中评估此分类器的性能?准确度指标在哪里?
更重要的是,如何使用此训练模型预测新值,例如,在以下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
谢谢!
答案 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_*_evaluator
和ml_*_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
备注强>:
如果您使用# 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
用于汇编的自变量。features
,rawPrediction
,prediction
分别用于原始预测,预测和概率列。