Một cách tốt để tách một mảng NumPy ngẫu nhiên thành tập huấn và kiểm tra/xác nhận hợp lệ là gì? Tương tự như các hàm cvpartition
hoặc crossvalind
trong Matlab.Cách tách/phân đoạn tập dữ liệu thành tập huấn và kiểm tra các tập dữ liệu, ví dụ: xác thực chéo?
Trả lời
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.
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
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.
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]
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
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.
Đâ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]
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)
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)
- 1. Chuyển đổi tập dữ liệu thành XML
- 2. cách xác định tập hợp tham số tối thiểu mô tả tập dữ liệu
- 3. Giá trị trung bình của tập dữ liệu điểm cho một tập dữ liệu lưới
- 4. Cách sắp xếp tập dữ liệu?
- 5. Tài liệu tự động về các tập dữ liệu
- 6. Tập dữ liệu thể loại nhạc GTZAN
- 7. R: nhập nhiều tập hợp dữ liệu
- 8. Tập hợp dữ liệu mongodb vs mysql
- 9. Có bất kỳ tập dữ liệu ví dụ nào cho Python không?
- 10. Làm cách nào tôi có thể xuất GridView.DataSource thành dữ liệu hoặc tập dữ liệu?
- 11. Tắt IDENTITY_INSERT để chèn tập dữ liệu
- 12. Hiểu entropy shannon của tập dữ liệu
- 13. Thêm hàng vào tập dữ liệu
- 14. Cấu trúc dữ liệu để xây dựng và tra cứu tập hợp các dãy số nguyên
- 15. Xác định dữ liệu tuple trong tập lệnh lợn
- 16. mùa xuân dữ liệu JPA - quét cho các tập tin trong thư mục kiểm tra
- 17. Highcharts tập hợp dữ liệu lớn nhóm
- 18. Ghi dữ liệu VMStat vào tập tin
- 19. Xử lý các tập dữ liệu lớn trong Java/Clojure: dữ liệu littleBig
- 20. Chuyển danh sách chung thành tập dữ liệu trong C#
- 21. Twitter (Mạng xã hội) Tập dữ liệu
- 22. Các loại dễ vỡ trong dữ liệu/tập dữ liệu được nhập mạnh mẽ - giải pháp?
- 23. C#, Lặp qua tập dữ liệu và hiển thị từng bản ghi từ cột tập dữ liệu
- 24. Trình dữ liệu có nhanh hơn tập dữ liệu khi điền dữ liệu được không?
- 25. Tìm các ngoại lệ trong tập dữ liệu
- 26. Bộ sưu tập dữ liệu song song trong F #
- 27. Mở rộng cơ sở dữ liệu PHPUnit - Làm cách nào để có tập dữ liệu trống?
- 28. Hỗ trợ Spring JDBC và tập dữ liệu lớn
- 29. Logic miền và xác thực dữ liệu
- 30. Cách lọc một giá trị tập dữ liệu với một tập dữ liệu Giá trị bảng khác trong SSRS
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