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
,然后在多个 order
s 上集成。
您描述的方法似乎不能作为内置的 sklearn 使用,尽管循环并适合单个模型应该不会太难?
【讨论】:
以上是关于scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是不是也使用目标作为输入?的主要内容,如果未能解决你的问题,请参考以下文章