2016-09-05 4 views
1
evaluator = BinaryClassificationEvaluator() 
    grid = ParamGridBuilder().build() # no hyper parameter optimization 
    cv = CrossValidator(estimator=pipeline, estimatorParamMaps=grid, evaluator=evaluator) 
    cvModel = cv.fit(dataset) 
    evaluator.evaluate(cvModel.transform(dataset)) 

戻り値:pysparkのBinaryClassificationEvaluator avgMetricsが1より大きな値を返すのはなぜですか?

  • cvModel.avgMetrics = [1.602872634746238]
  • evaluator.evaluate(cvModel.transform(dataset)) = 0.7267754950388204

質問:それはROCの下の領域であれば

  1. どうavgMetricは1(1.6)よりも大きくすることができますか?
  2. スキーマevaluator.evaluate(cvModel.transform(dataset))は、実際にトレーニングメトリックを返しますが、クロス検証メトリックは返しませんか? (適合と評価の両方にdatasetを使用しました)

答えて

2

最近ではfixedのバグです。しかし、まだリリースされていません。

は、あなたが提供するものに基づいて、私はこの問題を再現するには、次のコードを使用:

from pyspark.ml.classification import LogisticRegression 
from pyspark.ml.evaluation import BinaryClassificationEvaluator 
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator 
from pyspark.ml.linalg import Vectors 
from pyspark.sql.types import Row 

dataset = sc.parallelize([ 
    Row(features=Vectors.dense([1., 0.]), label=1.), 
    Row(features=Vectors.dense([1., 1.]), label=0.), 
    Row(features=Vectors.dense([0., 0.]), label=1.), 
]).toDF() 

evaluator = BinaryClassificationEvaluator(metricName="areaUnderROC") 
grid = ParamGridBuilder().addGrid('maxIter', [100, 10]).build() # no hyper parameter optimization 
cv = CrossValidator(estimator=LogisticRegression(), estimatorParamMaps=grid, evaluator=evaluator) 
cvModel = cv.fit(dataset) 
evaluator.evaluate(cvModel.transform(dataset)) 

Out[23]: 1.0 

cvModel.avgMetrics 

Out[34]: [2.0, 2.0] 
簡単に言えば

avgMetricsは折り目

渡って、平均していない、合算ました

編集:

秒について

to_test = sc.parallelize([ 
    Row(features=Vectors.dense([1., 0.]), label=1.), 
    Row(features=Vectors.dense([1., 1.]), label=0.), 
    Row(features=Vectors.dense([0., 1.]), label=1.), 
]).toDF() 

evaluator.evaluate(cvModel.transform(to_test)) 

Out[2]: 0.5 

これは、関数呼び出しがテストデータセットにメトリックを返します確認:質問は、検証するための最も簡単な方法は、テストデータセットを提供することです。

+0

ありがとうございました。第2弾にお答えください。 schemato evaluator.evaluate(cvModel.transform(dataset))は実際にクロスバリデーションメトリックではなくトレーニングメトリックを返しますか? (フィットと評価の両方にデータセットを使用しました) –

+0

私の編集をご覧ください。列車/検証のためにデータセットを使用すべきではありません。 – ShuaiYuan

+0

* same * dataset :) – ShuaiYuan

関連する問題