web-dev-qa-db-ja.com

多次元ターゲットによる回帰

scikit-learnを使用して回帰を行っていますが、問題は次のとおりです。いくつかのパラメーター(ベクトル)で回帰を行う必要があります。これは、_ensemble.ExtraTreesRegressor_や_ensemble.RandomForestRegressor_などのいくつかの回帰アプローチで正常に機能します。実際、2つの前述の回帰法のモデル(fit(X,y)法)に適合するターゲットとしてベクトルのベクトルを与えることができます。

ただし、_ensemble.GradientBoostingRegressor_、_ensemble.AdaBoostRegressor_、および_linear_model.SGDRegressor_を試してみると、1次元の値をターゲットとして想定しているため、分類子はモデルに適合しません(fit(X,y)のy引数)。方法)。つまり、これらの回帰法では、一度に1つのパラメーターしか推定できません。これは私の問題には適していません。約20個のパラメーターを推定する必要があるときに時間がかかる場合があるためです。一方で、私は本当にそれらのアプローチをテストしたいと思います。

だから、私の質問は:モデルを一度適合させて_ensemble.GradientBoostingRegressor_、_ensemble.AdaBoostRegressor_および_linear_model.SGDRegressor_のいくつかのパラメーターを推定する解決策があるかどうか誰かが知っていますか?

私は十分に明確になっていると思います...

15
user1120168

私はあなたが持っているのは 多変量回帰 の問題であると解釈します。

Scikit-learnのすべての回帰メソッドがこの種の問題を処理できるわけではないため、それぞれのドキュメントを参照して見つける必要があります。特に、 SGDRegressorGradientBoostingRegressorAdaBoostRegressor も現時点ではこれをサポートしていません:fit(X, y)はXを指定します:配列のような、 shape = [n_samples、n_features]およびy:配列のような、shape = [n_samples]。

ただし、scikit-learnでは他の方法を使用できます。たとえば、線形モデル:

from sklearn import linear_model
# multivariate input
X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
# univariate output
Y = [0., 1., 2., 3.]
# multivariate output
Z = [[0., 1.], [1., 2.], [2., 3.], [3., 4.]]

# ordinary least squares
clf = linear_model.LinearRegression()
# univariate
clf.fit(X, Y)
clf.predict ([[1, 0.]])
# multivariate
clf.fit(X, Z)
clf.predict ([[1, 0.]])

# Ridge
clf = linear_model.BayesianRidge()
# univariate
clf.fit(X, Y)
clf.predict ([[1, 0.]])
# multivariate
clf.fit(X, Z)
clf.predict ([[1, 0.]])

# Lasso
clf = linear_model.Lasso()
# univariate
clf.fit(X, Y)
clf.predict ([[1, 0.]])
# multivariate
clf.fit(X, Z)
clf.predict ([[1, 0.]])
22
emiguevara

すでに述べたように、一部のモデルのみが多変量出力をサポートしています。他のいずれかを使用する場合は、多変量出力のリグレッサの並列化に新しいクラスを使用できます: MultiOutputRegressor

次のように使用できます。

from sklearn.datasets import load_linnerud
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.multioutput import MultiOutputRegressor

linnerud = load_linnerud()

X = linnerud.data
Y = linnerud.target

# to set number of jobs to the number of cores, use n_jobs=-1
MultiOutputRegressor(GradientBoostingRegressor(), n_jobs=-1).fit(X, Y)
15
jstriebel