Python - sklearn.pipeline.Pipeline tam olarak nedir?


118

sklearn.pipeline.PipelineTam olarak nasıl çalıştığını anlayamıyorum.

Birkaç açıklama vardır doc . Örneğin ne demek istiyorlar:

Son bir tahminciye sahip dönüşüm boru hattı.

Sorumu daha açık hale getirmek için stepsnedir? Nasıl çalışırlar?

Düzenle

Cevaplar sayesinde sorumu daha net hale getirebilirim:

Boru hattını aradığımda ve adım olarak geçtiğimde, iki transformatör ve bir tahminci, örneğin:

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

Bunu aradığımda ne olur?

pipln.fit()
OR
pipln.fit_transform()

Tahmin edicinin nasıl bir transformatör olabileceğini ve bir transformatörün nasıl yerleştirilebileceğini anlayamıyorum.


3
Anladığım kadarıyla pipeline, öğrenme sürecinin birkaç adımını otomatikleştirmenize yardımcı oluyor. Örneğin, modellerin eğitimi ve test edilmesi veya özellik seçimi gibi ... Dolayısıyla, bir regresyonu karıştırmak istiyorsanız, örneğin bir sınıflandırıcıyı beslemek için kullanın, adımlarınız o regresyonun ve ardından sınıflandırıcının eğitimi olacaktır. düzenleme: ayrıntıları ekle
M0rkHaV

Yanıtlar:


180

Scikit-learn'deki transformer - fit ve transform yöntemine veya fit_transform yöntemine sahip bazı sınıflar.

Predictor - uygun ve tahmin yöntemleri veya fit_predict yöntemi olan bazı sınıflar.

Pipeline sadece soyut bir kavramdır, mevcut bir ml algoritması değildir. Genellikle makine öğrenimi görevlerinde, nihai tahminciyi uygulamadan önce ham veri kümesinin farklı dönüşümlerini (özellik kümelerini bulma, yeni özellikler oluşturma, yalnızca bazı iyi özellikleri seçme) gerçekleştirmeniz gerekir.

İşte Pipeline kullanımına iyi bir örnek. Pipeline, 3 dönüşüm adımının tümü ve sonuç olarak tahmin edicisi için size tek bir arayüz sunar. İçerisindeki transformatörleri ve öngörücüleri kapsüller ve şimdi şöyle bir şey yapabilirsiniz:

    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)

Sadece:

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)

Ardışık düzenlerle, bu meta tahmin edicinin her adımı için parametre kümesi üzerinde kolayca bir ızgara araması gerçekleştirebilirsiniz. Yukarıdaki bağlantıda açıklandığı gibi. Sonuncu hariç tüm adımlar dönüşüm olmalıdır, son adım transformatör veya yordayıcı olabilir. Düzenlenecek cevap : Aradığınızda pipln.fit()- boru hattı içindeki her bir trafo, önceki trafonun çıkışlarına takılacaktır (İlk trafo ham veri kümesinde öğrenilir). Son tahminci transformer veya tahminci olabilir, yalnızca son tahmin ediciniz transformatör ise (fit_transform veya transform ve fit yöntemlerini ayrı ayrı uygularsa) ardışık düzen üzerinde fit_transform () 'u çağırabilirsiniz, yalnızca boru hattında fit_predict () veya tahmin () çağırabilirsiniz son tahminciniz tahmin edicidir. Dolayısıyla, son adımı öngörücü olan fit_transform veya ardışık düzen üzerinde dönüşümü çağıramazsınız.


1
Ne demek istiyorsun predicted = pipeline.fit(Xtrain).predict(Xtrain)?
farhawa

@farhawa, eğitim setindeki dersleri tahmin ediyor.
Ibraim Ganiev

4
Bunun neden daha fazla oyu yok? Bir blog yazısı olmalı.
R Claven

1
@iamgin, scikit-learn transformatörlerinin çoğunun arayüzü, dönüştürmek istediğimiz gerekli sütunları seçmeye izin vermiyor. Ancak transformatörü yalnızca gerekli sütunlarla beslemenize yardımcı olacak kendi "Öğe Seçicinizi" yazabilirsiniz. İşte ItemSelector ve FeatureUnion ile güzel bir örnek scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev

1
İlk örnekte, test setine tekrar uymaktan kaçınmak istemez misiniz? Sadece fit_transform yerine dönüşümü çağırması gerekmez mi? Ve benzer şekilde, boru hattı dahili olarak fit_transform çağırır mı yoksa sadece dönüşümü mü öngörür? Kontrol edilebilir mi?
Steven

18

Bence M0rkHaV'nin doğru fikri var. Scikit-öğrenme boru hattı sınıfı yalnızca (kez önemli yöntemler aramak zorunda böylece, bir nesnesine bir tahmincisi yanında birden fazla farklı transformatörleri kaplamak için bir araçtır fit(), predict()vs). İki ana bileşeni inceleyelim:

  1. Transformers , hem fit()ve hem de transform(). Sen gibi araçlar ön işleme sklearn bazı aşina olabilirsiniz TfidfVectorizerve Binarizer. Bu ön işleme araçlarının belgelerine bakarsanız, bu yöntemlerin her ikisini de uyguladıklarını göreceksiniz. Oldukça havalı bulduğum şey, bazı tahmin edicilerin dönüşüm adımları olarak da kullanılabilmesidir, örneğin LinearSVC!

  2. Kestirimciler hem uygulayan sınıflar vardır fit()ve predict(). Sınıflandırıcıların ve regresyon modellerinin çoğunun bu iki yöntemi de uyguladığını göreceksiniz ve bu nedenle birçok farklı modeli kolayca test edebilirsiniz. Nihai tahminleyici olarak başka bir transformatör kullanmak mümkündür (yani, zorunlu olarak uygulanmaz predict(), ancak kesinlikle uygular fit()). Bütün bunlar arayamayacağın anlamına geliyor predict().

Düzenlemenize gelince: Metin tabanlı bir örnek üzerinden geçelim. LabelBinarizer'ı kullanarak, bir etiket listesini ikili değerler listesine dönüştürmek istiyoruz.

bin = LabelBinarizer()  #first we initialize

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

Şimdi, ikili düzenleyici bazı verilere takıldığında classes_, transformatörün 'bildiği' benzersiz sınıfları içeren adı verilen bir yapıya sahip olacaktır . İkilleştiriciyi çağırmadan fit()verilerin neye benzediğine dair hiçbir fikri yoktur, bu nedenle arama transform()yapmak mantıklı olmaz. Verileri sığdırmaya çalışmadan önce sınıf listesini yazdırırsanız bu doğrudur.

print bin.classes_  

Bunu denerken şu hatayı alıyorum:

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

Ancak ikili düzenleyiciyi vec listeye :

bin.fit(vec)

ve yeniden dene

print bin.classes_

Aşağıdakileri alıyorum:

['cat' 'dog']


print bin.transform(vec)

Ve şimdi, dönüşümü çağırdıktan sonra vec nesnede , şunu elde ederiz:

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

Transformatör olarak kullanılan tahmin edicilere gelince, DecisionTreesınıflandırıcıyı bir özellik çıkarıcı örneği olarak kullanalım . Karar Ağaçları birçok nedenden ötürü harikadır, ancak bizim amaçlarımız için önemli olan, ağacın tahmin etmek için yararlı bulduğu özellikleri sıralama yeteneğine sahip olmalarıdır . Bir transform()Karar Ağacı çağırdığınızda , giriş verilerinizi alacak ve en önemli özellikler olduğunu düşündüğü şeyi bulacaktır . Dolayısıyla, veri matrisinizi (n satır x m sütun) daha küçük bir matrise (k sütuna göre n satır) dönüştürmeyi düşünebilirsiniz; burada k sütunları, Karar Ağacının bulduğu en önemli özelliktir.


Ne arasındaki fark bu fit()ve transform()Transformers nedir? , tahmin ediciler transformatör olarak nasıl kullanılabilir?
farhawa

2
fit()bir sınıflandırıcı veya regresyon modeli gibi, transformatörünüzü uydurmak veya 'eğitmek' için aradığınız yöntemdir. Gelince transform(), girdi verilerini çıktı verilerine dönüştürmek için aradığınız yöntem budur. Örneğin, çağırma Binarizer.transform([8,2,2])(uydurmadan sonra!) İle sonuçlanabilir [[1,0],[0,1],[0,1]]. Tahmin edicileri transformatör olarak kullanmaya gelince, cevabıma kısa bir örnek vereceğim.
NBartley

9

Makine öğrenimi algoritmaları tipik olarak tablo verilerini işler. Makine öğrenimi algoritmanızdan önce ve sonra bu verilerin ön işlemesini ve son işlemesini yapmak isteyebilirsiniz. Ardışık düzen, bu veri işleme adımlarını zincirlemenin bir yoludur.

Makine öğrenimi ardışık düzenleri nedir ve nasıl çalışır?

Bir ardışık düzen, verilerin dönüştürüldüğü bir dizi adımdır. Eski "boru ve filtre" tasarım modelinden gelir (örneğin, "|" borularla birlikte unix bash komutlarını veya ">" yönlendirme operatörlerini düşünebilirsiniz). Ancak, ardışık düzenler koddaki nesnelerdir. Bu nedenle, her filtre için bir sınıfınız olabilir (diğer bir deyişle, her bir boru hattı adımı) ve ardından bu adımları son işlem hattında birleştirmek için başka bir sınıfınız olabilir. Bazı boru hatları, diğer boru hatlarını seri veya paralel olarak birleştirebilir, birden çok giriş veya çıkışa sahip olabilir, vb. Makine Öğrenimi ardışık düzenlerini şu şekilde görüntülemeyi seviyoruz:

  • Boru ve filtreler . İşlem hattının adımları verileri işler ve verilerden öğrenilebilecek iç durumlarını yönetirler.
  • Kompozitler . Ardışık düzenler yuvalanabilir: örneğin, tüm bir ardışık düzen başka bir ardışık düzen içinde tek bir ardışık düzen adımı olarak ele alınabilir. Bir ardışık düzen adımı mutlaka bir ardışık düzen değildir, ancak bir boru hattının kendisi en azından tanım gereği bir boru hattıdır.
  • Yönlendirilmiş Asiklik Grafikler (DAG) . Bir ardışık düzen adımının çıktısı diğer birçok adıma gönderilebilir ve ardından ortaya çıkan çıktılar yeniden birleştirilebilir ve bu böyle devam eder. Yan not: ardışık düzenler döngüsel olmamakla birlikte, birden fazla öğeyi tek tek işleyebilirler ve durumları değişirse (örneğin, her seferinde fit_transform yöntemini kullanarak), zaman içinde tekrarlayan bir şekilde açılarak durumlarını koruyarak görülebilirler (örneğin bir RNN). Bu, onları üretime koyarken ve daha fazla veri konusunda eğitirken çevrimiçi öğrenmeye yönelik ardışık düzenleri görmenin ilginç bir yolu.

Scikit-Learn Ardışık Düzeninin Yöntemleri

Ardışık düzenler (veya ardışık düzen içindeki adımlar) şu iki yönteme sahip olmalıdır :

  • Veriler üzerinde öğrenmek ve durumu elde etmek için " uygun " (örneğin: sinir ağının sinir ağırlıkları böyle bir durumdur)
  • Verileri gerçekten işlemek ve bir tahmin oluşturmak için " dönüştürün " (veya "tahmin edin").

Her ikisini de zincirlemek için bu yöntemi çağırmak da mümkündür:

  • " Fit_transform " veriyi sığdırmak ve sonra dönüştürmek için, ancak tek geçişte, iki yöntemin birbiri ardına doğrudan yapılması gerektiğinde potansiyel kod optimizasyonlarına izin verir.

Sklearn.pipeline.Pipeline sınıfının sorunları

Scikit-Learn'ün "boru ve filtre" tasarım modeli tek kelimeyle güzeldir. Ancak Derin Öğrenme, AutoML ve karmaşık üretim düzeyinde ardışık düzenler için nasıl kullanılır?

Scikit-Learn, derin öğrenme öncesi bir dönem olan 2007'de ilk sürümünü yayınladı . Ancak, en çok bilinen ve benimsenen makine öğrenimi kitaplıklarından biridir ve büyümeye devam etmektedir. Hepsinden önemlisi, Boru ve Filtre tasarım modelini bir yazılım mimari stili olarak kullanır - Scikit-Learn'ü bu kadar muhteşem kılan, kullanıma hazır algoritmalar sağladığı gerçeğine ek olarak budur. Bununla birlikte, 2020'de zaten yapabilmemiz gereken aşağıdakileri yapmak söz konusu olduğunda çok büyük sorunları var:

  • Otomatik Makine Öğrenimi (AutoML),
  • Derin Öğrenme Boru Hatları,
  • Daha karmaşık Makine Öğrenimi ardışık düzenleri.

Scikit-Learn'ün Sorunlarına Bulduğumuz Çözümler

Elbette, Scikit-Learn çok kullanışlı ve iyi yapılandırılmıştır. Ancak yenilenmesi gerekiyor. Burada bizim çözümleridir Neuraxle modern bilgisayar projelerinin içinde taze ve kullanışlı Scikit-öğrenin yapmak için!

Neuraxle aracılığıyla sunulan ek işlem hattı yöntemleri ve özellikleri

Not: Bir ardışık düzen adımının fit veya dönüştürme yöntemlerinden birine sahip olması gerekmiyorsa, NonFittableMixin veya NonTransformableMixin'den miras alabilir. sahip olması , hiçbir şey yapmamak için bu yöntemlerden birinin varsayılan uygulaması sağlanmak üzere .

Başlangıç ​​olarak, boru hatlarının veya bunların adımlarının isteğe bağlı olarak bu yöntemleri tanımlaması mümkündür :

  • Kurulum kendi adıma her biri üzerinde“setup”yöntemini çağıracak”. Örneğin, bir adım bir TensorFlow, PyTorch veya Keras sinir ağı içeriyorsa, adımlar bunların nöral grafiklerini oluşturabilir ve yerleştirmeden önce "kurulum" yönteminde bunları GPU'ya kaydedebilir. Sizin için en iyi hiperparametreleri arayan bir Otomatik Makine Öğrenimi algoritması içinde farklı hiperparametrelerle birçok kez çalıştırılmadan önce adımların kopyalanması gibi birkaç nedenden ötürü doğrudan adımların yapıcılarında grafikler oluşturmak önerilmez.
  • " Kurulum" yönteminin tersi olan " sökülme ": kaynakları temizler.

Aşağıdaki yöntemler, varsayılan olarak sağlanan hyperparameters yönetmek için izin vermek:

  • " Get_hyperparams " size hiperparametrelerin sözlüğünü döndürecektir. Ardışık düzeniniz daha fazla ardışık düzen (iç içe geçmiş ardışık düzenler) içeriyorsa, hiperparametre anahtarları çift alt çizgi "__" ayırıcılarla zincirlenir.
  • " Set_hyperparams ", yeni hiperparametreleri aldığınız aynı formatta ayarlamanıza izin verecektir.
  • " Get_hyperparams_space " hiperparametre alanını elde etmenizi sağlar, eğer bir tane tanımladıysanız boş olmayacaktır. Dolayısıyla, "get_hyperparams" ile burada tek fark, kesin bir değer yerine değerler olarak istatistik dağılımları alacağınızdır. Örneğin, katman sayısı için bir hiperparametre, RandInt(1, 3)1 ila 3 katman anlamına gelen bir olabilir . Arayabilirsin.rvs() dikteyi rastgele bir değer seçmeye üzerinde çalışmayı denemek için “set_hyperparams” a gönderebilirsiniz.
  • " Set_hyperparams_space ", " get_hyperparams_space " ile aynı hiperparametre dağıtım sınıflarını kullanarak yeni bir boşluk ayarlamak için kullanılabilir.

Önerilen çözümlerimiz hakkında daha fazla bilgi için, yukarıdaki bağlantılarla birlikte büyük listedeki girişleri okuyun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.