首页 文章

回归与多维目标

提问于
浏览
12

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

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

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

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

2 回答

  • 21

    我解释你所拥有的是multiple multivariate regression的问题 .

    并非每个scikit-learn中的回归方法都可以处理这类问题,您应该查阅每个问题的文档以找出它 . 特别是,SGDRegressorGradientBoostingRegressorAdaBoostRegressor目前都不支持: fit(X, y) 指定X:类似数组,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.]])
    
  • 12

    如前所述,只有一些模型支持多变量输出 . 如果要使用其他一个,可以使用新类来并行化多变量输出的回归量: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)
    

相关问题