参考サイト:
- scikit-learnでサポートベクトル回帰、及びそのパラメーター推計 with クロスバリデーションやってみる
- いろいろな予測誤差の指標について
- scikit-learn で回帰モデルの結果を評価する
- scikit-learn cross validation, negative values with mean squared error
参考コード:
(1) 平均2乗誤差(MSE)でマイナス値が出る問題
sklearnでは、仕様上、MSEでマイナス値がでてしまう。それは、sklearnでは、大きい値ほど良いスコアとの判断なので、回帰モデルでそのまま使うと誤差の一番大きな値が一番良いモデルとなってしまう。
そこで、回帰モデルのスコアリングでは、呼び出されるsklearn.metrics.make_scorer()メソッドのgreater_is_betterパラメーターが自動でFalseになることで、スコアに−1が掛けられた値の中で最大の値を一番いいスコアとすることで、最小値を良いスコアとして判定できるようになっている。なので、MSE値のマイナス値を単純にプラスに置き換えればMSEスコアとなる。
(2) GridSearchCV()で、scoringパラメーターに、独自関数を指定する方法。
例)スコアにr2スコアとMSEスコアの両方を指定するコード
from sklearn.metrics import r2_score, mean_squared_error, make_scorer
from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import Ridge
def MSE(y_true,y_pred):
mse = mean_squared_error(y_true, y_pred)
print 'MSE: %2.3f' % mse
return mse
def R2(y_true,y_pred):
r2 = r2_score(y_true, y_pred)
print 'R2: %2.3f' % r2
return r2
def two_score(y_true,y_pred):
MSE(y_true,y_pred) #set score here and not below if using MSE in GridCV
score = R2(y_true,y_pred)
return score
def two_scorer():
return make_scorer(two_score, greater_is_better=True) # change for false if using MSE
model = Ridge()
param_grid = {'alpha':[0.1,1,10]}
X_train = [[1,2],[1,5],[-3,2],[3,7],[-1,1],[0,-1]]
y_train = [1,0,1,0,3,5]
grid = GridSearchCV(model, param_grid, scoring=two_scorer())
grid.fit(X_train, y_train)
best_params = grid.best_params_
model = grid.best_estimator_
score = grid.best_score_
for item in grid.grid_scores_:
print "\t%s %s %s" % ('\tGRIDSCORES\t', "R" , item)
print '%s\tHP\t%s\t%f' % ("R" , str(best_params) ,abs(score))
>出力結果
0コメント