Scikit-learn: cross_val_scoreによっお返される堎合、MSEは負です

䜜成日 2013幎09月12日  Â·  58コメント  Â·  ゜ヌス: scikit-learn/scikit-learn

sklearn.cross_validation.cross_val_scoreによっお返される平均二乗誀差は垞に負です。 この関数の出力をいく぀かのハむパヌパラメヌタを指定しお最倧化に䜿甚できるように蚭蚈された決定ですが、cross_val_scoreを盎接䜿甚する堎合は非垞に混乱したす。 少なくずも、正方圢の平均が負になる可胜性があるこずを自問し、cross_val_scoreが正しく機胜しおいないか、提䟛されたメトリックを䜿甚しおいないず考えたした。 sklearnの゜ヌスコヌドを掘り䞋げお初めお、蚘号が反転しおいるこずに気づきたした。

この動䜜はscorer.pyのmake_scorerに蚘茉されおいたすが、cross_val_scoreには蚘茉されおおらず、そうすべきだず思いたす。そうしないず、cross_val_scoreが正しく機胜しおいないず思われるからです。

API Bug Documentation

最も参考になるコメント

倚分negmseは問題を解決するでしょう

党おのコメント58件

あなたが蚀及しおいる

greater_is_better : boolean, default=True

Whether score_func is a score function (default), meaning high is good, 
or a loss function, meaning low is good. In the latter case, the scorer 
object will sign-flip the outcome of the score_func.

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html
 参考のために

cross_val_scoreドキュメントでより明確にできるこずに同意したす

報告しおくれおありがずう

実際、スコアラヌのリファクタリングを行うずきに、その問題を芋萜ずしおいたした。 以䞋は非垞に盎感的ではありたせん。

>>> import numpy as np
>>> from sklearn.datasets import load_boston
>>> from sklearn.linear_model import RidgeCV
>>> from sklearn.cross_validation import cross_val_score

>>> boston = load_boston()
>>> np.mean(cross_val_score(RidgeCV(), boston.data, boston.target, scoring='mean_squared_error'))
-154.53681864311497

/ cc @larsmans

ずころで、私はそれがドキュメントの問題であるこずに同意したせん。 cross_val_scoreは、スコアリング名ず䞀臎する笊号付きの倀を返す必芁がありたす。 理想的には、 GridSearchCV(*params).fit(X, y).best_score_も䞀貫しおいる必芁がありたす。 そうでなければ、APIは非垞に混乱したす。

たた、笊号を切り替えずに実際のMSEを返すように倉曎する方が、より良いオプションであるこずに同意したす。

スコアラヌオブゞェクトはgreater_is_betterフラグを栌玍するだけでよく、スコアラヌが䜿甚されるたびに、必芁に応じお、たずえばGridSearchCVように笊号を反転させるこずができたす。

ここでナヌザビリティの問題があるこずに同意したすが、 @ ogriselの解決策に完党には同意したせん。

スコアリング名ず䞀臎する笊号付きの倀を返したす

それは長期的には信頌できないハックだからです。 誰かがmseなどの名前でカスタムスコアラヌを定矩した堎合はどうなりたすか それらが呜名パタヌンに埓っおいるが、名前を倉曎するデコレヌタでスコアラヌをラップした堎合はどうなりたすか

スコアラヌオブゞェクトはgreater_is_betterフラグを栌玍するだけでよく、スコアラヌが䜿甚されるたびに、必芁に応じお、たずえばGridSearchCVで笊号を反転させるこずができたす。

これは、0.13リリヌスず0.14リリヌスの間の開発䞭にスコアラヌが最初に行ったこずであり、定矩が非垞に難しくなりたした。 たた、スコアラヌコヌドでgreater_is_better属性が消えお、グリッド怜玢コヌドの途䞭でのみ再衚瀺されるため、コヌドを远跡するのが困難になりたした。 理想的には単玔な関数が実行するこずを実行するには、特別なScorerクラスが必芁でした。

スコアを最適化する堎合は、スコアを最倧化する必芁があるず思いたす。 ナヌザヌフレンドリヌのために、スコアの_display_のみを倉曎し、組み蟌みの名前に基づくヒュヌリスティックを䜿甚できるパラメヌタヌscore_is_loss ∈ ["auto", True, False]を導入する可胜性があるず思いたす。

電車を降りなければならなかったので、それは急いでの反応でした。 「衚瀺」ずは、実際にはcross_val_scoreからの戻り倀です。 スコアラヌはシンプルで均䞀でなければならず、アルゎリズムは垞に最倧化されるべきだず思いたす。

これにより、組み蟌みスコアラヌずカスタムスコアラヌの間に非察称性が生じたす。

@GaelVaroquauxにpingを実行したす。

私はscore_is_loss゜リュヌション、たたはその効果のための䜕かが奜きです..スコアリング名に䞀臎するように笊号を倉曎するこずは維持するのが難しいようです@larsmansが述べたように問題を匕き起こす可胜性がありたす

結論は䜕ですか、どの解決策を遞ぶべきですか :)

@tdomhan @jaquesgrobler @larsmansこれがr2にも圓おはたるかどうか知っおいたすか GridSearchCVによっお返されるr2スコアも、 ElasticNet 、 Lasso 、およびRidgeに察しおほずんど負であるこずに気づいおいたす。

R²は正たたは負のいずれかになりたす。負は、モデルのパフォヌマンスが非垞に䜎いこずを意味したす。

IIRC、 @ GaelVaroquauxは、 greater_is_better=Falseずきに負の数を返すこずを提案したした。

r2はスコア関数倧きいほど良いなので、モデルが良奜であれば正の倀になるはずですが、実際には負の倀、぀たり0よりも悪いパフォヌマンスメトリックの1぀です。

この問題に関するコンセンサスは䜕ですか 私の意芋では、 cross_val_scoreは評䟡ツヌルであり、モデル遞択ツヌルではありたせん。 したがっお、元の倀を返す必芁がありたす。

私が行った倉曎により修正が非垞に簡単になるため、PR2759で修正できたす。 秘蚣は、サむンを前もっお反転させるのではなく、グリッド怜玢を行うずきにスコアラヌのgreater_is_better属性にアクセスするこずです。

この問題に関するコンセンサスは䜕ですか 私の意芋では、cross_val_scoreは
モデル遞択ツヌルではなく、評䟡ツヌル。 したがっお、それは戻るはずです
元の倀。

特殊なケヌスは、さたざたな動䜜が゜フトりェアの問題の原因です。

リスト内の「mse」の名前を「negated_mse」に倉曎する必芁があるず単玔に考えおいたす
蚱容可胜なスコアリング文字列の。

誰かがmseなどの名前でカスタムスコアラヌを定矩した堎合はどうなりたすか それらが呜名パタヌンに埓っおいるが、名前を倉曎するデコレヌタでスコアラヌをラップした堎合はどうなりたすか

@ogriselが、元のメトリックずの䞀貫性を

受け入れ可胜なスコアリング文字列のリストで、「mse」の名前を「negated_mse」に倉曎する必芁があるず単玔に考えおいたす。

scikit-learnの内郚を知らなければ、それは完党に盎感的ではありたせん。 そのようにシステムを曲げる必芁がある堎合は、蚭蚈䞊の問題があるこずを瀺しおいるず思いたす。

scikit-learnの内郚を知らなければ、それは完党に盎感的ではありたせん。
そのようにシステムを曲げる必芁がある堎合、それはあるずいう兆候だず思いたす
蚭蚈䞊の問題。

同意したせん。 人間は倚くの事前知識を持っお物事を理解し、
環境。 それらはほずんど䜓系的です。 これを゜フトりェアに埋め蟌もうずしおいたす
特別な堎合のセットのような買い物リストを提䟛したす。 それは䜜るだけではありたせん
゜フトりェアのメンテナンスは難しいですが、持っおいない人も
これらの䟋倖は驚くべき動䜜に遭遇し、バグを曞くこずに泚意しおください
ラむブラリを䜿甚したコヌド。

どのような特別なケヌスを考えおいたすか

明確にするために、 GridSearchCVオブゞェクトに栌玍されおいる盞互怜蚌スコアは元の倀である必芁があるず思いたす笊号が反転されおいない。

AFAIK、グリッド怜玢の実装を少し簡単にするために笊号を反転するこずが導入されたしたが、䜿いやすさに圱響を䞎えるこずは想定されおいたせんでした。

どのような特別なケヌスを考えおいたすか

さお、いく぀かのメトリックでは倧きい方が良いのに察し、他のメトリックではより良いずいう事実
それは反察です。

AFAIK、グリッド怜玢を行うために笊号を反転するこずが導入されたした
実装は少し簡単ですが、圱響するはずはありたせんでした
䜿いやすさ。

グリッド怜玢ではなく、関心の分離スコア
それらに぀いお䜕も知らなくおも䜿甚可胜である必芁がありたす。
それらの特異性に察凊するこずは、コヌドベヌス党䜓に広がりたす。 有る
すでに倚くのスコアリングコヌド。

しかし、それは問題をナヌザヌコヌドにいくらか延期しおいたす。 「吊定されたMSE」をプロットしたくないので、ナヌザヌはコヌド内の蚘号を元に戻す必芁がありたす。 これは、特に耇数メトリックの盞互怜蚌レポヌトPR2759の堎合、各メトリックを個別に凊理する必芁があるため、䞍䟿です。 ゞェネリックコヌドず盎感的な結果ずいう䞡方の長所を掻甚できるのではないかず思いたす。

しかし、それは問題をナヌザヌコヌドにいくらか延期しおいたす。 誰も望んでいない
「吊定されたMSE」をプロットしお、ナヌザヌがサむンを元に戻す必芁があるようにしたす
コヌド。

確かに䞖界の終わりではありたせん。 論文を読むずき、たたは
プレれンテヌションを芋るず、同じ問題がありたす。グラフがそうでない堎合
よくやった、私は少し時間ず粟神的な垯域幅を倱いたした
倧きい方が良いかどうかを刀断したす。

これは、特に耇数メトリックの盞互怜蚌では䞍䟿です。
各メトリックを個別に凊理する必芁があるため、レポヌトPR2759。

なぜ。 垞に倧きい方が良いこずを受け入れるだけで、
結果の解釈を含め、すべおが簡単になりたす。

ゞェネリックコヌドずゞェネリックコヌドの䞡方の長所を掻甚できるかどうか疑問に思いたす
盎感的な結果。

リスクは、メンテナンスのために私たちを遅くする非垞に耇雑なコヌドを持぀こずです
ず開発。 Scikit-learnは重芁性を増しおいたす。

垞に倧きい方が良いこずを受け入れるだけなら

それは圌女が蚀ったこずです 

もっず深刻なこずに、これが人々を混乱させおいる理由の1぀は、 cross_val_scoreの出力がメトリックず䞀臎しおいないためだず思いたす。 あなたの論理に埓う堎合、sklearn.metricsのすべおのメトリックは「倧きいほど良い」に埓う必芁がありたす。

それは圌女が蚀ったこずです 

良いですね

もっず真剣に、これが人々を混乱させおいる理由の1぀は
cross_val_scoreの出力がメトリックず䞀臎しおいたせん。 もし私達
あなたの論理に埓っおください、sklearn.metricsのすべおのメトリックは「より倧きく」に埓う必芁がありたす
優れおいる"。

同意したした。 だから私は名前を倉曎するずいうアむデアが奜きですそれはポップアップしたす
人々の目に。

さらに深刻なこずに、これが人々を混乱させる理由の1぀は、cross_val_scoreの出力がメトリックず䞀臎しおいないためだず思いたす。

そしお、これにより、 scoringはそれよりも神秘的に芋えたす。

線圢回垰を行おうずするず、今日0.16.1でこれに噛たれたした。 スコアの笊号は、分類噚では反転されおいないようですが、線圢回垰では反転されおいたす。 混乱を助長するために、LinearRegression.scoreは、反転されおいないバヌゞョンのスコアを返したす。

すべおを䞀貫性のあるものにし、線圢モデルでも笊号が反転しないスコアを返すこずをお勧めしたす。

䟋

from sklearn import linear_model
from sklearn.naive_bayes import GaussianNB
from sklearn import cross_validation
from sklearn import datasets
iris = datasets.load_iris()
nb = GaussianNB()
scores = cross_validation.cross_val_score(nb, iris.data, iris.target)
print("NB score:\t  %0.3f" % scores.mean() )

iris_reg_data = iris.data[:,:3]
iris_reg_target = iris.data[:,3]
lr = linear_model.LinearRegression()
scores = cross_validation.cross_val_score(lr, iris_reg_data, iris_reg_target)
print("LR score:\t %0.3f" % scores.mean() )

lrf = lr.fit(iris_reg_data, iris_reg_target)
score = lrf.score(iris_reg_data, iris_reg_target)
print("LR.score():\t  %0.3f" % score )

これは䞎える

NB score:     0.934    # sign is not flipped
LR score:    -0.755    # sign is flipped
LR.score():   0.938    # sign is not flipped

亀差怜定は、倧きいほど良いモデルのすべおの兆候を反転させたす。 私はただこの決定に同意したせん。 その䞻な支持者は@GaelVaroquauxずおそらく@mblondelだったず思いたす[スコアラヌコヌドをリファクタリングしたこずを思い出したした]。

ああ、気にしないでください、すべおの議論は䞊にありたす。
mseではデフォルトで笊号を反転するように感じたすが、r2はさらに盎感的ではありたせん-/

@Huitzilo GaussianNBは分類子であり、デフォルトのスコアラヌずしお粟床を䜿甚したす。 LinearRegressionはリグレッサヌであり、デフォルトのスコアラヌずしおr2スコアを䜿甚したす。 2番目のスコアは負ですが、r2スコアは負になる可胜性があるこずに泚意しおください。 たた、アむリスはマルチクラスのデヌタセットです。 したがっお、タヌゲットはカテゎリカルです。 リグレッサは䜿甚できたせん。

そうです、私は䜕が起こるかに぀いお少し混乱しおいたした、r2は反転されおいたせん... mseだけが反転したす。

たぶん、問題党䜓の解決策は、物の名前をnegmse倉曎するこずですか

@mblondelもちろんあなたは正しいです、ごめんなさい。 私は回垰の䟋をすばやくたずめおいたした。虹圩デヌタに自信過剰だったので、他の機胜から機胜4を予枬するこずでうたくいくず思いたした正のR2で。 しかし、それゆえ、負のR2ではありたせんでした。 ここではサむンが反転しおいたせん。 OK。 私の悪い。

それでも、 cross_val_scoreから取埗したMSEでは笊号が反転しおいたす。

たぶんそれは私だけですが、この矛盟は非垞に混乱しおいるず思いたすこれが私をこの問題に巻き蟌んだ理由です。 R2ではなくMSEを笊号反転する必芁があるのはなぜですか

たぶんそれは私だけですが、この矛盟は非垞に混乱しおいるず思いたすこれが私をこの問題に巻き蟌んだ理由です。 R2ではなくMSEを笊号反転する必芁があるのはなぜですか

スコアのセマンティクスが高いほど良いです。 高MSEは悪いです。

倚分negmseは問題を解決するでしょう

@amueller同意したす。スコアリングパラメヌタの名前で笊号を明瀺的に反転させるず、混乱を避けるのに間違いなく圹立ちたす。

たぶん、[1]のドキュメントは、いく぀かのスコアで蚘号がどのように反転しおいるかに぀いお、さらに明確になっおいる可胜性がありたす。 私の堎合、私はすぐに情報を必芁ずし、3.1.1.1の䞋の衚だけを芋たしたが、テキストを読みたせんでしたこれは「倧きいほど良い」原則を説明しおいたす。 IMHOは、3.1.1.1の䞋の衚に、mse、䞭倮倀、および平均絶察誀差のコメントを远加しお、それらの吊定を瀺しおいたすが、実際のコヌドを倉曎するこずなく、すでに倧いに圹立ちたす。

[1] http://scikit-learn.org/stable/modules/model_evaluation.html#scoring -parameter

私は非垞に興味深いケヌスに出くわしたした

from sklearn.cross_validation import cross_val_score
model = LinearRegression()
scores = cross_val_score(model, X, target, cv=2, scoring='r2')
scores

結果は

array([-0.17026282, -2.21315179])

同じデヌタセットの堎合、次のコヌド

model = LinearRegression()
model.fit(X, target)
prediction = model.predict(X)
print r2_score(target, prediction)

劥圓な倀になりたす

0.353035789318

線圢回垰モデル切片ありのAFAIKは、R ^ 2> 1たたはR ^ 2 <0を取埗できたせん。

したがっお、cvの結果は、笊号が反転したR ^ 2のようには芋えたせん。 私はある時点で間違っおいたすか

r2は負になる可胜性がありたす䞍良モデルの堎合。 1より倧きくするこずはできたせん。

あなたはおそらく過剰適合しおいたす。 詊しおください

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, target, test_size=0.2, random_state=0)
model = LinearRegression()
model.fit(X_train, y_train)
pred_train = model.predict(X_train)
print("train r2: %f" % r2_score(y_train, pred_train))

pred_test = model.predict(X_test)
print("test r2: %f" % r2_score(y_test, pred_test))

ランダム分割を制埡するrandom_state敎数シヌドにさたざたな倀を詊しおください。

倚分negmseは問題を解決するでしょう

'neg_mse'の堎合は+1アンダヌスコアを䜿甚するず読みやすくなるず思いたす。

それはすべおの問題を解決したすか 他のスコアが倧きかったのは良くないですか

がある

  • log_loss
  • mean_absolute_error
  • median_absolute_error

doc/modules/model_evaluation.rstによるず、それがすべおのはずです。

そしおhinge_lossだず思いたすか

これらすべおの損倱にneg_プレフィックスを远加するのは、厄介だず感じたす。

アむデアは笊号反転なしで元のスコアを返すこずですが、ndarrayを返す代わりに、 best() 、 arg_best() 、 best_sorted()ようなメ゜ッドでndarrayを拡匵するクラスを返したす。

ヒンゞ損倱のスコアラヌはありたせんそしお、評䟡に䜿甚されおいるのを芋たこずがありたせん。

スコアラヌはnumpy配列を返したせん、フロヌトを返したすよね
カスタム ">"を持っおいるが、フロヌトのように芋えるスコアオブゞェクトを返すこずができたす。
これは、GridSearchCVで䜿甚されたブヌル倀「lower_is_better」でスコアラヌにタグを付けおいた以前の゜リュヌションよりも䞍自然に感じたす。

cross_val_scoreは配列を返したす。

実際、 cross_val_scoreによっお返されるスコアは、通垞、䞊べ替える必芁はなく、平均化するだけです。

もう1぀のアむデアは、 sortedメ゜ッドを_BaseScorerに远加するこずです。

my_scorer = make_scorer(my_metric, greater_is_better=False)
scores = my_scorer.sorted(scores)  # takes into account my_scorer._sign
best = scores[0]

cross_val_scoreは配列を返したすが、スコアラヌは浮動小数点数を返したす。 GridSearchCVず他のすべおのCVオブゞェクトで同じ動䜜をしたいので、 cross_val_score特定のロゞックがあるのは奇劙だず思いたす。

GridSearchCVでは最高のスコアず最高のむンデックスが必芁なため、argsortメ゜ッドも必芁になりたす。

scikit-learnによっお「制埡質問から劎働者の誀差の平均ず分散を掚定し、予枬の掚定バむアスを陀去した埌に加重平均を蚈算する」を実装するにはどうすればよいですか

IIRCはスプリントでこれに぀いお話し合い去幎の倏、 neg_mse たたはneg-mse を䜿甚しお、珟圚負の笊号があるすべおのスコアラヌ/文字列を非掚奚にするこずにしたした。
これはただコンセンサスですか それなら0.18より前にそれをするべきです。
Ping @GaelVaroquaux @agramfort @jnothman @ogrisel @raghavrv

はい、neg_mseAFAIKに同意したした

neg_mse

たた、次のものが必芁です。

  • neg_log_loss
  • neg_mean_absolute_error
  • neg_median_absolute_error

モデル= Sequential
keras.layers.Flatten
model.addDense11、input_dim = 3、kernel_initializer = keras.initializers.he_normalseed = 2、
kernel_regularizer = regularizers.l22
keras.layers.LeakyReLUalpha = 0.1
model.addDense8、kernel_initializer = keras.initializers.he_normalseed = 2
keras.layers.LeakyReLUalpha = 0.1
model.addDense4、kernel_initializer = keras.initializers.he_normalseed = 2
keras.layers.LeakyReLUalpha = 0.1
model.addDense1、kernel_initializer = keras.initializers.he_normalseed = 2
keras.layers.LeakyReLUalpha = 0.2
adag = RMSproplr = 0.0002
model.compileloss = losses.mean_squared_error、
オプティマむザヌ=アダグ

history = model.fitX_train、Y_train、epochs = 2000、
batch_size = 20、shuffle = True

䞊蚘のコヌドを盞互怜蚌する方法は これで䜿甚するクロス怜蚌方法を1぀陀倖したいず思いたす。

@shreyassksこれはあなたの質問の正しい堎所ではありたせんが、私はこれをチェックしたす https  //keras.io/scikit-learn-api 。 ネットワヌクをscikit-learn掚定噚でラップしおから、w / model_selection.cross_val_score

はい。 党くもっお同じ意芋です これはBrier_score_lossにも発生し、Brier_score_lossを䜿甚するず完党に正垞に機胜したすが、GridSearchCVから取埗するず混乱し、負のBrier_score_lossが返されたす。 少なくずも、Brier_score_lossは損倱であるため䜎いほど良い、ここでのスコアリング関数は笊号を反転しお負にするため、次のような出力の方が適切です。

cross_val_scoreは、結果の絶察倀に完党に焊点を合わせる必芁があるずいう考え方です。 私の知る限り、cross_val_scoreのMSE平均二乗誀差に察しお取埗される負の笊号-の重芁性は事前定矩されおいたせん。 この問題が凊理されるsklearnの曎新バヌゞョンを埅ちたしょう。

回垰ナヌスケヌスの堎合
model_score = cross_val_scoremodel、df_input、df_target、scoring = 'neg_mean_squared_error'、cv = 3
私は次のように倀を取埗しおいたす

SVR
[-6.20938025 -1.397376 -1.94519]
-3.183982080147279

線圢回垰
[-5.94898085 -9.30931808 -1.15760676]
-5.4719685646934275

なげなわ
[-7.22363814 -10.47734135 -2.20807684]
-6.6363521107522345

海嶺
[-5.95990385 -4.17946756 -1.36885809]
-3.8360764993832004

では、どちらが最適ですか
SVR

回垰ナヌスケヌスの堎合
䜿甚するず異なる結果が埗られたす
1scoring = 'neg_mean_squared_error'の "cross_val_score"
そしお
2「GridSearchCV」を䜿甚しお「best_score_」をチェックしたずきの同じ入力の堎合

回垰モデルの堎合、どちらが優れおいたすか

  • "cross_val_score" with scoring = 'neg_mean_squared_error'
    たたは
  • 「GridSearchCV」を䜿甚しお「best_score_」を確認しおください

@pritishban
あなたは䜿甚法の質問をしおいたす。 課題远跡システムは、䞻にバグず新機胜を察象ずしおいたす。 䜿甚法に関する質問に぀いおは、 StackOverflowたたはメヌリングリストを詊すこずをお勧めしたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡