2017-01-14 3 views
1

私はsvmパラメータを調整する方法を見つけましたが、sklearnの本来的なgridsearchはチューニングを行う最も効率的な方法ではなく、 http://optunity.readthedocs.io/en/latest/notebooks/notebooks/sklearn-svc.html#tune-svc-without-deciding-the-kernel-in-advance私はこの1つにコードも適応するが、私はエラーが発生しました:私のcode.Iと間違っているものをoptunityの例カーネルを決めることなくsvcをチューニングするときにエラーが発生しました

"ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()" I do not know what is wrong. 


#here is the source code 

     import optunity 
import optunity.metrics 
import numpy as np 

# k nearest neighbours 
from sklearn.neighbors import KNeighborsClassifier 
# support vector machine classifier 
from sklearn.svm import SVC 
# Naive Bayes 
from sklearn.naive_bayes import GaussianNB 
# Random Forest 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.externals import joblib 
import sklearn 
im_features,image_classes,training_names,stdSlr,kmeans,k = joblib.load("others.pkl") 

n = len(image_classes) 


data = im_features 
labels = np.array(image_classes) 


cv_decorator = optunity.cross_validated(x=data, y=labels, num_folds=5) 

space = {'kernel': {'linear': {'C': [0, 2]}, 
        'rbf': {'logGamma': [-5, 0], 'C': [0, 10]}, 
        'poly': {'degree': [2, 5], 'C': [0, 5], 'coef0': [0, 2]} 
        } 
     } 


def train_model(x_train, y_train, kernel, C, logGamma, degree, coef0): 
    """A generic SVM training function, with arguments based on the chosen kernel.""" 
    if kernel == 'linear': 
     model = sklearn.svm.SVC(kernel=kernel, C=C) 
    elif kernel == 'poly': 
     model = sklearn.svm.SVC(kernel=kernel, C=C, degree=degree, coef0=coef0) 
    elif kernel == 'rbf': 
     model = sklearn.svm.SVC(kernel=kernel, C=C, gamma=10 ** logGamma) 
    else: 
     raise ArgumentError("Unknown kernel function: %s" % kernel) 
    model.fit(x_train, y_train) 
    return model 


def svm_tuned_auroc(x_train, y_train, x_test, y_test, kernel='linear', C=0, logGamma=0, degree=0, coef0=0): 
    model = train_model(x_train, y_train, kernel, C, logGamma, degree, coef0) 
    decision_values = model.decision_function(x_test) 
    return optunity.metrics.roc_auc(y_test, decision_values) 

svm_tuned_auroc = cv_decorator(svm_tuned_auroc) 

optimal_svm_pars, info, _ = optunity.maximize_structured(svm_tuned_auroc, space, num_evals=150) 
print("Optimal parameters" + str(optimal_svm_pars)) 
print("AUROC of tuned SVM: %1.3f" % info.optimum) 

だけのコード例ではdatalabelsを置き換えます。誰もがこれで私を助けることができます。私はひどくこれをデバッグする必要があります。アドバンスありがとう

完全なエラーはここにある:

Traceback error

+0

を使用してラベルをエンコードする必要があります。また、問題が何であるか説明していないので、データなしでコードを実行する(不可能)ように強制しないでください。 – sascha

+0

エラーが発生する理由がわかりました。これは、私のラベルが0から5までで、例のラベルがブール値であるからです。問題はマルチクラスSVMにoptunityを使うことですか? – wayne

+0

私は質問の最後の部分でトレースバックのリンクを提示しました – wayne

答えて

0

あなたは疑問なしであなたが読んで、すべてを信じてはいけないlabelencoder

+0

私はそれを研究しました。私のラベルは0から5までの範囲のラベルを標準化していると思います。6つのクラスをすべて持っています – wayne

+0

これは私のクラス既に正規化されています – wayne

+0

スタックトレースを表示すると何かを見つけ出すことができるかもしれません。私はoptunityを使用し、それは私のために働く。 – simon

関連する問題