【问题标题】:Regression with multi-dimensional targets多维目标回归
【发布时间】:2014-02-28 15:59:45
【问题描述】:

我正在使用 scikit-learn 进行回归,我的问题如下。我需要对几个参数(向量)进行回归。这适用于一些回归方法,例如ensemble.ExtraTreesRegressorensemble.RandomForestRegressor。实际上,可以给出一个向量作为目标,以拟合上述两种回归方法的模型(fit(X,y) 方法)。

但是,当我尝试使用 ensemble.GradientBoostingRegressorensemble.AdaBoostRegressorlinear_model.SGDRegressor 时,分类器无法拟合模型,因为它期望一维值作为目标(fit(X,y) 方法的 y 参数)。这意味着,使用这些回归方法,我一次只能估计一个参数。这不适合我的问题,因为我需要估计大约 20 个参数可能需要一些时间。另一方面,我真的很想测试这些方法。

所以,我的问题是:有谁知道是否有解决方案可以一次拟合模型并估计 ensemble.GradientBoostingRegressorensemble.AdaBoostRegressorlinear_model.SGDRegressor 的几个参数?

我希望我已经足够清楚了......

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    我理解你的问题是multiple multivariate regression的问题。

    并非 scikit-learn 中的每个回归方法都可以处理此类问题,您应该查阅每个回归方法的文档以找出答案。特别是,SGDRegressorGradientBoostingRegressorAdaBoostRegressor 目前都不支持此功能: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.]])
    

    【讨论】:

    • 您确定 Ridge 示例运行良好吗?我不认为它可以做多目标预测。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2023-03-26
      • 2020-01-02
      • 2021-10-28
      • 2018-12-04
      • 2017-10-14
      • 2017-12-12
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多