Zephyrnet Logosu

“Optuna” tarafından desteklenen Aktarım Öğrenmeyi Kullanan Çok Etiketli Metin Sınıflandırması

Tarih:

Bu makale, Veri Bilimi Blogathon.

Metne birden fazla ilgili etiketin atanması sorunu Çoklu Etiket Sınıflandırması olarak bilinir. Günümüzde Transfer Öğrenme bu sorunu çözmek için en etkili tekniklerden biri olarak kullanılmaktadır. Ve hepimiz sınıflandırma adımında optimum parametrelere karar verme ve kendi yöntemlerimizi deneme konusunda zorluklarla karşı karşıyayız. şans rastgele. Burada, "Optuna” resmin içine giriyor.

Bhagawan Bharose Mat Baitho, Ka Pata Bhagawan Hamre Bharose Baith Ho!! (Filmden: Manjhi-Dağ Adamı)

Üzgünüm, bu alıntıya şu şekilde atıfta bulunmak için kendime direnemedim: Optuna pasif bir şekilde bize içgüdüleri takip etmek yerine optimizasyon zamanının geldiğini söylüyor (“Optuna”-mised) amaç fonksiyonu.

Giriş

Bu makalede, transfer öğrenme tabanlı Çok Etiketli Metin sınıflandırma modelinin ince ayarını aşağıdakileri kullanarak tartışacağız: Optuna. Özellikle Makine Öğrenimi ve Derin Öğrenme için tasarlanmış otomatik bir hiperparametre optimizasyon çerçevesidir. kullanıcısı Optuna hiperparametreler için arama uzaylarını dinamik olarak oluşturabilir. Temel özellikler aşağıdadır:

  • Hafif, çok yönlü ve Çerçeveden bağımsız mimari
  • Verimli optimizasyon algoritması
  • Kolay paralelleştirme
  • Hızlı görselleştirme

Kullanarak parametre optimizasyonu Optuna aşağıdaki üç adımda yapılabilir:

  1. Model eğitimini bir nesnel işlev ve dönüş doğruluk/kayıp
  2. Bir kullanarak hiper parametreler önerin deneme nesne
  3. Bir çalışma nesnesi oluşturun ve optimizasyonu yürütün

Transfer Öğrenmeyi kullanarak Çok Etiketli Metin Sınıflandırma modeli oluşturacağımız bir proje yapalım. Burada sınıflandırma adımını kullanarak ayarlayacağız. Optuna.

Eğlence Başlıyor!!

İçindekiler

  • Adım 1: Paketlerin kurulumu
  • Adım 2: Veri Toplama
  • Adım 3: Önceden eğitilmiş modeli kullanarak Cümle Yerleştirme
  • Adım 4: Optuna tabanlı Hiper Parametrelerin ayarlanması
  • Adım 5: Nihai Model Eğitimi ve Tahmin

Adım 1 Paketlerin Kurulumu

Bu projede model geliştirme için Kaggle çekirdeğini kullanacağım. Yani bu proje için iki önemli paket kurmamız gerekiyor; cümle_transformers ve Optuna. Kuruluma başlamadan önce GPU’nun etkin olup olmadığından emin olmamız gerekiyor.

cümle_transformers çerçeve, cümleler, paragraflar ve görüntüler için yoğun vektör temsillerini hesaplamak için kolay bir yöntem sağlar. Modeller BERT / RoBERTa / XLM-RoBERTa vb. trafo ağlarını temel alır ve çeşitli görevlerde en son teknolojiye sahip performansa ulaşır.

!pip kurulumu cümle_transformers

Daha sonra yüklememiz gerekiyor Optuna. Scikit-Optimize'den (skopt) farklı örnekleyiciler kullanma olanağına sahiptir. Burada şunu oluşturmamız gerekiyor: ders çalışma nesne ve optimize BT. Harika olan şey, isteyip istemediğimize karar verebilmemiz. maksimuma çıkarma veya en aza indirme amaç fonksiyonumuz.

!pip kurulum seçeneği

Yukarıda belirtilen iki paket kurulduktan sonra gerekli tüm paket ve fonksiyonları içe aktaralım.

numpy'yi np olarak içe aktar pandaları pd olarak içe aktar rastgele içe aktar keras'ı içe aktar meşaleyi içe aktar tensorflow'u tf olarak içe aktar optuna'dan optuna'yı içe aktar sklearn.model_selection'dan denemeyi sklearn.model_selection'dan içe aktar tren_test_split'i keras.callbacks'den içe aktar keras.callbacks'ten KFold'u içe aktar sklearn.metrics'ten LROnPlateau'yu azalt içe aktar log_loss'u içe aktar Cümle_transformers'tan SentenceTransformer'ı içe aktar matplotlib.pyplot'u sklearn içe aktarma ölçümlerinden plt olarak içe aktar SEED = 99 def random_seed(SEED): random.seed(SEED) os.environ['PYTHONHASHSEED'] = str(SEED) np.random.seed(SEED) torch.manual_seed(SEED) torch.cuda.manual_seed(SEED) torch.cuda.manual_seed_all(SEED) torch.backends.cudnn.deterministic = Doğru tf.random.set_seed(SEED) random_seed(SEED)

Adım 2 Veri Toplama

Bu proje için 6136 satır ve 6 sütundan oluşan, ilk sütunu metin alanı ve geri kalan beş sütunu farklı etiketlerden oluşan veri kümesini kullanacağım.

train_data1 = pd.read_csv('train.csv') train_data1.head()

Veri setimizdeki farklı etiketlerin dağılımına bakalım.

comments_labels = train_data1[['Tag1','Tag2','Tag3','Tag4','Tag5']] fig_size = plt.rcParams["figure.figsize"] fig_size[0] = 10 fig_size[1] = 8 plt.rcParams["figure.figsize"] = fig_size comments_labels.sum(axis=0).plot.bar()

Adım 3 Önceden Eğitilmiş Modeli Kullanarak Cümle Yerleştirme

Şimdi cümle_transformer'ı kullanarak metin yerleştirmeyi yapacağız. 100'den fazla dil için en son teknolojiye sahip, önceden eğitilmiş modeller sağlar ve çeşitli durumlar için ince ayarlar yapılmıştır. Bu proje için kullanacağız bert-base-kasasız yerleştirme için model. Gerektiğinde diğer modellerle de oynayabiliriz. Burada ayrıca max_seq_length'i başlatmamız gerekiyor. Bu durum için 512 olarak ayarlanmıştır.

model = SentenceTransformer('bert-base-uncased') model.max_seq_length = 512 print("Maksimum Sıra Uzunluğu:", model.max_seq_length) cümle_embeddings = model.encode(train_data1['İnceleme'])

Cümle yerleştirme işlemi tamamlandıktan sonra veri kümesini eğitim ve test olarak ayıracağız. Daha sonra eğitim veri seti parametre optimizasyonu için kullanılacaktır. Ve test veri seti, model performansını doğrulamak için kullanılacaktır.

train1_x, test_x, train1_y, test_y = train_test_split(sentence_embeddings, comments_labels, train_size=0.8, test_size=0.2, random_state=42)

Adım 4 Optuna tabanlı Hiper Parametre Ayarlama

Böylece bu projenin en ilginç ve karmaşık kısmına geldik. Şimdi bu Çok etiketli metin sınıflandırma modelini çözmek için Sinir Ağını kullanacağım. YSA modelini oluşturduğumuzda, ideal gizli katman ve gizli düğüm sayısı ne olmalıdır, optimum bırakma değeri, optimum parti büyüklüğü, ideal aktivasyon fonksiyonu vb. gibi çeşitli sorular akla gelir. Bunlar sadece başka bir şey değildir. Hiperparametreler. Bir Hiperparametre öğrenme süreci başlamadan önce ayarlanan bir parametredir. Bu parametreler ayarlanabilir ve modelin eğitilme derecesini doğrudan etkileyebilir. Maksimum performansa ulaşmak için bunların nasıl optimize edileceğini anlamak önemlidir. Optimize etmek için bazı yaygın stratejiler vardır Hiperparametreler:

  • Izgara Arama: Manuel olarak önceden tanımlanmış bir dizi hiper parametreyi arayın
  • Rastgele Arama: Izgara aramaya benzer, ancak kapsamlı aramanın yerini rastgele arama alır
  • Bayes Optimizasyonu: Test verilerini değerlendirmek için fonksiyon eşlemenin olasılıksal bir modelini oluşturur
  • Gradyan Tabanlı Optimizasyon: Hiperparametreleri kullanarak degradeyi hesaplayın ve ardından optimize edin

Günümüzün derin öğrenme algoritmaları genellikle birçok hiper parametre içerir ve iyi bir modelin eğitilmesi günler, haftalar alır. Herhangi bir optimizasyon olmadan hiperparametrelerin kaba kuvvet kombinasyonlarını oluşturmak ve her biri için ayrı modeller eğitmek kesinlikle mümkün değildir. Bu yüzden bir Hiperparametre iyileştiriciye ihtiyacımız var.

Optuna biçerdöverler örnekleme ve budama Verimli hiperparametre optimizasyonu sağlayacak mekanizmalar. budama uygulanan mekanizma Optuna eşzamansız bir varyantına dayanmaktadır. Ardışık Yarıya İndirme Algoritması (SHA) ve Ağaç yapılı Parzen Tahmincisi (TPE) varsayılan örnekleyici Optuna'da.

Optimize edebilecek başka paket yok Zincirleyici Hiperparametreleri daha iyi Optuna. Vektör uzayında, Tamsayı, Kayan Nokta ve Kategorik olmak üzere her üç veri türünü de destekler. Şimdi adımlarına yakından bakalım Optuna.

Burada doğrulama kaybını en aza indirmeye çalışacak bir amaç fonksiyonu oluşturduk. Hiperparametreler ' kullanılarak önerilirdeneme' nesne. Aşağıdaki hiperparametreleri optimize ediyoruz:

  • Gizli Katman Sayısı: [1,2,3]
  • Gizli katmanlardaki Gizli Düğümlerin Sayısı: [48 : len(sentence_embeddings[0])]
  • Aktivasyon Fonksiyonu: ['relu', 'linear','swish']
  • Bırakma Oranı: [0:0.6]
  • Parti Boyutu:[8:128]

Daha da genişletilebilir ve diğer parametreler için de uyarlanabilir.

def objektif(deneme): keras.backend.clear_session() train_x, valid_x, train_y, valid_y = train_test_split(train1_x, train1_y, train_size=0.8, test_size=0.2, random_state=42) #optimum gizli katman sayısı n_layers = deneme.suggest_int('n_layers', 1, 3) model = aralıktaki i için keras.Sequential()(n_layers): #optimum gizli düğüm sayısı num_hidden = deneme.suggest_int(f'n_units_l{i}', 48, len(sentence_embeddings[0]), log=True) #optimum aktivasyon fonksiyonu model.add(keras.layers.Dense(num_hidden, input_shape=(len(sentence_embeddings[0]),activation=trial.suggest_categorical(f'activation{i}', ['relu', 'linear','swish) '])))) #optimum bırakma değeri model.add(keras.layers.Dropout(rate = deneme.suggest_float(f'dropout{i}', 0.0, 0.6))) 
 model.add(keras.layers.Dense(5,activation=tf.keras.activations.sigmoid)) #çıktı Katmanı val_ds = (valid_x,valid_y) azaltıcı_lr = DifferentLROnPlateau(monitor='val_loss', faktör=0.1,patience=1,min_lr=1e-05,verbose=0) Early_stoping = EarlyStopping(monitor="val_loss",min_delta=0,patience) =5,verbose=0,mode="auto", baseline=Yok,restore_best_weights=True) model.compile(loss='binary_crossentropy',metrics='categorical_crossentropy', optimizer='Adam') #optimum parti boyutu histroy = model.fit(train_x,train_y, validation_data=val_ds,epochs=200,callbacks=[reduce_lr,early_stoping],verbose=0, Batch_size=trial.suggest_int('size', 8, 128)) return min(histroy. geçmiş['val_loss'])

Bir sonraki adım, Ders çalışma nesneyi seçin ve optimizasyon adımlarını yürütün. İşlem tamamlandıktan sonra, en iyi parametre ayarlarını bulmamız gerekir. Ders çalışma nesne. Burada her iki Maksimum Denemede de eşiği belirledik (deneme) ve Maksimum Süre(zaman aşımı).

if __name__ == "__main__": Study = optuna.create_study(direction=minimize") Study.optimize(objective, n_trials=50, timeout=1200) print("Biten deneme sayısı: {}".format(len( Study.trials))) print("En iyi deneme:") deneme = Study.best_trial print(" Değer: {}".format(trial.value))

Optimizasyon adımı tamamen yürütüldükten sonra en iyi denemeye bakacağız. Aşağıdaki kod kullanılarak da görselleştirilebilir:

optuna.visualization.plot_optimization_history(çalışma)

Grafikten, minimum kayıp değerine sahip olması nedeniyle 12. denemenin en iyisi olduğunu açıkça anlayabiliriz ve karşılık gelen optimum hiperparametreler aşağıdaki kodu kullanarak bulunabilir:

print(" Params: ") for anahtar, deneme.params.items() içindeki değer: print(" {}: {}".format(anahtar, değer))

Çıktı şöyle görünür:

Paramlar: n_layers: 1 n_units_l0: 682 aktivasyon0: relu dropout0: 0.42199525694641216 size: 34

Adım 5 Nihai Model Eğitimi ve Tahmin

Şimdi son modeli oluşturmak ve onu son eğitim için kullanmak için optimum parametreleri kullanacağız. Şimdi aşağıdaki son modeli bulun:

def daha geniş_model(): model = keras.Sequential() model.add(keras.layers.Dense(682,input_shape=(len(sentence_embeddings[0]),activation=tf.keras.activations.yeniden başlama)) model.add(keras.layers.Dropout(0.42199525694641216)) model.add(keras.layers.Dense(5,activation=tf.keras.activations.sigmoid)) dönüş modeli

Aşağıdaki koda dayanarak test veri kümesini tahmin etmek için 5 Katlı Çapraz doğrulama yöntemini deniyorum:

skf = KFold(n_splits=5, shuffle=True, random_state=1234) Final_Subbmission = [] val_loss_print = [] i=1 for train_index, test_index in skf.split(train1_x,train1_y): keras.backend.clear_session() print( '################') print(i) print('#################') X_train, X_test = train1_x[train_index], train1_x[test_index] y_train, y_test = train1_y.iloc[train_index], train1_y.iloc[test_index] model = Wide_model() val_ds = (X_test,y_test) azalt_lr = DifferentLROnPlateau(monitor='val_loss', faktör= 0.1,patience=1,min_lr=1e-05,verbose=1) Early_stoping = EarlyStopping(monitor="val_loss",min_delta=0,patience=5,verbose=1,mode="auto", baseline=Yok,restore_best_weights= True) model.compile(loss='binary_crossentropy',metrics='categorical_crossentropy', optimizer='Adam') histroy = model.fit(X_train,y_train, validation_data=val_ds,epochs=200,callbacks=[reduce_lr,early_stoping], ayrıntılı=1,batch_size=34) print(min(histroy.history['val_loss'])) val_loss_print.append(min(histroy.history['val_loss'])) Test_seq_pred = model.predict(test_x) Final_Subbmission.append(Test_seq_pred) i=i+1

Bu çapraz doğrulama yöntemi, Test veri kümesinin her sınıfı için 5 farklı olasılık kümesi oluşturacaktır. Şimdi bu olasılıkların ortalamasını alacağız.

Test_prob =np.mean(Final_Subbmission,0) Test_prob = pd.DataFrame(Test_prob) Test_prob.columns = comments_labels.columns

Çoklu etiket sınıflandırmasında şunu kullanabiliriz: Ortalama Ortalama Hassasiyet Model performansını ölçmek için. Test veri setimizin değerini kontrol edelim.

test_y1 = test_y.reset_index(drop=True) print("ağırlıklı: {:.2f} ".format( metrics.average_precision_score(test_y1, Test_prob, ortalama='ağırlıklı')))

Çıktı şöyle görünür:

ağırlıklı: 0.90

Yani, yardımıyla 0.9 MAP'a ulaşabiliyoruz. Optuna hiperparametre ayarlayıcı. Henüz ikna olmadıysanız veya modeli daha da geliştirmek istiyorsanız lütfen şu adımları izleyin: Ana Sayfa sayfaya girin ve kendinizi güçlendirin.

Sonuç

Bu makalede, çok etkili bir Çok Etiketli Metin sınıflandırma modeli geliştirmek için üç sihirli adımı açıkladım; Cümle Gömme cümle_transformers'ı kullanarak, sonraki Optuna merkezli hiperparametre optimizasyonu Sinir Ağı modeli için ve son olarak Tren modeli olan optimum hiperparametre seti.

Gerçi uygulamasını anlattım. Optuna Çok Etiketli Metin sınıflandırması için. Ancak bu, diğer Regresyon veya Sınıflandırma modellerine de uyarlanabilir. Adaletli bir şekilde başvurabiliriz Optuna her türlü yapılandırılmış/yapılandırılmamış veri kümesi için. PyTorch, TensorFlow, keras, XGboost, LightGBM, Scikit-Learn, MXNet vb. için kullanabiliriz. Veri Bilimcisine Daha Fazla Güç!!

Mutlu Öğrenme!!

Yazar hakkında

Tirthankar Das: Bankacılık ve Finans, Havacılık, Üretim ve İlaç gibi farklı alanlarda 7.5 yıllık deneyime sahip Veri Bilimi uzmanı. Bağlantı kurmaktan mutluyum LinkedIn

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır. 

spot_img

En Son İstihbarat

spot_img