Python - Apa sebenarnya sklearn.pipeline.Pipeline?

118

Saya tidak tahu bagaimana sklearn.pipeline.Pipelinetepatnya bekerja.

Ada sedikit penjelasan di dok . Misalnya apa yang mereka maksud dengan:

Pipa transformasi dengan penduga akhir.

Untuk memperjelas pertanyaan saya, apa itu steps? Bagaimana mereka bekerja?

Sunting

Berkat jawabannya, saya dapat membuat pertanyaan saya lebih jelas:

Ketika saya memanggil pipeline and pass, sebagai langkah, dua transformator dan satu estimator, misalnya:

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

Apa yang terjadi jika saya menyebut ini?

pipln.fit()
OR
pipln.fit_transform()

Saya tidak tahu bagaimana estimator bisa menjadi trafo dan bagaimana trafo bisa dipasang.

farhawa
sumber
3
Dari apa yang saya pahami, pipeline membantu Anda mengotomatiskan beberapa langkah proses pembelajaran. Seperti pelatihan dan pengujian model atau pemilihan fitur ... Jadi, jika Anda ingin mencampur regresi kemudian menggunakannya untuk memberi makan pengklasifikasi misalnya, langkah Anda adalah pelatihan regresi tersebut dan kemudian pengklasifikasi. edit: tambahkan detail
M0rkHaV
1
queirozf.com/entries/scikit-learn-pipeline-examples Saya merasa ini berguna
randomSampling

Jawaban:

180

Transformer dalam scikit-learn - beberapa kelas yang memiliki metode fit and transform, atau metode fit_transform.

Predictor - beberapa kelas yang memiliki metode fit and predict, atau metode fit_predict.

Pipeline hanyalah gagasan abstrak, ini bukan algoritme ml yang ada. Seringkali dalam tugas ML Anda perlu melakukan urutan transformasi yang berbeda (menemukan sekumpulan fitur, menghasilkan fitur baru, memilih hanya beberapa fitur bagus) dari set data mentah sebelum menerapkan penaksir akhir.

Berikut adalah contoh penggunaan Pipeline yang bagus. Pipeline memberi Anda satu antarmuka untuk semua 3 langkah transformasi dan estimator yang dihasilkan. Ini merangkum transformer dan prediktor di dalamnya, dan sekarang Anda dapat melakukan sesuatu seperti:

    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)

Dengan hanya:

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)

Dengan pipeline Anda dapat dengan mudah melakukan pencarian grid atas sekumpulan parameter untuk setiap langkah meta-estimator ini. Seperti yang dijelaskan pada tautan di atas. Semua langkah kecuali yang terakhir harus diubah, langkah terakhir dapat berupa transformator atau prediktor. Jawaban untuk mengedit : Ketika Anda menelepon pipln.fit()- setiap trafo di dalam pipa akan dipasang pada output dari trafo sebelumnya (Trafo pertama dipelajari pada dataset mentah). Estimator terakhir dapat berupa trafo atau prediktor, Anda dapat memanggil fit_transform () pada pipeline hanya jika estimator terakhir Anda adalah trafo (yang mengimplementasikan fit_transform, atau mengubah dan menyesuaikan metode secara terpisah), Anda dapat memanggil fit_predict () atau predict () pada pipeline hanya jika penaksir terakhir Anda adalah penaksir. Jadi Anda tidak bisa memanggil fit_transform atau transform on pipeline, langkah terakhirnya adalah predictor.

Ibraim Ganiev
sumber
1
Apa yang Anda maksud dengan predicted = pipeline.fit(Xtrain).predict(Xtrain)?
farhawa
@farhawa, memprediksi kelas di set pelatihan.
Ibraim Ganiev
4
Mengapa ini tidak memiliki lebih banyak suara? Ini harus menjadi posting blog.
R Claven
1
@iamgin, Antarmuka sebagian besar transformator scikit-learn tidak mengizinkan untuk memilih kolom yang diperlukan yang ingin kita ubah. Tapi Anda bisa menulis "Item Selector" Anda sendiri, yang akan membantu Anda memberi makan transformator hanya dengan kolom yang dibutuhkan. Berikut adalah contoh yang bagus dengan ItemSelector dan FeatureUnion scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev
1
Pada contoh pertama, tidakkah Anda ingin menghindari penyesuaian lagi dengan set pengujian? Bukankah seharusnya itu hanya memanggil transform daripada fit_transform? Dan juga, apakah pipeline memprediksi secara internal memanggil fit_transform atau hanya mengubah? Bisakah itu dikendalikan?
Steven
18

Saya pikir M0rkHaV memiliki ide yang tepat. Scikit-belajar ini kelas pipa adalah alat yang berguna untuk encapsulating beberapa transformer yang berbeda bersama estimator menjadi satu objek, sehingga Anda hanya perlu memanggil metode penting Anda sekali ( fit(), predict(), dll). Mari kita uraikan dua komponen utama:

  1. Transformer adalah kelas yang mengimplementasikan fit()dan transform(). Anda mungkin akrab dengan beberapa alat praproses sklearn, seperti TfidfVectorizerdan Binarizer. Jika Anda melihat dokumen untuk alat praproses ini, Anda akan melihat bahwa mereka menerapkan kedua metode ini. Yang menurut saya cukup keren adalah bahwa beberapa penduga juga dapat digunakan sebagai langkah transformasi, misalnya LinearSVC!

  2. Estimator adalah kelas yang mengimplementasikan fit()dan predict(). Anda akan menemukan bahwa banyak pengklasifikasi dan model regresi menerapkan kedua metode ini, dan dengan demikian Anda dapat dengan mudah menguji banyak model yang berbeda. Dimungkinkan untuk menggunakan transformator lain sebagai penduga akhir (yaitu, tidak harus diimplementasikan predict(), tetapi pasti mengimplementasikan fit()). Artinya, Anda tidak dapat menelepon predict().

Untuk hasil edit Anda: mari kita lihat contoh berbasis teks. Menggunakan LabelBinarizer, kami ingin mengubah daftar label menjadi daftar nilai biner.

bin = LabelBinarizer()  #first we initialize

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

Sekarang, ketika binarizer dipasang pada beberapa data, ia akan memiliki struktur yang disebut classes_yang berisi kelas-kelas unik yang 'diketahui' oleh transformator. Tanpa memanggil fit()binarizer tidak tahu seperti apa datanya, jadi memanggil transform()tidak akan masuk akal. Ini benar jika Anda mencetak daftar kelas sebelum mencoba menyesuaikan data.

print bin.classes_  

Saya mendapatkan kesalahan berikut saat mencoba ini:

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

Tetapi jika Anda memasang binarizer di file vec daftar:

bin.fit(vec)

dan coba lagi

print bin.classes_

Saya mendapatkan yang berikut:

['cat' 'dog']


print bin.transform(vec)

Dan sekarang, setelah memanggil transform pada vec objek, kita mendapatkan yang berikut:

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

Adapun estimator yang digunakan sebagai transformer, mari kita gunakan DecisionTreeclassifier sebagai contoh ekstraktor fitur. Decision Trees bagus untuk banyak alasan, tetapi untuk tujuan kita, yang penting adalah mereka memiliki kemampuan untuk menentukan peringkat fitur yang menurut pohon berguna untuk memprediksi. Saat Anda memanggil transform()Pohon Keputusan, ia akan mengambil data masukan Anda dan menemukan fitur apa yang menurutnya paling penting. Jadi Anda bisa membayangkannya mengubah matriks data Anda (n baris kali m kolom) menjadi matriks yang lebih kecil (n baris kali k kolom), di mana k kolom adalah k fitur terpenting yang ditemukan Decision Tree.

NBartley
sumber
Apa perbedaan antara fit()dan transform()is the Transformers? , bagaimana penduga dapat digunakan sebagai transformator?
farhawa
2
fit()adalah metode yang Anda panggil untuk menyesuaikan atau 'melatih' transformator Anda, seperti yang Anda lakukan pada model pengklasifikasi atau regresi. Adapun transform(), itu adalah metode yang Anda panggil untuk benar-benar mengubah data masukan menjadi data keluaran. Misalnya, menelepon Binarizer.transform([8,2,2])(setelah pemasangan!) Dapat mengakibatkan [[1,0],[0,1],[0,1]]. Adapun menggunakan estimator sebagai transformator, saya akan mengedit contoh singkat menjadi jawaban saya.
NBartley
9

Algoritme ML biasanya memproses data tabel. Anda mungkin ingin melakukan pra-pemrosesan dan pasca-pemrosesan data ini sebelum dan sesudah algoritme ML Anda. Pipeline adalah cara untuk merangkai langkah-langkah pemrosesan data tersebut.

Apa itu pipeline ML dan bagaimana cara kerjanya?

Pipeline adalah serangkaian langkah di mana data diubah. Itu berasal dari pola desain "pipa dan filter" lama (misalnya, Anda dapat memikirkan perintah unix bash dengan pipa "|" atau mengarahkan operator ">"). Namun, pipeline adalah objek dalam kode. Jadi, Anda mungkin memiliki kelas untuk setiap filter (alias setiap langkah pipeline), lalu kelas lain untuk menggabungkan langkah-langkah tersebut ke pipeline akhir. Beberapa pipeline mungkin menggabungkan pipeline lain secara seri atau paralel, memiliki banyak input atau output, dan seterusnya. Kami ingin melihat pipeline Machine Learning sebagai:

  • Pipa dan filter . Langkah-langkah pipeline memproses data, dan mereka mengelola keadaan dalamnya yang bisa dipelajari dari data.
  • Komposit . Pipelines dapat disarangkan: misalnya seluruh pipeline dapat diperlakukan sebagai satu langkah pipeline di pipeline lain. Langkah pipeline tidak selalu merupakan pipeline, tetapi pipeline itu sendiri setidaknya merupakan langkah pipeline menurut definisi.
  • Grafik Asiklik Terarah (DAG) . Keluaran langkah jalur pipa dapat dikirim ke banyak langkah lain, dan kemudian keluaran yang dihasilkan dapat digabungkan kembali, dan seterusnya. Catatan tambahan: meskipun pipeline bersifat asiklik, pipeline dapat memproses beberapa item satu per satu, dan jika statusnya berubah (misalnya: menggunakan metode fit_transform setiap kali), maka pipeline tersebut dapat dilihat berulang kali melalui waktu, mempertahankan statusnya (pikirkan seperti sebuah RNN). Itu adalah cara yang menarik untuk melihat pipeline untuk melakukan pembelajaran online saat menempatkannya dalam produksi dan melatihnya pada lebih banyak data.

Metode Pipeline Scikit-Learn

Pipelines (atau anak tangga dalam pipeline) harus memiliki dua metode berikut :

  • " Cocok " untuk mempelajari data dan memperoleh status (misalnya: bobot neural jaringan neural adalah keadaan seperti itu)
  • " Mengubah " (atau "memprediksi") untuk benar-benar memproses data dan menghasilkan prediksi.

Juga dimungkinkan untuk memanggil metode ini untuk merangkai keduanya:

  • " Fit_transform " untuk menyesuaikan dan kemudian mengubah data, tetapi dalam satu proses, yang memungkinkan pengoptimalan kode potensial ketika dua metode harus dilakukan satu demi satu secara langsung.

Masalah kelas sklearn.pipeline.Pipeline

Pola desain "pipa dan filter" Scikit-Learn sangat indah. Tetapi bagaimana cara menggunakannya untuk Deep Learning, AutoML, dan pipeline tingkat produksi yang kompleks?

Scikit-Learn dirilis pertama kali pada tahun 2007, yang merupakan era pra pembelajaran mendalam . Namun, ini adalah salah satu pustaka pembelajaran mesin yang paling dikenal dan diadopsi, dan masih terus berkembang. Di atas semua itu, ia menggunakan pola desain Pipa dan Filter sebagai gaya arsitektur perangkat lunak - itulah yang membuat Scikit-Learn begitu menakjubkan, ditambah fakta ia menyediakan algoritme yang siap digunakan. Namun, ada masalah besar dalam hal melakukan hal berikut, yang seharusnya sudah bisa kita lakukan pada tahun 2020:

  • Pembelajaran Mesin Otomatis (AutoML),
  • Saluran Pembelajaran Mendalam,
  • Pipeline Machine Learning yang lebih kompleks.

Solusi yang Kami Temukan untuk Masalah Scikit-Learn Itu

Yang pasti, Scikit-Learn sangat nyaman dan dibuat dengan baik. Namun, perlu penyegaran. Berikut adalah solusi kami dengan Neuraxle untuk membuat Scikit-Learn segar dan dapat digunakan dalam proyek komputasi modern!

Metode pipeline tambahan dan fitur yang ditawarkan melalui Neuraxle

Catatan: jika suatu langkah pipeline tidak perlu memiliki salah satu metode fit atau transform, langkah tersebut dapat mewarisi dari NonFittableMixin atau NonTransformableMixin untuk diberikan implementasi default dari salah satu metode tersebut untuk tidak melakukan apa pun.

Sebagai permulaan, ada kemungkinan pipeline atau langkahnya juga secara opsional menentukan metode tersebut :

  • " Setup " yang akan memanggil metode "setup" pada setiap langkahnya. Misalnya, jika suatu langkah berisi jaringan neural TensorFlow, PyTorch, atau Keras, langkah-langkah tersebut dapat membuat grafik sarafnya dan mendaftarkannya ke GPU dalam metode "penyiapan" sebelum pemasangan. Tidak disarankan untuk membuat grafik secara langsung di konstruktor langkah karena beberapa alasan, seperti jika langkah-langkah tersebut disalin sebelum menjalankan berkali-kali dengan hyperparameter berbeda dalam algoritme Pembelajaran Mesin Otomatis yang mencari hyperparameter terbaik untuk Anda.
  • " Teardown ", yang merupakan kebalikan dari metode "setup": ia membersihkan resource.

Metode berikut disediakan secara default untuk memungkinkan pengelolaan hyperparameter:

  • Get_hyperparams ” akan mengembalikan Anda kamus hyperparameter. Jika pipeline Anda berisi lebih banyak pipeline (pipeline bertingkat), kunci hyperparameter akan dirantai dengan garis bawah ganda pemisah “__”.
  • Set_hyperparams " akan memungkinkan Anda menyetel hyperparameter baru dalam format yang sama saat Anda mendapatkannya.
  • Get_hyperparams_space ” memungkinkan Anda mendapatkan ruang hyperparameter, yang tidak akan kosong jika Anda menentukannya. Jadi, satu-satunya perbedaan dengan "get_hyperparams" di sini adalah Anda akan mendapatkan distribusi statistik sebagai nilai, bukan nilai yang tepat. Misalnya, satu hyperparameter untuk jumlah lapisan bisa jadi a RandInt(1, 3)yang berarti 1 hingga 3 lapisan. Anda bisa menelepon.rvs() dikt ini untuk mengambil nilai secara acak dan mengirimkannya ke "set_hyperparams" untuk mencoba melatihnya.
  • Set_hyperparams_space ” dapat digunakan untuk menyetel ruang baru menggunakan kelas distribusi hyperparameter yang sama seperti di “get_hyperparams_space”.

Untuk info lebih lanjut tentang solusi yang kami sarankan, baca entri dalam daftar besar dengan tautan di atas.

Guillaume Chevalier
sumber