1

私は機械学習の分野に不慣れで、実践的な経験を積むために Kaggle のコンテストに参加し始めました。私は知識コンテスト CIFAR 10- Object Recognition in Images に参加しています。ここでは、何千もの画像を 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 行列です。

4

1 に答える 1