【问题标题】:Unable to solve an error while running Gridsearch运行 Gridsearch 时无法解决错误
【发布时间】:2016-06-30 05:17:35
【问题描述】:

我是机器学习领域的新手,我开始参加 Kaggle 比赛以获得一些实践经验。我正在参加知识竞赛 CIFAR 10-图像中的对象识别,你必须将数千张图像分类为 10 个类别,我使用的所有数据都可以在那里找到。我尝试实施 Gridsearch 来优化我的机器学习算法的参数,但是每当我尝试将我的分类器与我的训练数据相匹配时,我都会遇到错误。我找到了引发错误的函数,这与我的标签类型不正确有关,但我不知道如何解决它。我使用的标签是字符串,我对它们进行了预处理,以便将它们提供给算法。我在那里做错了吗?或者当我为网格搜索拆分数据集时可能出现问题?坦率地说,我缺乏解决这个问题的经验和知识,我绝对可以使用你的帮助。

涉及的代码:

import glob
import os
from sklearn.svm import SVC
from sklearn import preprocessing
import pandas as pd
from sklearn import cross_validation 
from sklearn import metrics
from sklearn.grid_search import GridSearchCV

def label_preprocessing(Labels):
    Labels = np.array(Labels)[:,1]
    le = preprocessing.LabelEncoder()
    le.fit_transform(Labels)
    return Labels
def model_selection(train,Labels):
    parameters = {"C":[0.1,1,10,100],"gamma":[0.0001,0.001,0.01,0.1]}
    X_train, X_test, y_train, y_test = cross_validation.train_test_split(train, Labels, test_size = 0.2, random_state = 0)
    svm = SVC()
    clf  = GridSearchCV(svm,parameters)
    clf  = clf.fit(X_train,y_train)
    print ("20 fold cv score: ",np.mean(cross_validation.cross_val_score(clf,X_test,y_test,cv = 10,scoring = "roc_auc")))
    return clf

if  __name__ == "__main__":
    train_images = np.array(file_open(image_dir1,"*.png"))[:100]
    test_images = np.array(file_open(image_dir2,"*.png"))[:100]
    Labels = label_preprocessing(pd.read_csv(image_dir3)[:100])
    train_set = [matrix_image(image) for image in train_images]
    test_set = [matrix_image(image) for image in test_images]
    train_set = np.array(train_set)
    test_set = np.array(test_set)

    print("selecting best model and evaluating it")
    svm = model_selection(train_set,Labels)
    print("predicting stuff")
    result = svm.predict(test_set)

    np.savetxt("submission.csv", result, fmt = "%s", delimiter = ",")

完整回溯:

Traceback (most recent call last):
  File "C:\Users\Abdc\workspace\final_submission\src\SVM.py", line 49, in <module>
    svm = model_selection(train_set,Labels)
  File "C:\Users\Abdc\workspace\final_submission\src\SVM.py", line 35, in model_selection
    clf  = clf.fit(X_train,y_train)
  File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 707, in fit
    return self._fit(X, y, ParameterGrid(self.param_grid))
  File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 493, in _fit
    for parameters in parameter_iterable
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 517, in __call__
    self.dispatch(function, args, kwargs)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 312, in dispatch
    job = ImmediateApply(func, args, kwargs)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 136, in __init__
    self.results = func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 311, in fit_grid_point
    this_score = clf.score(X_test, y_test)
  File "C:\Python27\lib\site-packages\sklearn\base.py", line 294, in score
    return accuracy_score(y, self.predict(X))
  File "C:\Python27\lib\site-packages\sklearn\metrics\metrics.py", line 1064, in accuracy_score
    y_type, y_true, y_pred = _check_clf_targets(y_true, y_pred)
  File "C:\Python27\lib\site-packages\sklearn\metrics\metrics.py", line 123, in _check_clf_targets
    raise ValueError("{0} is not supported".format(y_type))
ValueError: unknown is not supported

这是引发错误的函数。它可以在 sklearn.metrics 模块中找到:

def _check_clf_targets(y_true, y_pred):
    """Check that y_true and y_pred belong to the same classification task

    This converts multiclass or binary types to a common shape, and raises a
    ValueError for a mix of multilabel and multiclass targets, a mix of
    multilabel formats, for the presence of continuous-valued or multioutput
    targets, or for targets of different lengths.

    Column vectors are squeezed to 1d.

    Parameters
    ----------
    y_true : array-like,

    y_pred : array-like

    Returns
    -------
    type_true : one of {'multilabel-indicator', 'multilabel-sequences', \
                        'multiclass', 'binary'}
        The type of the true target data, as output by
        ``utils.multiclass.type_of_target``

    y_true : array or indicator matrix or sequence of sequences

    y_pred : array or indicator matrix or sequence of sequences
    """
    y_true, y_pred = check_arrays(y_true, y_pred, allow_lists=True)
    type_true = type_of_target(y_true)
    type_pred = type_of_target(y_pred)

    y_type = set([type_true, type_pred])
    if y_type == set(["binary", "multiclass"]):
        y_type = set(["multiclass"])

    if len(y_type) > 1:
        raise ValueError("Can't handle mix of {0} and {1}"
                         "".format(type_true, type_pred))

    # We can't have more than one value on y_type => The set is no more needed
    y_type = y_type.pop()

    # No metrics support "multiclass-multioutput" format
    if (y_type not in ["binary", "multiclass", "multilabel-indicator",
                       "multilabel-sequences"]):
        raise ValueError("{0} is not supported".format(y_type))

    if y_type in ["binary", "multiclass"]:
        y_true = column_or_1d(y_true)
        y_pred = column_or_1d(y_pred)

    return y_type, y_true, y_pred

关于标签的额外信息:

标签和dtype的内容:

In [21]:
Labels = np.array(Labels)[:,1]
Labels


Out[21]:
array(['frog', 'truck', 'truck', ..., 'truck', 'automobile', 'automobile'], dtype=object)

预处理后的标签内容

In [25]:

Labels = np.array(Labels)[:,1]
Labels
le = preprocessing.LabelEncoder()
Labels = le.fit_transform(Labels)
Labels



Out[25]:
array([6, 9, 9, ..., 9, 1, 1])

预处理后的标签形状:

In [18]:
    Labels = np.array(Labels)[:,1]
    Labels.shape
    le = preprocessing.LabelEncoder()
    Labels = le.fit_transform(Labels)
    Labels.shape

Out[18]:
(50000L,)

原始内容可以在这里找到:https://www.kaggle.com/c/cifar-10/data。其中包含数据点的 ID 及其类标签。所以它是一个nx2矩阵。

【问题讨论】:

  • Labels的形状、dtype和内容是什么?
  • np.shape 预处理后返回(5000L,),dtype = object,标签内容为类字符串。原始内容可以在这里找到:kaggle.com/c/cifar-10/data。其中包含数据点的 ID 及其类标签。所以它是一个 nx2 矩阵。
  • 好的,等等,还有问题。你想做什么? GridSearch 搜索最佳参数,然后是具有最佳找到参数的估计器。如果您将此估算器传递给cross_val_score,它将再次重新安装
  • 我想使用 Gridsearch 获得具有最佳参数的模型,然后我想使用 cross_val_score 评估该模型。但这是错的吗?我尝试在没有 cross_val_score 的情况下运行程序,但仍然出现相同的错误。
  • 是的,这不是正在发生的事情。您需要使用“clf.best_estimator_”。我也不确定我会按照你的方式去做。当您在进行交叉验证时丢弃所有先前的训练数据时,这似乎是一种次优方式。不过,这与错误无关。

标签: python machine-learning scikit-learn


【解决方案1】:

这可能是由问题#2374 引起的。作为一种解决方法,您可以尝试使用Labels = Labels.astype(str)

另外,我建议您遵循 PEP8 代码约定与社区共享 python 代码。特别是变量名通常是小写的。

【讨论】:

  • 非常感谢,这正是问题所在。还要感谢您提醒我遵守约定的重要性。
  • 我正在使用sklearn 0.16.1,我尝试了这个解决方法,但在使用射频分类器ValueError: multiclass format is not supported 时仍然出现错误,请注意,这只发生在我使用GridSearchCV 时。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 2020-07-19
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多