2010-01-14 25 views
8

Là sinh viên của ngôn ngữ học tính toán, tôi thường xuyên thực hiện các thí nghiệm học máy ở nơi tôi phải chuẩn bị dữ liệu đào tạo từ tất cả các nguồn tài nguyên khác nhau như văn bản thô hoặc chú thích văn bản hoặc ngân hàng cây cú pháp. Đối với mỗi nhiệm vụ mới và mỗi thử nghiệm mới, tôi viết chương trình (thông thường bằng Python và đôi khi Java) để trích xuất các tính năng và giá trị tôi cần và chuyển đổi dữ liệu từ định dạng này sang định dạng khác. Điều này thường dẫn đến một số lượng rất lớn các tệp rất lớn và một số lượng rất lớn các chương trình nhỏ xử lý chúng để có được đầu vào cho một số khung học máy (như các tệp arff cho Weka).Các khuôn khổ chung để chuẩn bị dữ liệu đào tạo?

Một cần phải được tổ chức cực kỳ tốt để đối phó với điều đó và chương trình với sự cẩn thận không bỏ lỡ bất kỳ đặc thù quan trọng, ngoại lệ hoặc lỗi trong tấn dữ liệu. Nhiều nguyên tắc thiết kế phần mềm tốt như các mẫu thiết kế hay mô hình tái cấu trúc không sử dụng lớn cho các nhiệm vụ này bởi vì những thứ như bảo mật, bảo trì hoặc tính bền vững không có tầm quan trọng thực sự - một khi chương trình xử lý thành công dữ liệu không cần nữa. Điều này đã đi xa đến mức tôi thậm chí còn ngừng làm phiền về việc sử dụng các lớp hoặc các chức năng ở tất cả trong mã Python và chương trình của tôi theo một cách thủ tục đơn giản. Thử nghiệm tiếp theo sẽ yêu cầu các tập dữ liệu khác nhau với các đặc điểm độc đáo và ở định dạng khác để chuẩn bị của chúng có thể sẽ được lập trình ngay từ đầu. Kinh nghiệm của tôi cho đến nay là nó không phải là bất thường để dành 80-90% thời gian của một dự án về nhiệm vụ chuẩn bị dữ liệu đào tạo. Giờ và ngày chỉ bằng cách suy nghĩ về cách chuyển từ định dạng dữ liệu này sang định dạng dữ liệu khác. Đôi khi, điều này có thể trở nên khá bực bội.

Vâng, bạn có thể đoán rằng tôi đang phóng đại một chút, với mục đích thậm chí, nhưng tôi tích cực bạn hiểu những gì tôi đang cố gắng để nói. Câu hỏi của tôi, thực sự, là:

Có bất kỳ khung công tác chung, kiến ​​trúc, thực tiễn tốt nhất nào để tiếp cận các tác vụ này không? Tôi viết được bao nhiêu mã mà tôi có thể sử dụng lại cho thiết kế tối ưu?

+0

Dựa trên kinh nghiệm học tập của tôi, tôi không coi đó là cường điệu chút nào. : P – ealdent

Trả lời

2

tôi thấy mình chủ yếu sử dụng các textutils từ coreutils GNU và flex để chuẩn bị corpus, dí việc cùng nhau trong các kịch bản đơn giản, ít nhất là khi công tác chuẩn bị tôi cần phải thực hiện rất đơn giản đủ cho biểu thức thông thường và lọc tầm thường, vv

Nó vẫn có thể làm cho mọi thứ có thể tái sử dụng, các quy tắc chung cũng áp dụng ở đây. Nếu bạn đang lập trình mà không quan tâm đến thực hành tốt nhất và chương trình tương tự và chỉ là thủ tục thì IMHO thực sự không ngạc nhiên khi bạn phải làm mọi thứ từ đầu khi bắt đầu một dự án mới.

Mặc dù các yêu cầu về định dạng sẽ thay đổi rất nhiều nhưng vẫn còn nhiều tác vụ phổ biến, ví dụ: tag-tước, tag-dịch, lựa chọn, tabulation, một số thu thập dữ liệu tầm thường như số lượng thẻ, câu và muốn. Lập trình các nhiệm vụ này cho khả năng sử dụng lại cao sẽ trả hết, mặc dù ban đầu nó mất nhiều thời gian hơn.

1

Tôi không biết về bất kỳ khung công tác như vậy - không có nghĩa là chúng không ở ngoài đó. Tôi thích sử dụng của riêng tôi mà chỉ là một bộ sưu tập các đoạn mã tôi đã tinh chế/tinh chỉnh/vay theo thời gian và tôi có thể chuỗi lại với nhau trong các cấu hình khác nhau tùy thuộc vào vấn đề. Nếu bạn đã biết python, thì tôi khuyên bạn nên xử lý tất cả dữ liệu chuẩn bị của bạn trong NumPy - như bạn đã biết, các tập dữ liệu ML có xu hướng lớn - hàng nghìn vectơ hàng được đóng gói với phao. NumPy là tuyệt vời cho rằng loại điều. Ngoài ra, tôi có thể đề nghị rằng để chuẩn bị dữ liệu huấn luyện cho ML, có một vài nhiệm vụ phát sinh trong hầu hết mọi nỗ lực như vậy và không thay đổi nhiều từ một vấn đề sang vấn đề tiếp theo. Tôi đã cung cấp cho bạn các đoạn trích cho những điều dưới đây.

bình thường (rộng & mean-canh giữa dữ liệu của bạn để tránh tỷ lệ quá mức. Như tôi chắc chắn rằng bạn biết, bạn có thể mở rộng -1 đến 1 hoặc 0-1.Tôi thường chọn cái thứ hai để tôi có thể tận dụng các hình mẫu thưa thớt. Trong python, sử dụng thư viện NumPy:

import numpy as NP 
data = NP.linspace(1, 12, 12).reshape(4, 3) 
data_norm = NP.apply_along_axis(lambda x : (x - float(x.min()))/x.max(), 
              0, data) 

cross-validation (đây là tôi đã thiết lập các tham số mặc định tại '5', vì vậy kiểm tra thiết lập là 5%, tập huấn luyện, 95% - đặt này trong một chức năng làm cho k-gấp đơn giản hơn nhiều)

def divide_data(data, testset_size=5) : 
    max_ndx_val = data.shape[0] -1 
    ndx2 = NP.random.random_integers(0, max_ndx_val, testset_size) 
    TE = data_rows[ndx2] 
    TR = NP.delete(data, ndx2, axis=0) 
    return TR, TE 

Cuối cùng, đây là một tuyệt vời case study (IMHO), cả hai rõ ràng và đầy đủ, thể hiện nghĩa đen toàn bộ quá trình từ bộ sưu tập của các dữ liệu thô thông qua đầu vào cho thuật toán ML (một MLP trong trường hợp này). Họ cũng cung cấp mã của họ.