2010-09-09 25 views

Trả lời

71

Nếu bạn muốn chia tập dữ liệu một lần trong hai nửa, bạn có thể sử dụng numpy.random.shuffle, hoặc numpy.random.permutation nếu bạn cần phải theo dõi các chỉ số:

import numpy 
# x is your dataset 
x = numpy.random.rand(100, 5) 
numpy.random.shuffle(x) 
training, test = x[:80,:], x[80:,:] 

hoặc

import numpy 
# x is your dataset 
x = numpy.random.rand(100, 5) 
indices = numpy.random.permutation(x.shape[0]) 
training_idx, test_idx = indices[:80], indices[80:] 
training, test = x[training_idx,:], x[test_idx,:] 

Có có nhiều cách để repeatedly partition the same data set for cross validation. Một chiến lược là Resample từ tập dữ liệu, với sự lặp lại:

import numpy 
# x is your dataset 
x = numpy.random.rand(100, 5) 
training_idx = numpy.random.randint(x.shape[0], size=80) 
test_idx = numpy.random.randint(x.shape[0], size=20) 
training, test = x[training_idx,:], x[test_idx,:] 

Cuối cùng, sklearn chứa several cross validation methods (k lần, rời-n-out, ...). Nó cũng bao gồm các phương pháp nâng cao hơn "stratified sampling" tạo phân vùng dữ liệu được cân bằng đối với một số tính năng, ví dụ để đảm bảo rằng có cùng tỷ lệ các ví dụ dương và âm trong tập huấn luyện và kiểm tra.

+7

cảm ơn vì những các giải pháp. Nhưng, không phải là phương pháp cuối cùng, sử dụng randint, có một cơ hội tốt cho các chỉ số tương tự cho cả hai bộ thử nghiệm và đào tạo? – ggauravr

0

Tôi đã viết một chức năng cho dự án của riêng tôi để làm điều này (nó không sử dụng NumPy, mặc dù):

def partition(seq, chunks): 
    """Splits the sequence into equal sized chunks and them as a list""" 
    result = [] 
    for i in range(chunks): 
     chunk = [] 
     for element in seq[i:len(seq):chunks]: 
      chunk.append(element) 
     result.append(chunk) 
    return result 

Nếu bạn muốn các khối được chọn ngẫu nhiên, chỉ cần xáo trộn danh sách trước khi đi qua nó trong

24

Có một tùy chọn khác mà chỉ đòi hỏi phải sử dụng scikit-learn. Như scikit's wiki describes, bạn chỉ có thể sử dụng các hướng dẫn sau đây:

from sklearn.model_selection import train_test_split 

data, labels = np.arange(10).reshape((5, 2)), range(5) 

data_train, data_test, labels_train, labels_test = train_test_split(data, labels, test_size=0.20, random_state=42) 

Bằng cách này bạn có thể giữ cho đồng bộ các nhãn cho dữ liệu bạn đang cố gắng chia thành huấn luyện và thử nghiệm.

4

Bạn cũng có thể xem xét phân chia phân tầng thành tập huấn luyện và kiểm tra. Phân chia bắt đầu cũng tạo ra các bài tập huấn luyện và kiểm tra được đặt ngẫu nhiên nhưng theo cách mà tỷ lệ lớp gốc được bảo toàn. Điều này làm cho các bộ đào tạo và thử nghiệm phản ánh tốt hơn các thuộc tính của tập dữ liệu gốc.

import numpy as np 

def get_train_test_inds(y,train_proportion=0.7): 
    '''Generates indices, making random stratified split into training set and testing sets 
    with proportions train_proportion and (1-train_proportion) of initial sample. 
    y is any iterable indicating classes of each observation in the sample. 
    Initial proportions of classes inside training and 
    testing sets are preserved (stratified sampling). 
    ''' 

    y=np.array(y) 
    train_inds = np.zeros(len(y),dtype=bool) 
    test_inds = np.zeros(len(y),dtype=bool) 
    values = np.unique(y) 
    for value in values: 
     value_inds = np.nonzero(y==value)[0] 
     np.random.shuffle(value_inds) 
     n = int(train_proportion*len(value_inds)) 

     train_inds[value_inds[:n]]=True 
     test_inds[value_inds[n:]]=True 

    return train_inds,test_inds 

y = np.array([1,1,2,2,3,3]) 
train_inds,test_inds = get_train_test_inds(y,train_proportion=0.5) 
print y[train_inds] 
print y[test_inds] 

Mã này kết quả đầu ra:

[1 2 3] 
[1 2 3] 
+0

Cảm ơn bạn! Việc đặt tên có phần gây hiểu nhầm, 'value_inds' là các chỉ số thực sự, nhưng đầu ra không phải là chỉ mục, chỉ có mặt nạ. – greenoldman

18

Chỉ cần một lưu ý. Trong trường hợp bạn muốn đào tạo, kiểm tra, xác nhận và bộ, bạn có thể làm điều này:

from sklearn.cross_validation import train_test_split 

X = get_my_X() 
y = get_my_y() 
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3) 
x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5) 

Các tham số này sẽ cung cấp cho 70% để đào tạo và 15% từng để kiểm tra và bộ val. Hi vọng điêu nay co ich.

+4

có lẽ nên thêm mã này vào mã của bạn: 'từ sklearn.cross_validation import train_test_split' để làm rõ mô-đun bạn đang sử dụng – Radix

+0

Điều này có phải là ngẫu nhiên không? – liang

+0

Tức là, có thể phân chia theo thứ tự đã cho của X và y không? – liang

0

Đây là một mã số để phân chia các dữ liệu vào n = 5 nếp gấp một cách phân tầng

% X = data array 
% y = Class_label 
from sklearn.cross_validation import StratifiedKFold 
skf = StratifiedKFold(y, n_folds=5) 
for train_index, test_index in skf: 
    print("TRAIN:", train_index, "TEST:", test_index) 
    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index] 
0

Cảm ơn pberkes cho câu trả lời của bạn.Tôi chỉ sửa đổi nó để tránh (1) thay thế trong khi lấy mẫu (2) trường hợp nhân đôi xảy ra ở cả hai huấn luyện và thử nghiệm:

training_idx = np.random.choice(X.shape[0], int(np.round(X.shape[0] * 0.8)),replace=False) 
training_idx = np.random.permutation(np.arange(X.shape[0]))[:np.round(X.shape[0] * 0.8)] 
    test_idx = np.setdiff1d(np.arange(0,X.shape[0]), training_idx) 
6

Như sklearn.cross_validation mô-đun đã bị phản đối, bạn có thể sử dụng:

import numpy as np 
from sklearn.model_selection import train_test_split 
X, y = np.arange(10).reshape((5, 2)), range(5) 

X_trn, X_tst, y_trn, y_tst = train_test_split(X, y, test_size=0.2, random_state=42) 
Các vấn đề liên quan