2017-04-21 57 views
2

多変量回帰問題(2つの応答変数:緯度と経度)を考えてみましょう。現在、Support Vector Regression sklearn.svm.SVRのようないくつかの機械学習モデルの実装では、多変量回帰をネイティブにサポートしていません。この目的のために、sklearn.multioutput.MultiOutputRegressorを使用することができる。GridSearch over MultiOutputRegressor?

例:

from sklearn.multioutput import MultiOutputRegressor 
svr_multi = MultiOutputRegressor(SVR(),n_jobs=-1) 

#Fit the algorithm on the data 
svr_multi.fit(X_train, y_train) 
y_pred= svr_multi.predict(X_test) 

私の目標は、sklearn.model_selection.GridSearchCVによってチューニングするSVRのパラメータです。理想的には、応答が単一の変数と複数でなかった場合は、次のように、私が操作を実行します:私の応答y_trainは2次元であるとして

from sklearn.svm import SVR 
from sklearn.model_selection import GridSearchCV 
from sklearn.pipeline import Pipeline 

pipe_svr = (Pipeline([('scl', StandardScaler()), 
        ('reg', SVR())])) 

grid_param_svr = { 
    'reg__C': [0.01,0.1,1,10], 
    'reg__epsilon': [0.1,0.2,0.3], 
    'degree': [2,3,4] 
} 

gs_svr = (GridSearchCV(estimator=pipe_svr, 
        param_grid=grid_param_svr, 
        cv=10, 
        scoring = 'neg_mean_squared_error', 
        n_jobs = -1)) 

gs_svr = gs_svr.fit(X_train,y_train) 

をしかし、私はSVRの上にMultiOutputRegressorを使用する必要があります。このGridSearch操作を有効にするために上記のコードを変更するにはどうすればよいですか?可能でない場合は、より良い選択肢がありますか?

答えて

3

解決策を見つけました。ネストされた推定器の場合、内部推定器のパラメータはestimator__によってアクセスできます。

from sklearn.multioutput import MultiOutputRegressor 
from sklearn.svm import SVR 
from sklearn.model_selection import GridSearchCV 
from sklearn.pipeline import Pipeline 

pipe_svr = Pipeline([('scl', StandardScaler()), 
     ('reg', MultiOutputRegressor(SVR()))]) 

grid_param_svr = { 
    'reg__estimator__C': [0.1,1,10] 
} 

gs_svr = (GridSearchCV(estimator=pipe_svr, 
         param_grid=grid_param_svr, 
         cv=2, 
         scoring = 'neg_mean_squared_error', 
         n_jobs = -1)) 

gs_svr = gs_svr.fit(X_train,y_train) 
gs_svr.best_estimator_  

Pipeline(steps=[('scl', StandardScaler(copy=True, with_mean=True, with_std=True)), 
('reg', MultiOutputRegressor(estimator=SVR(C=10, cache_size=200, 
coef0=0.0, degree=3, epsilon=0.1, gamma='auto', kernel='rbf', max_iter=-1,  
shrinking=True, tol=0.001, verbose=False), n_jobs=1))])