【问题标题】:ValueError: continuous-multioutput is not supportedValueError:不支持连续多输出
【发布时间】:2016-01-06 23:48:24
【问题描述】:

我想在一个包含大约 5,000 行和 6 个特征的数据集上运行多种回归类型(Lasso、Ridge、ElasticNet 和 SVR)。线性回归。使用 GridSearchCV 进行交叉验证。代码很广泛,但这里有一些关键部分:

def splitTrainTestAdv(df):

    y = df.iloc[:,-5:]  # last 5 columns
    X = df.iloc[:,:-5]  # Except for last 5 columns


    #Scaling and Sampling

    X = StandardScaler().fit_transform(X)

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)


return X_train, X_test, y_train, y_test

def performSVR(x_train, y_train, X_test, parameter):



    C = parameter[0]
    epsilon = parameter[1] 
    kernel = parameter[2]

    model = svm.SVR(C = C, epsilon = epsilon, kernel = kernel)
    model.fit(x_train, y_train)



return model.predict(X_test)  #prediction for the test

def performRidge(X_train, y_train, X_test, parameter):

    alpha = parameter[0]

    model = linear_model.Ridge(alpha=alpha, normalize=True) 
    model.fit(X_train, y_train)



return model.predict(X_test)  #prediction for the test

MODELS = {
    'lasso': (
        linear_model.Lasso(),
        {'alpha': [0.95]}
    ),
    'ridge': (
        linear_model.Ridge(),
        {'alpha': [0.01]}
        ),
    )
}


def performParameterSelection(model_name, feature, X_test, y_test, X_train, y_train):


    print("# Tuning hyper-parameters for %s" % feature)
    print()

    model, param_grid = MODELS[model_name]
    gs = GridSearchCV(model, param_grid, n_jobs= 1, cv=5, verbose=1, scoring='%s_weighted' % feature)


    gs.fit(X_train, y_train) 


    print("Best parameters set found on development set:")

    print(gs.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    for params, mean_score, scores in gs.grid_scores_:
        print("%0.3f (+/-%0.03f) for %r"
          % (mean_score, scores.std() * 2, params))

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")

    y_true, y_pred = y_test, gs.predict(X_test)
    print(classification_report(y_true, y_pred))

soil = pd.read_csv('C:/training.csv', index_col=0)
soil = getDummiedSoilDepth(soil)
np.random.seed(2015)
soil = shuffleData(soil)
soil = soil.drop('Depth', 1)

X_train, X_test, y_train, y_test = splitTrainTestAdv(soil)


scores = ['precision', 'recall']

for score in scores:




    for model in MODELS.keys():

        print '####################'
        print model, score
        print '####################'
        performParameterSelection(model, score, X_test, y_test, X_train, y_train)

您可以假设所有必需的导入都已完成

我收到此错误,不知道为什么:

ValueError                                Traceback (most recent call last)

在 () 18打印模型,得分 19打印'####################' ---> 20 performParameterSelection(model, score, X_test, y_test, X_train, y_train) 21

<ipython-input-27-304555776e21> in performParameterSelection(model_name,  feature, X_test, y_test, X_train, y_train)
     12     # cv=5 - constant; verbose - keep writing
     13 
---> 14     gs.fit(X_train, y_train) # Will get grid scores with outputs from ALL models described above
     15 
     16         #pprint(sorted(gs.grid_scores_, key=lambda x: -x.mean_validation_score))

C:\Users\Tony\Anaconda\lib\site-packages\sklearn\grid_search.pyc in fit(self, X, y)

C:\Users\Tony\Anaconda\lib\site-packages\sklearn\metrics\classification.pyc in _check_targets(y_true, y_pred)
     90     if (y_type not in ["binary", "multiclass", "multilabel-indicator",
     91                        "multilabel-sequences"]):
---> 92         raise ValueError("{0} is not supported".format(y_type))
     93 
     94     if y_type in ["binary", "multiclass"]:

ValueError: continuous-multioutput is not supported

我对 Python 还是很陌生,这个错误让我很困惑。当然,这不应该是因为我有 6 个功能。我尝试遵循标准的内置函数。

请帮忙

【问题讨论】:

    标签: python linear-regression cross-validation


    【解决方案1】:

    首先让我们复制问题。

    首先导入需要的库:

    import numpy as np
    import pandas as pd 
    from sklearn.preprocessing import StandardScaler
    from sklearn.cross_validation import train_test_split
    from sklearn import linear_model
    from sklearn.grid_search import GridSearchCV
    

    然后创建一些数据:

    df = pd.DataFrame(np.random.rand(5000,11))
    y = df.iloc[:,-5:]  # last 5 columns
    X = df.iloc[:,:-5]  # Except for last 5 columns
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)
    

    现在我们可以复制错误并查看不复制错误的选项:

    运行正常

    gs = GridSearchCV(linear_model.Lasso(), {'alpha': [0.95]}, n_jobs= 1, cv=5, verbose=1)
    print gs.fit(X_train, y_train) 
    

    这不是

    gs = GridSearchCV(linear_model.Lasso(), {'alpha': [0.95]}, n_jobs= 1, cv=5, verbose=1, scoring='recall')
    gs.fit(X_train, y_train) 
    

    确实,错误与您上面的完全一样; '不支持连续多输出'。

    如果您考虑召回度量,它与二进制或分类数据有关 - 我们可以定义诸如误报之类的东西。至少在我复制您的数据时,我使用了连续数据并且没有定义召回。如果您使用默认分数,它会起作用,如上所示。

    因此,您可能需要查看您的预测并了解它们为什么是连续的(即使用分类器而不是回归)。或者使用不同的分数。

    顺便说一句,如果您只使用一组(一列)y 值运行回归,您仍然会得到错误。这次它更简单地说“不支持连续输出”,即问题在于对连续数据(无论是否为多输出)使用召回(或精度)。

    【讨论】:

      【解决方案2】:

      最终目标是评估模型的性能,可以使用model.evaluate方法:

      _,accuracy = model.evaluate(our_data_feat, new_label2,verbose=0.0)
      print('Accuracy:%.2f'%(accuracy*100))
      

      这将为您提供准确度值。

      【讨论】:

        【解决方案3】:

        确保因变量有单个系列。在 train_test_split 中正确拆分数据。

        【讨论】:

        • 这读起来更像是评论而不是答案。请编辑以包括实施细节。欢迎并感谢您的贡献。 SO 的答案需要准确、独立、完整的解决方案。一旦你有足够的声望,你可以将这样的快速建议添加到 cmets 部分,他们将受到欢迎。照原样,您的建议可能会被删除。但您可以进行编辑以防止这种情况发生。
        猜你喜欢
        • 2017-08-28
        • 2016-01-07
        • 2017-11-12
        • 2020-05-31
        • 2019-10-01
        • 2020-06-05
        • 2018-05-19
        相关资源
        最近更新 更多