Python 运行Gridsearch时无法解决错误

Python 运行Gridsearch时无法解决错误,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我是机器学习领域的新手,我开始参加Kaggle竞赛以获得一些实践经验。我正在参加知识竞赛CIFAR 10-图像中的对象识别,你必须将成千上万的图像分为10类,我使用的所有数据都可以在那里找到。我试图实现Gridsearch来优化我的机器学习算法的参数,但是每当我试图用我的训练数据来匹配我的分类器时,我就会得到一个错误。我找到了引发错误的函数,它与我的标签类型不正确有关,但我不知道如何解决它。我使用的标签是字符串,我对它们进行预处理,以便将它们提供给算法。我做错什么了吗?或者,当我为网格搜索拆分数

我是机器学习领域的新手,我开始参加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 = ",")
完全回溯:

有关标签的其他信息:

标签内容和数据类型:

预处理后标签的内容

预处理后标签的形状:


可以在此处找到原始内容:。它包含数据点及其类标签的ID。所以它是一个nx2矩阵。

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


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

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


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

标签的形状、数据类型和内容是什么??np.shape在预处理后返回(5000L,),数据类型=对象,标签的内容是类字符串。可以在此处找到原始内容:。它包含数据点及其类标签的ID。这是一个nx2矩阵。好的,等等,还有其他问题。你想干什么?GridSearch搜索最佳参数,然后是具有最佳参数的估计器。如果您将此估计器传递给
cross\val\u score
,它将再次对其进行重新调整!我想用Gridsearch得到具有最佳参数的模型,然后我想用cross_val_分数评估该模型。但这是错误的吗?我试着在没有交叉评分的情况下运行程序,但仍然得到相同的错误。是的,这不是正在发生的事情。您需要使用“clf.best_estimator”。我也不确定我会像你那样做。这似乎是一种次优的方法,因为在进行交叉验证时,您会丢弃所有以前的训练数据。但是,这与错误无关。
标签的形状、数据类型和内容是什么?
预处理(5000L,),数据类型=对象后返回np.shape,标签的内容是类字符串。可以在此处找到原始内容:。它包含数据点及其类标签的ID。这是一个nx2矩阵。好的,等等,还有其他问题。你想干什么?GridSearch搜索最佳参数,然后是具有最佳参数的估计器。如果您将此估计器传递给
cross\val\u score
,它将再次对其进行重新调整!我想用Gridsearch得到具有最佳参数的模型,然后我想用cross_val_分数评估该模型。但这是错误的吗?我试着在没有交叉评分的情况下运行程序,但仍然得到相同的错误。是的,这不是正在发生的事情。您需要使用“clf.best_estimator”。我也不确定我会像你那样做。这似乎是一种次优的方法,因为在进行交叉验证时,您会丢弃所有以前的训练数据。不过,这与错误无关。非常感谢,这正是问题所在。还感谢您提醒我以下约定的重要性。我正在使用
sklearn 0.16.1
并尝试了这一解决方法,但在使用rf分类器时仍然出现错误
ValueError:不支持多类格式
请注意,这只发生在我使用GridSearchCV时。有什么建议吗?非常感谢,这正是问题所在。还感谢您提醒我以下约定的重要性。我正在使用
sklearn 0.16.1
并尝试了这一解决方法,但在使用rf分类器时仍然出现错误
ValueError:不支持多类格式
请注意,这只发生在我使用GridSearchCV时。有什么建议吗?
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
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
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,)