可以使用 scikit-learn 进行多输出、svr 或 gbm 的回归吗?

机器算法验证 回归 Python scikit-学习
2022-03-12 11:05:49

我一直在尝试使用 scikit-learn 进行回归,但存在这样的多个输出问题:

X = np.random.random((10,3))
y = np.random.random((10,2))
X2 = np.random.random((7,3))
clf = SVR()
clf.fit(X, y)
y_pred = clf.predict(X2)

问题是这行不通。它失败了:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

有谁知道如何在 scikit-learn 中处理具有多个输出的回归?

编辑。我注意到 RandomForestRegressor、KNeighborsRegressor 和 LinearRegression 都可以工作,但 rf 是唯一一个在我的数据集上接近于好的方法!有什么适合的方法SVRgbm

4个回答

为什么不制作一个适合m回归器的包装器(m每个的维度在哪里y)呢?

class VectorRegression(sklearn.base.BaseEstimator):
    def __init__(self, estimator):
        self.estimator = estimator

    def fit(self, X, y):
        n, m = y.shape
        # Fit a separate regressor for each column of y
        self.estimators_ = [sklearn.base.clone(self.estimator).fit(X, y[:, i])
                               for i in range(m)]
        return self

    def predict(self, X):
        # Join regressors' predictions
        res = [est.predict(X)[:, np.newaxis] for est in self.estimators_]
        return np.hstack(res)

注意:我没有测试过这段代码,但你明白了。

Scikit-Learn 还有一个通用类MultiOutputRegressor,可用于使用单输出回归模型,并为每个目标分别拟合一个回归量。

然后您的代码将如下所示(以 k-NN 为例):

from sklearn.neighbors import KNeighborsRegressor
from sklearn.multioutput import MultiOutputRegressor

X = np.random.random((10,3))
y = np.random.random((10,2))
X2 = np.random.random((7,3))

knn = KNeighborsRegressor()
regr = MultiOutputRegressor(knn)

regr.fit(X,y)
regr.predict(X2)

从编辑中回答问题。我猜自然支持 MultiOutput 目标的算法表现最好。这是因为这些算法同时计算多个输出变量,因此考虑了输出之间可能的相关性。如果您使用MultiOutputRegressorfrom sklearn 单独拟合每个输出变量的模型则情况并非如此。

SVR 自然只支持单输出回归。但是可以进行不同的调整以使算法也适合多输出回归任务。有关广泛的概述,请查看此存储库的参考部分中的论文。

您可以在此处找到在 python 中实现多输出支持向量回归的示例它基于论文Multi-step-ahead time series prediction using multiple-output support vector regression

您可能还想查看这个答案

我认为 scikit-learn 仅支持决策树中的多输出回归器DecisionTreeRegressor