2016-05-22 14 views
5

Tôi có tập dữ liệu huấn luyện ở dạng ma trận có kích thước 5000 x 3027 (bộ dữ liệu CIFAR-10). Bằng cách sử dụng mảng_split ở dạng gumpy, tôi đã phân chia nó thành 5 phần khác nhau và tôi muốn chỉ chọn một trong các phần như lần xác thực chéo. Tuy nhiên, vấn đề của tôi xuất hiện khi tôi sử dụng thứ gì đó như XTrain [[Indexes]] trong đó các chỉ mục là một mảng như [0,1,2,3], bởi vì việc này mang lại cho tôi một kích thước 3D có kích thước 4 x 1000 x 3027 và không một ma trận. Làm cách nào để thu gọn "4 x 1000" thành 4000 hàng, để có ma trận 4000 x 3027?numpy: Làm thế nào tôi có thể chọn các chỉ mục cụ thể trong một mảng np để xác thực chéo k-fold?

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

Bạn có thể chia sẻ mã bạn đang gặp rắc rối với? – dmlittle

+0

Nhập mã, hình dạng của XTrain = X_train_folds [chỉ mục] là 4 x 1000 x 3027, nhưng tôi hy vọng sẽ làm cho nó trở thành 4000 x 3027 – kwotsin

Trả lời

2

Tôi khuyên bạn nên sử dụng gói scikit-learn. Nó đã đi kèm với rất nhiều công cụ học máy thông thường, chẳng hạn như K-fold cross-validation generator:

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

Và sau đó, lặp qua kf:

>>> 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 

Vòng lặp trên sẽ được thực hiện n_folds lần, mỗi lần với đào tạo khác nhau và kiểm tra các chỉ mục.

3

Có lẽ bạn có thể thử này để thay thế (mới để NumPy vì vậy nếu tôi đang làm một cái gì đó không hiệu quả/sai, sẽ rất vui khi được sửa chữa)

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)) 
Các vấn đề liên quan