2016-05-22 14 views
5

5000 x 3027 (CIFAR-10 veri kümesi) boyutlarında matris formunda bir eğitim veri kümem var. Numpy'de array_split kullanarak, onu 5 farklı parçaya bölüştüm ve çapraz doğrulama katlaması olarak parçalardan sadece birini seçmek istiyorum. Ancak benim sorunum, XTrain [[Indexes]] gibi bir şeyi kullandığım zaman gelir. Burada indeksler [0,1,2,3] gibi bir dizidir, çünkü bu bana 4 x 1000 x 3027 boyutlarında bir 3D tensor verir. bir matris. 4000 x 3027 matrisini elde etmek için "4 x 1000" yi 4000 sıraya nasıl bölerim?numpy: K katlama çapraz doğrulaması için np dizisindeki belirli dizinleri nasıl seçebilirim?

for fold in range(len(X_train_folds)): 
    indexes = np.delete(np.arange(len(X_train_folds)), fold) 
    XTrain = X_train_folds[indexes] 
    X_cv = X_train_folds[fold] 
    yTrain = y_train_folds[indexes] 
    y_cv = y_train_folds[fold] 

    classifier.train(XTrain, yTrain) 
    dists = classifier.compute_distances_no_loops(X_cv) 
    y_test_pred = classifier.predict_labels(dists, k) 

    num_correct = np.sum(y_test_pred == y_test) 
    accuracy = float(num_correct/num_test) 
    k_to_accuracy[k] = accuracy 
+0

Eğer sorun yaşadığınız kodunu paylaşabilir miyim? – dmlittle

+0

Kod eklendi, XTrain = X_train_folds [indeksler] şekli 4 x 1000 x 3027, ancak 4000 x 3027 olmasını umuyordum – kwotsin

cevap

2

scikit-learn paketini kullanmanızı öneririm. kf yinelemenize,

>>> from sklearn.cross_validation import KFold 
>>> X = # your data [samples x features] 
>>> y = # gt labels 
>>> kf = KFold(X.shape[0], n_folds=5) 

Ve sonra: Zaten ortak makine öğrenim araçları bol, böyle K-fold cross-validation generator olarak birlikte gelir

yukarıdaki döngü farklı eğitim ile n_folds defa, her seferinde çalıştırılacaktır
>>> for train_index, test_index in kf: 
     X_train, X_test = X[train_index], X[test_index] 
     y_train, y_test = y[train_index], y[test_index] 
     # do something 

ve test indeksleri. (Yanlış verimsiz bir şey/yapıyorsam düzeltilebilir mutlu olurdu, yeni böylece numpy için)

3

Belki bu yerine deneyebilirsiniz

X_train_folds = np.array_split(X_train, num_folds) 
y_train_folds = np.array_split(y_train, num_folds) 
k_to_accuracies = {} 

for k in k_choices: 
    k_to_accuracies[k] = [] 
    for i in range(num_folds): 
     training_data, test_data = np.concatenate(X_train_folds[:i] + X_train_folds[i+1:]), X_train_folds[i] 
     training_labels, test_labels = np.concatenate(y_train_folds[:i] + y_train_folds[i+1:]), y_train_folds[i] 
     classifier.train(training_data, training_labels) 
     predicted_labels = classifier.predict(test_data, k) 
     k_to_accuracies[k].append(np.sum(predicted_labels == test_labels)/len(test_labels)) 
İlgili konular