scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是不是也使用目标作为输入?

Posted

技术标签:

【中文标题】scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是不是也使用目标作为输入?【英文标题】:Do MultiOutputRegressors and MultiOutputClassifiers in scikit-learn use the targets as inputs as well?scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是否也使用目标作为输入? 【发布时间】:2021-03-04 00:44:18 【问题描述】:

我开始在 sci-kit learn 中使用MultiOutputRegressor 来处理我尝试使用随机森林估计的多变量目标。

在遇到此 MultiOutputRegressor 之前,我确实开始手动实现,并尝试旋转单个输出回归器的输出,以便在任何给定时间使用单个目标 - 并将其他目标变量用作输入 - 但它是变得计算成本高昂。

我已经搜索并查看了一些代码,但正在努力确定目标输出 (y) 是否用作输入特征 (X)。具体来说:

在预测 y_1 时,是否将 y_2 ... y_n 用作输入特征? 在预测 y_x 时,是否将 y_1 ... y_n(不包括 y_x)用作输入特征? 在预测 y_n 时,是否将 y_1 ... y_n-1 用作输入特征? (抱歉,如果我过于冗长)

论文“Multi-target regression via input space expansion”解释了我想要实现的目标。

一些答案​​暗示 MultiOutputRegressor 算法可能会寻找目标值之间的相关性,但我希望它们实际上被旋转为我的应用程序中算法的输入(或有效输入)。

【问题讨论】:

为什么会发生这样的事情? 【参考方案1】:

查看源代码函数,在def fit(self, X, Y, **fit_params),它似乎将响应分开并分别适合它们。此外,因为它可以接受大量的回归器/分类器。我无法想象估计输出之间的这种关系来包含这么多模型。

如果您正在寻找考虑响应变量之间关系的东西,您可以查看此post, using a Guassian process

以下是使用线性回归的示例,以显示在多重或迭代单个输出下系数相似:

from sklearn.multioutput import MultiOutputRegressor
from sklearn.linear_model import LinearRegression

np.random.seed(111)

mean = [0, 2]
cov = [[1, 0.3], [0.3, 3]]  

y = np.random.multivariate_normal(mean, cov, 100)
X = np.random.normal(0,1,(100,2))

regr_multi = MultiOutputRegressor(LinearRegression())
regr_multi.fit(X, y)

regr_list = [LinearRegression().fit(X,y[:,i]) for i in range(y.shape[1])]

print(regr_multi.estimators_[0].coef_ , regr_list[0].coef_)

[-0.04355358 -0.03379101] [-0.04355358 -0.03379101]

print(regr_multi.estimators_[1].coef_ , regr_list[1].coef_)

[ 0.2921806 -0.1372799] [ 0.2921806 -0.1372799]

【讨论】:

【参考方案2】:

如果我理解正确,您在帖子中描述的方法似乎不是您链接论文中的任何一种方法。

论文中的第一种方法 Stacked Single Target 可能可以使用StackingRegressor 来完成,尽管这需要一些黑客攻击,以便基础模型仅传递对其分配输出的预测。

论文中的第二种方法,回归链集成,应该非常简单,使用 RegressorChain 类,设置 cv,然后在多个 orders 上集成。

您描述的方法似乎不能作为内置的 sklearn 使用,尽管循环并适合单个模型应该不会太难?

【讨论】:

以上是关于scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是不是也使用目标作为输入?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中的随机森林解释

scikit-learn 中的 DBSCAN(仅使用指标)

scikit-learn 中的不平衡

混淆矩阵中的 Scikit-learn 变化阈值

GradientBoostingClassifier 与 scikit-learn 中的 BaseEstimator?

如何修复 scikit-learn 中的令牌模式?