2015-09-04 16 views
10

GridSearchCVで推定値としてSupport Vector Regressionを使用しています。しかし、私はエラー関数を変更したい:デフォルト(R-二乗:決定の係数)を使用する代わりに、自分のカスタムエラー関数を定義したいと思う。scikit-learnで独自のスコアラー機能を作成/カスタマイズする方法は?

make_scorerで作成しようとしましたが、機能しませんでした。

私はドキュメントを読んでcustom estimatorsを作成することができますが、エスカレータ全体を再作成する必要はなく、エラー/スコアリング機能のみを再作成する必要はありません。

私はそれがdocsのように、スコアリング担当者としてコール可能を定義することによってそれを行うことができると思います。

しかし、推測子の使用方法はわかりません。私の場合はSVRです。分類器(SVCなど)に切り替える必要がありますか?そして私はそれをどのように使用しますか?次のように

マイカスタムエラー機能は次のとおりです。

def my_custom_loss_func(X_train_scaled, Y_train_scaled): 
    error, M = 0, 0 
    for i in range(0, len(Y_train_scaled)): 
     z = (Y_train_scaled[i] - M) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) > 0: 
      error_i = (abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z)) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) < 0: 
      error_i = -(abs((Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z))) 
     if X_train_scaled[i] > M and Y_train_scaled[i] < M: 
      error_i = -(abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(-z)) 
    error += error_i 
    return error 

変数Mは/ゼロnullではありません。単純化のためにゼロに設定しました。

このカスタムスコアリング関数のサンプルアプリケーションは誰でも表示できますか?ご協力いただきありがとうございます!

+0

例:(estimator、X、y) – daniel2014

+0

回答のうちの1つを良いものとしてマークすることを忘れないでください。ありがとう:) – astrojuanlu

答えて

11

ご覧のとおり、これはmake_scorerdocs)を使用して行われます。

from sklearn.grid_search import GridSearchCV 
from sklearn.metrics.scorer import make_scorer 
from sklearn.svm import SVR 

import numpy as np 

rng = np.random.RandomState(1) 

def my_custom_loss_func(X_train_scaled, Y_train_scaled): 
    error, M = 0, 0 
    for i in range(0, len(Y_train_scaled)): 
     z = (Y_train_scaled[i] - M) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) > 0: 
      error_i = (abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z)) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) < 0: 
      error_i = -(abs((Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z))) 
     if X_train_scaled[i] > M and Y_train_scaled[i] < M: 
      error_i = -(abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(-z)) 
    error += error_i 
    return error 

# Generate sample data 
X = 5 * rng.rand(10000, 1) 
y = np.sin(X).ravel() 

# Add noise to targets 
y[::5] += 3 * (0.5 - rng.rand(X.shape[0]/5)) 

train_size = 100 

my_scorer = make_scorer(my_custom_loss_func, greater_is_better=True) 

svr = GridSearchCV(SVR(kernel='rbf', gamma=0.1), 
        scoring=my_scorer, 
        cv=5, 
        param_grid={"C": [1e0, 1e1, 1e2, 1e3], 
           "gamma": np.logspace(-2, 2, 5)}) 

svr.fit(X[:train_size], y[:train_size]) 

print svr.best_params_ 
print svr.score(X[train_size:], y[train_size:]) 
+0

こんにちは。私はmake_scorerを知っていますが、私は条件付きを含む新しい関数を定義したいと思います。どうすれば関数エラーの中で "if"と "for"を使うことができますか?ありがとう。 – daniel2014

+0

申し訳ありませんが、私は問題を理解していません。あなたがしようとしていることは私には分かりません。 –

+0

私は英語がとても不十分です。申し訳ありません。 "my_custom_loss_function"の内部で "if条件付き"と "for"を使用しようとしています。等
DEF my_custom_loss_func(X_train_scaled、Y_train_scaled): 誤差、M = 0、0の範囲(0、LEN(Y_train_scaled))におけるiに対する : Z =(Y_train_scaled [I] - M) X_train_scaledなら[I]> MとY_train_scaled [i]> Mと(X_train_scaled [i] - Y_train_scaled [i])> 0:...
これを行うことはできますか?私のラップトップはブロックされたようだそして私は "X_train_scaled"内のすべての私のデータを一つずつ見てそれを操作したいと思っています。ありがとう。 – daniel2014

12

ジェイミーは肉付け例がありますが、ここからまっすぐmake_scorerを使用した例ですscikit-学ぶdocumentationは:

import numpy as np 
def my_custom_loss_func(ground_truth, predictions): 
    diff = np.abs(ground_truth - predictions).max() 
    return np.log(1 + diff) 

# loss_func will negate the return value of my_custom_loss_func, 
# which will be np.log(2), 0.693, given the values for ground_truth 
# and predictions defined below. 
loss = make_scorer(my_custom_loss_func, greater_is_better=False) 
score = make_scorer(my_custom_loss_func, greater_is_better=True) 
ground_truth = [[1, 1]] 
predictions = [0, 1] 
from sklearn.dummy import DummyClassifier 
clf = DummyClassifier(strategy='most_frequent', random_state=0) 
clf = clf.fit(ground_truth, predictions) 
loss(clf,ground_truth, predictions) 

score(clf,ground_truth, predictions) 

sklearn.metrics.make_scorerを経由してカスタム得点を定義し、大会は、カスタム関数がで終わるということです_scoreは、最大化する値を返します。 _lossまたは_errorで終わるスコアラーの場合、最小値に戻されます。この機能を使用するにはgreater_is_betterパラメータをmake_scorerに設定します。つまり、このパラメータは、値が高いほど得点が高い場合はTrue、値が小さいほどスコアが高い場合はFalseとなります。 GridSearchCVは、適切な方向に最適化できます。

from sklearn.metrics.scorer import make_scorer 

def custom_loss_func(X_train_scaled, Y_train_scaled): 
    error, M = 0, 0 
    for i in range(0, len(Y_train_scaled)): 
     z = (Y_train_scaled[i] - M) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) > 0: 
      error_i = (abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z)) 
     if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) < 0: 
      error_i = -(abs((Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z))) 
     if X_train_scaled[i] > M and Y_train_scaled[i] < M: 
      error_i = -(abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(-z)) 
    error += error_i 
    return error 


custom_scorer = make_scorer(custom_loss_func, greater_is_better=True) 

をそして、あなたは他のあらゆるスコアリング関数としてGridSearchCVcustom_scorerを渡す:

あなたは次のように得点王としてあなたの関数に変換することができclf = GridSearchCV(scoring=custom_scorer)

+0

ありがとうございます。私はScikitでこのドキュメントを読んで、カスタム関数についても読んだが、うまくいきませんでした。その後、Jamie Bullは彼の "make_scorer"を書いて、もう一度試しました...それは動作します!私はどのように、なぜそれがわからないのですか?私はWindows 10にchanchingし、すべての私のプログラムを再インストールしていた:それはあったかもしれない:Windows 10と新しいバージョンのAnaconda(私はAnacondaの下でPythonを実行する)。とにかく、ありがとう! (私はプログラマーやコンピュータ科学者ではないので、私には難しい)。 – daniel2014

関連する問題