scikit-learn 中的 MultiOutputRegressors 和 MultiOutputClassifiers 是否也使用目标作为输入?
Do MultiOutputRegressors and MultiOutputClassifiers in scikit-learn use the targets as inputs as well?
我开始在 sci-kit 学习中使用 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 算法可能会寻找目标值之间的相关性,但我希望它们实际上被轮换为我的应用程序中算法的输入(或有效输入)。
看源码函数,在def fit(self, X, Y, **fit_params),好像是把response分开,单独拟合。此外,因为它可以接受很多回归器/分类器。我无法想象估计输出之间的这种关系来包含这么多模型。
如果你正在寻找考虑响应变量之间关系的东西,你可以查看这个
下面是一个使用线性回归的示例,表明系数在多重或迭代单个输出下是相似的:
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]
如果我没理解错的话,你在 post 中描述的方法似乎不是你链接论文中的任何一种方法。
论文中的第一种方法,Stacked Single Target,可能可以通过 StackingRegressor
来实现,尽管这需要一些修改,以便基本模型仅向前传递对其指定输出的预测.
论文中的第二种方法,回归链的集成,应该非常简单,使用 RegressorChain
class,设置 cv
,然后集成多个 order
s.
您描述的方法似乎不能作为 sklearn 内置函数使用,尽管循环和拟合单个模型应该不会太难?
我开始在 sci-kit 学习中使用 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 算法可能会寻找目标值之间的相关性,但我希望它们实际上被轮换为我的应用程序中算法的输入(或有效输入)。
看源码函数,在def fit(self, X, Y, **fit_params),好像是把response分开,单独拟合。此外,因为它可以接受很多回归器/分类器。我无法想象估计输出之间的这种关系来包含这么多模型。
如果你正在寻找考虑响应变量之间关系的东西,你可以查看这个
下面是一个使用线性回归的示例,表明系数在多重或迭代单个输出下是相似的:
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]
如果我没理解错的话,你在 post 中描述的方法似乎不是你链接论文中的任何一种方法。
论文中的第一种方法,Stacked Single Target,可能可以通过 StackingRegressor
来实现,尽管这需要一些修改,以便基本模型仅向前传递对其指定输出的预测.
论文中的第二种方法,回归链的集成,应该非常简单,使用 RegressorChain
class,设置 cv
,然后集成多个 order
s.
您描述的方法似乎不能作为 sklearn 内置函数使用,尽管循环和拟合单个模型应该不会太难?