Регрессия с многомерными целями

Я использую scikit-learn для регрессии, и моя проблема заключается в следующем. Мне нужно сделать регрессию по нескольким параметрам (векторам). Это отлично работает с некоторыми подходами к регрессии, такими как ансамбль .ExtraTreesRegressor и ансамбль. RandomForestRegressor. Действительно, вектор двух векторов в качестве мишеней может соответствовать вектору (метод fit (X, y)) для двух вышеупомянутых методов регрессии. Однако, когда я пытаюсь использовать ансамбль .GradientBoostingRegressor, ensemble.AdaBoostRegressor и linear_model.SGDRegressor, классификатор не подходит для модели, потому что он ожидает 1D-значений в качестве целей (аргумент y метода fit (X, y)). Это означает, что с помощью этих методов регрессии я могу оценить только один параметр за раз. Это не подходит для моей проблемы, потому что это может занять некоторое время, так как мне нужно оценить около 20 параметров. С другой стороны, я действительно хотел бы попробовать эти подходы.

Итак, мой вопрос: кто-нибудь знает, есть ли решение, чтобы соответствовать модели один раз и оценить несколько параметров для ансамбля. GradientBoostingRegressor, ensemble.AdaBoostRegressor и linear_model.SGDRegressor?

Надеюсь, я был достаточно ясен...

Ответ 1

Я интерпретирую, что у вас есть проблема множественной многомерной регрессии.

Не каждый метод регрессии в scikit-learn может справиться с такой проблемой, и вы должны проконсультироваться с документацией каждого из них, чтобы узнать это. В частности, ни SGDRegressor, GradientBoostingRegressor, ни AdaBoostRegressor поддерживает это на данный момент: fit(X, y) указывает X: array-like, shape = [n_samples, n_features] и y: array-like, 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.]])

Ответ 2

Как уже упоминалось, только некоторые модели поддерживают многомерный вывод. Если вы хотите использовать один из других, вы можете использовать новый класс для распараллеливания регрессоров для многомерного вывода: 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)