运行Gridsearch时无法解决错误

时间:2013-11-06 18:53:17

标签: python machine-learning scikit-learn

我是机器学习领域的新手,我开始参加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及其类Label。所以它是一个nx2矩阵。

1 个答案:

答案 0 :(得分:5)

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

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