Evalml: stdoutからのsklearnUndefinedMetric警告を抑制します(F1スコア)

作成日 2020年03月02日  ·  6コメント  ·  ソース: alteryx/evalml

モデルのトレーニング中に、次のような警告が表示されます

Screen Shot 2020-03-02 at 4 54 36 PM

私はこのような呼び出しでより具体的にそれをトリガーすることができます

from evalml.objectives import F1

f1 = F1()
f1.score(y_predicted=[0, 0],
         y_true=[0, 1])

扱い方に関して。 これが頭に浮かぶことです

  1. automl検索プロセス中は完全に無音になります。 スコアをnanまたはメトリックの最悪のスコアに置き換えます。 次に、エラーメッセージを結果ディクショナリのどこかに保存します。
  2. 複数行を使用しない、よりクリーンな警告メッセージを作成します
enhancement

全てのコメント6件

ええ、これを修正する必要があります。 一般に、コードで印刷されない限り、stdoutに何も出力されないようにする必要があります。

これは#311に関係しているのだろうか。

このsklearnstdout出力を抑制し、可能であれば独自の警告メッセージを作成するという、両方の提案を行う必要があると思います。

@christopherbunn RE会議でこれについて言及しましたが、これを進行中としてマークする必要がありますか?

@christopherbunn @jeremyliweishih私はこれについてzero_division=0.0 、すべての精度とf1の目的(バイナリとマルチクラス)に

説明
精度n_true_pos / (n_true_pos + n_false_pos)です。 したがって、モデルが問題のデータ分割で特定のラベルをまったく予測しない場合、そのラベルの真または偽陽性はないため、0による除算が行われます。f1についても同様です。

口論
クラスのバランスをうまく取っていると仮定しましょう(現在は行っていませんが、別のトピック、#194#457です)。 その場合、トレーニングまたは検証の分割に特定のクラスのインスタンスがほとんど含まれない可能性はほとんどありません。 そして、それを仮定でき、モデルが特定のラベルの予測をまだ行っていない場合、それは貧弱なモデルであると主張します。したがって、精度とf1の両方で0である可能な限り低いスコアを与える必要があります。

いいね?

In [38]: import numpy as np

In [39]: import sklearn.metrics

In [40]: y_true = np.array([0, 0, 0, 0, 1])

In [41]: y_pred = np.array([0, 0, 0, 0, 0])

In [42]: sklearn.metrics.precision_score(y_true, y_pred)
/Users/dylan.sherry/.pyenv/versions/3.8.2/envs/evalml/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
Out[42]: 0.0

In [43]: sklearn.metrics.precision_score(y_true, y_pred, zero_division=0.0)
Out[43]: 0.0

@dsherryは私には理にかなっています。 これが現在行っていることだと思いますが、警告もあります(デフォルトでは「警告」に設定され、0に設定され、警告も投稿されるため)

@jeremyliweishihええ!

@christopherbunnからこれを取得して、今週、彼が決勝戦と戦うときにマージできるようにします:)

このページは役に立ちましたか?
0 / 5 - 0 評価