如何在 sparklyr 中训练 ML 模型并在另一个数据帧上预测新值?
How to train a ML model in sparklyr and predict new values on another dataframe?
考虑以下示例
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
不过,我有两个主要问题:
如何评估样本内分类器的性能?准确性指标在哪里?
更重要的是,我如何使用这个经过训练的模型来预测新值,比如说,在下面的 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
谢谢!
How can I assess the performance of this classifier in-sample? Where are the accuracy metrics?
一般来说(有一些模型提供某种形式的总结),对训练数据集的评估是 Apache Spark 中的一个单独步骤。这非常适合原生 Pipeline
API.
背景:
Spark ML 管道主要由两种类型的对象构建:
Transformers
- 提供 transform
方法的对象,将 DataFrame
映射到更新的 DataFrame
.
您可以 transform
使用 Transformer
和 ml_transform
方法。
Estimators
- 提供 fit
方法的对象,将 DataFrame
映射到 Transfomer
。按照惯例,相应的 Estimator
/ Transformer
对称为 Foo
/ FooModel
.
您可以在 sparklyr
中使用 ml_fit
模型 fit
Estimator
。
此外,ML Pipelines 可以与 Evaluators
(参见 ml_*_evaluator
和 ml_*_eval
方法)结合使用,后者可用于根据生成的列计算转换后数据的不同指标模型(通常是概率列或原始预测)。
您可以使用 ml_evaluate
方法申请 Evaluator
。
相关组件是否包括交叉验证器和训练验证拆分,可用于参数调整。
例子:
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")
)
适合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
Even more importantly, how can I use this trained model to predict new values, say, in the following spark test dataframe?
使用 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 的多项朴素贝叶斯实现 considers only binary feature (0 or not 0)。
如果将 Pipelines
与 Vector
列一起使用(不是基于 formula
的调用),我强烈建议使用标准化(默认)列名称:
label
为因变量。
features
用于组装自变量。
rawPrediction
、prediction
、probability
分别用于原始预测、预测和概率列。
考虑以下示例
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
不过,我有两个主要问题:
如何评估样本内分类器的性能?准确性指标在哪里?
更重要的是,我如何使用这个经过训练的模型来预测新值,比如说,在下面的
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
谢谢!
How can I assess the performance of this classifier in-sample? Where are the accuracy metrics?
一般来说(有一些模型提供某种形式的总结),对训练数据集的评估是 Apache Spark 中的一个单独步骤。这非常适合原生 Pipeline
API.
背景:
Spark ML 管道主要由两种类型的对象构建:
Transformers
- 提供transform
方法的对象,将DataFrame
映射到更新的DataFrame
.您可以
transform
使用Transformer
和ml_transform
方法。Estimators
- 提供fit
方法的对象,将DataFrame
映射到Transfomer
。按照惯例,相应的Estimator
/Transformer
对称为Foo
/FooModel
.您可以在
sparklyr
中使用ml_fit
模型fit
Estimator
。
此外,ML Pipelines 可以与 Evaluators
(参见 ml_*_evaluator
和 ml_*_eval
方法)结合使用,后者可用于根据生成的列计算转换后数据的不同指标模型(通常是概率列或原始预测)。
您可以使用 ml_evaluate
方法申请 Evaluator
。
相关组件是否包括交叉验证器和训练验证拆分,可用于参数调整。
例子:
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")
)
适合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
Even more importantly, how can I use this trained model to predict new values, say, in the following spark test dataframe?
使用 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 的多项朴素贝叶斯实现 considers only binary feature (0 or not 0)。
如果将
Pipelines
与Vector
列一起使用(不是基于formula
的调用),我强烈建议使用标准化(默认)列名称:label
为因变量。features
用于组装自变量。rawPrediction
、prediction
、probability
分别用于原始预测、预测和概率列。