Python - Chính xác thì sklearn.pipeline.Pipeline là gì?


118

Tôi không thể tìm ra cách sklearn.pipeline.Pipelinehoạt động chính xác.

Có một vài giải thích trong tài liệu . Ví dụ, chúng có nghĩa là gì:

Đường ống biến đổi với công cụ ước tính cuối cùng.

Để làm cho câu hỏi của tôi rõ ràng hơn, là stepsgì? Họ làm việc như thế nào?

Biên tập

Nhờ câu trả lời, tôi có thể làm cho câu hỏi của mình rõ ràng hơn:

Khi tôi gọi đường ống dẫn và đường chuyền, như các bước, hai máy biến áp và một máy ước lượng, ví dụ:

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

Điều gì xảy ra khi tôi gọi cái này?

pipln.fit()
OR
pipln.fit_transform()

Tôi không thể tìm ra cách một công cụ ước tính có thể là một máy biến áp và cách một máy biến áp có thể được lắp.


3
Từ những gì tôi đã hiểu, đường ống giúp bạn tự động hóa một số bước của quá trình học. Chẳng hạn như đào tạo và thử nghiệm các mô hình hoặc lựa chọn tính năng ... Vì vậy, nếu bạn muốn kết hợp một hồi quy, sau đó sử dụng nó để cung cấp cho bộ phân loại, các bước của bạn sẽ là đào tạo hồi quy đó và sau đó là bộ phân loại. chỉnh sửa: thêm chi tiết
M0rkHaV 13/10/15

Câu trả lời:


180

Transformer trong scikit-learning - một số lớp có phương thức fit và biến đổi, hoặc phương thức fit_transform.

Predictor - một số lớp có phương thức fit và dự đoán, hoặc phương thức fit_p dự đoán.

Đường ống chỉ là một khái niệm trừu tượng, nó không phải là một số thuật toán ml hiện có. Thông thường, trong các tác vụ ML, bạn cần thực hiện chuỗi các phép biến đổi khác nhau (tìm tập hợp các tính năng, tạo các tính năng mới, chỉ chọn một số tính năng tốt) của tập dữ liệu thô trước khi áp dụng công cụ ước tính cuối cùng.

Đây là một ví dụ điển hình về việc sử dụng Pipeline. Pipeline cung cấp cho bạn một giao diện duy nhất cho cả 3 bước chuyển đổi và công cụ ước tính kết quả. Nó đóng gói các máy biến áp và dự đoán bên trong, và bây giờ bạn có thể làm một số việc như:

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

Chỉ với:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

Với các đường ống, bạn có thể dễ dàng thực hiện tìm kiếm theo lưới trên tập hợp các tham số cho từng bước của công cụ ước tính meta này. Như được mô tả trong liên kết ở trên. Tất cả các bước ngoại trừ bước cuối cùng phải là phép biến đổi, bước cuối cùng có thể là máy biến áp hoặc máy dự đoán. Trả lời để chỉnh sửa : Khi bạn gọi pipln.fit()- mỗi máy biến áp bên trong đường ống sẽ được lắp vào đầu ra của máy biến áp trước (Máy biến áp đầu tiên được học trên tập dữ liệu thô). Công cụ ước tính cuối cùng có thể là máy biến áp hoặc công cụ dự đoán, bạn có thể gọi fit_transform () trên đường ống chỉ khi công cụ ước tính cuối cùng của bạn là máy biến áp (triển khai fit_transform hoặc các phương thức biến đổi và phù hợp riêng), bạn có thể gọi fit_posystem () hoặc dự đoán () trên đường ống chỉ khi công cụ ước tính cuối cùng của bạn là công cụ dự đoán. Vì vậy, bạn không thể gọi fit_transform hoặc biến đổi trên đường ống, bước cuối cùng của bước đó là dự đoán.


1
Ý bạn là predicted = pipeline.fit(Xtrain).predict(Xtrain)
farhawa

@farhawa, dự đoán các lớp trên tập huấn luyện.
Ibraim Ganiev

4
Tại sao điều này không có nhiều phiếu bầu? Nó phải là một bài đăng trên blog.
R Claven

1
@iamgin, Giao diện của hầu hết các máy biến áp scikit-learning không cho phép chọn các cột cần thiết mà chúng tôi muốn biến đổi. Nhưng bạn có thể viết "Bộ chọn mục" của riêng mình, điều đó sẽ giúp bạn chỉ cấp máy biến áp với các cột cần thiết. Đây là một ví dụ điển hình với ItemSelector và FeatureUnion scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev

1
Trong ví dụ đầu tiên, bạn không muốn tránh phải điều chỉnh lại với bộ thử nghiệm? Không nên chỉ gọi biến đổi thay vì fit_transform? Và tương tự, đường ống dự đoán nội bộ gọi fit_transform hay chỉ biến đổi? Nó có thể được kiểm soát?
Steven

18

Tôi nghĩ rằng M0rkHaV có ý tưởng đúng. Scikit-học của lớp đường ống là một công cụ hữu ích cho đóng gói nhiều máy biến áp khác nhau cùng với một ước lượng vào một đối tượng, do đó bạn chỉ cần gọi các phương thức quan trọng của bạn một lần ( fit(), predict(), vv). Hãy chia nhỏ hai thành phần chính:

  1. Máy biến áp là các lớp thực hiện cả hai fit()transform(). Bạn có thể quen thuộc với một số công cụ tiền xử lý của sklearn, như TfidfVectorizerBinarizer. Nếu bạn xem tài liệu cho các công cụ tiền xử lý này, bạn sẽ thấy rằng chúng triển khai cả hai phương pháp này. Điều tôi thấy khá thú vị là một số công cụ ước tính cũng có thể được sử dụng như các bước chuyển đổi, ví dụ LinearSVC!

  2. Bộ ước lượng là các lớp thực hiện cả fit()predict(). Bạn sẽ thấy rằng nhiều bộ phân loại và mô hình hồi quy triển khai cả hai phương pháp này và như vậy bạn có thể dễ dàng kiểm tra nhiều mô hình khác nhau. Có thể sử dụng một máy biến áp khác làm công cụ ước tính cuối cùng (tức là nó không nhất thiết phải thực hiện predict(), nhưng chắc chắn thực hiện fit()). Tất cả điều này có nghĩa là bạn sẽ không thể gọi được predict().

Đối với chỉnh sửa của bạn: hãy xem qua một ví dụ dựa trên văn bản. Sử dụng LabelBinarizer, chúng tôi muốn biến một danh sách các nhãn thành một danh sách các giá trị nhị phân.

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

Bây giờ, khi bộ binarizer được lắp trên một số dữ liệu, nó sẽ có một cấu trúc được gọi là classes_chứa các lớp duy nhất mà máy biến áp 'biết' về. Nếu không gọi fit()trình xử lý binarizer thì sẽ không biết dữ liệu trông như thế nào, vì vậy việc gọi transform()sẽ không có ý nghĩa gì. Điều này đúng nếu bạn in ra danh sách các lớp trước khi cố gắng khớp dữ liệu.

print bin.classes_  

Tôi gặp lỗi sau khi thử điều này:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

Nhưng khi bạn phù hợp với binarizer trong vecdanh sách:

bin.fit(vec)

và thử lại

print bin.classes_

Tôi nhận được những điều sau:

['cat' 'dog']


print bin.transform(vec)

Và bây giờ, sau khi gọi biến đổi trên vecđối tượng, chúng ta nhận được như sau:

[[0]
 [1]
 [1]
 [1]]

Đối với công cụ ước tính được sử dụng làm máy biến áp, chúng ta hãy sử dụng bộ DecisionTreephân loại làm ví dụ về trình trích xuất tính năng. Cây Quyết định là tuyệt vời vì nhiều lý do, nhưng đối với mục đích của chúng tôi, điều quan trọng là chúng có khả năng xếp hạng các tính năng mà cây thấy hữu ích để dự đoán. Khi bạn gọi transform()Cây quyết định, nó sẽ lấy dữ liệu đầu vào của bạn và tìm những gì nó cho là các tính năng quan trọng nhất. Vì vậy, bạn có thể nghĩ đến việc chuyển đổi ma trận dữ liệu của bạn (n hàng x m cột) thành ma trận nhỏ hơn (n hàng x k cột), trong đó k cột là k đặc điểm quan trọng nhất mà Cây quyết định tìm thấy.


Sự khác biệt giữa Transformers fit()transform()là gì? , các công cụ ước tính có thể được sử dụng như máy biến áp như thế nào?
farhawa

2
fit()là phương thức bạn gọi để điều chỉnh hoặc 'huấn luyện' máy biến áp của mình, giống như bạn làm với mô hình phân loại hoặc hồi quy. Đối với transform(), đó là phương thức bạn gọi để thực sự chuyển đổi dữ liệu đầu vào thành dữ liệu đầu ra. Ví dụ: gọi Binarizer.transform([8,2,2])(sau khi vừa vặn!) Có thể dẫn đến [[1,0],[0,1],[0,1]]. Đối với việc sử dụng công cụ ước tính làm máy biến áp, tôi sẽ chỉnh sửa một ví dụ ngắn vào câu trả lời của mình.
NBartley

9

Các thuật toán ML thường xử lý dữ liệu dạng bảng. Bạn có thể muốn xử lý trước và xử lý sau dữ liệu này trước và sau thuật toán ML của mình. Đường ống là một cách để xâu chuỗi các bước xử lý dữ liệu đó.

Đường ống ML là gì và chúng hoạt động như thế nào?

Đường ống là một loạt các bước trong đó dữ liệu được chuyển đổi. Nó xuất phát từ mẫu thiết kế "đường ống và bộ lọc" cũ (ví dụ: bạn có thể nghĩ đến các lệnh bash unix với các đường ống "|" hoặc toán tử chuyển hướng ">"). Tuy nhiên, các đường ống dẫn là các đối tượng trong mã. Do đó, bạn có thể có một lớp cho mỗi bộ lọc (hay còn gọi là mỗi bước đường ống) và sau đó là một lớp khác để kết hợp các bước đó thành đường ống cuối cùng. Một số đường ống có thể kết hợp các đường ống khác nối tiếp hoặc song song, có nhiều đầu vào hoặc đầu ra, v.v. Chúng tôi muốn xem các đường ống của Học máy là:

  • Ống và bộ lọc . Các bước của đường ống xử lý dữ liệu và chúng quản lý trạng thái bên trong của chúng mà có thể học được từ dữ liệu.
  • Vật liệu tổng hợp . Các đường ống có thể được lồng vào nhau: ví dụ toàn bộ đường ống có thể được coi như một bước đường ống duy nhất trong đường ống khác. Một bước đường ống không nhất thiết là một đường ống, nhưng bản thân một đường ống ít nhất là một bước đường ống theo định nghĩa.
  • Đồ thị Acyclic có hướng (DAG) . Đầu ra của bước đường ống có thể được gửi đến nhiều bước khác và sau đó kết quả đầu ra có thể được kết hợp lại, v.v. Lưu ý bên cạnh: mặc dù các đường ống dẫn là tuần hoàn, chúng có thể xử lý nhiều mục một và nếu trạng thái của chúng thay đổi (ví dụ: sử dụng phương thức fit_transform mỗi lần), thì chúng có thể được xem là liên tục mở ra theo thời gian, giữ trạng thái của chúng (nghĩ như một RNN). Đó là một cách thú vị để xem các đường dẫn để thực hiện học trực tuyến khi đưa chúng vào sản xuất và đào tạo chúng trên nhiều dữ liệu hơn.

Phương pháp của một đường ống Scikit-Learn

Đường ống (hoặc các bước trong đường ống) phải có hai phương pháp sau:

  • Phù hợp " để tìm hiểu trên dữ liệu và có được trạng thái (ví dụ: trọng số thần kinh của mạng thần kinh là trạng thái như vậy)
  • " Biến đổi " (hoặc "dự đoán") để thực sự xử lý dữ liệu và tạo dự đoán.

Cũng có thể gọi phương thức này để xâu chuỗi cả hai:

  • Fit_transform ” để phù hợp và sau đó chuyển đổi dữ liệu, nhưng trong một lần chuyển, điều này cho phép tối ưu hóa mã tiềm năng khi hai phương pháp phải được thực hiện lần lượt trực tiếp.

Sự cố của lớp sklearn.pipeline.Pipeline

Mẫu thiết kế “đường ống và bộ lọc” của Scikit-Learn đơn giản là đẹp. Nhưng làm thế nào để sử dụng nó cho Học sâu, AutoML và các đường ống cấp sản xuất phức tạp?

Scikit-Learn được phát hành lần đầu tiên vào năm 2007, đó là thời kỳ tiền học sâu . Tuy nhiên, nó là một trong những thư viện học máy được biết đến và sử dụng nhiều nhất và vẫn đang tiếp tục phát triển. Trên hết, nó sử dụng mẫu thiết kế Pipe and Filter như một phong cách kiến ​​trúc phần mềm - đó là điều khiến Scikit-Learn trở nên tuyệt vời, thêm vào đó là nó cung cấp các thuật toán sẵn sàng để sử dụng. Tuy nhiên, nó có những vấn đề lớn khi phải thực hiện những điều sau, mà chúng ta có thể làm được vào năm 2020:

  • Học máy tự động (AutoML),
  • Đường ống học sâu,
  • Các đường ống Machine Learning phức tạp hơn.

Giải pháp mà chúng tôi đã tìm ra cho các vấn đề của Scikit-Learn

Chắc chắn, Scikit-Learn rất tiện lợi và được xây dựng tốt. Tuy nhiên, nó cần được làm mới. Dưới đây là các giải pháp của chúng tôi với Neuraxle để làm cho Scikit-Learn trở nên mới mẻ và có thể sử dụng được trong các dự án máy tính hiện đại!

Các phương pháp và tính năng đường ống bổ sung được cung cấp thông qua Neuraxle

Lưu ý: nếu một bước của đường ống không cần phải có một trong các phương thức phù hợp hoặc biến đổi, nó có thể kế thừa từ NonFittableMixin hoặc NonTransformableMixin để được cung cấp một triển khai mặc định của một trong những phương thức đó mà không phải làm gì.

Khi mới bắt đầu, các đường ống hoặc các bước của chúng cũng có thể tùy chọn xác định các phương pháp đó :

  • " Thiết lập " sẽ gọi phương thức "thiết lập" trên mỗi bước của nó. Ví dụ: nếu một bước chứa mạng thần kinh TensorFlow, PyTorch hoặc Keras, thì các bước có thể tạo đồ thị thần kinh của chúng và đăng ký chúng với GPU trong phương thức "thiết lập" trước khi phù hợp. Không khuyến khích tạo các biểu đồ trực tiếp trong hàm tạo của các bước vì một số lý do, chẳng hạn như nếu các bước được sao chép trước khi chạy nhiều lần với các siêu tham số khác nhau trong thuật toán Học máy tự động tìm kiếm siêu tham số tốt nhất cho bạn.
  • " Teardown ", ngược lại với phương thức "setup": nó xóa tài nguyên.

Các phương pháp sau được cung cấp theo mặc định để cho phép quản lý các siêu tham số:

  • Get_hyperparams ” sẽ trả về cho bạn một từ điển về các siêu tham số. Nếu đường ống của bạn chứa nhiều đường ống hơn (đường ống lồng nhau), thì các khóa của siêu thông số được liên kết với dấu gạch dưới kép dấu phân cách “__”.
  • Set_hyperparams ” sẽ cho phép bạn đặt các siêu tham số mới ở cùng một định dạng khi bạn lấy chúng.
  • Get_hyperparams_space ” cho phép bạn lấy không gian của siêu tham số, không gian này sẽ không trống nếu bạn đã xác định một. Vì vậy, sự khác biệt duy nhất với “get_hyperparams” ở đây là bạn sẽ nhận được phân phối thống kê dưới dạng giá trị thay vì một giá trị chính xác. Ví dụ, một siêu tham số cho số lớp có thể là a RandInt(1, 3), nghĩa là từ 1 đến 3 lớp. Bạn có thể gọi lệnh .rvs()này để chọn một giá trị ngẫu nhiên và gửi nó đến “set_hyperparams” để thử đào tạo về nó.
  • Set_hyperparams_space ” có thể được sử dụng để thiết lập một không gian mới bằng cách sử dụng các lớp phân phối siêu tham số tương tự như trong “get_hyperparams_space”.

Để biết thêm thông tin về các giải pháp được đề xuất của chúng tôi, hãy đọc các mục trong danh sách lớn với các liên kết ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.