Mutfak sınıflandırıcıları 1

April 20, 2026 · View on GitHub

Bu derste, önceki dersten kaydettiğiniz, dengeli ve temiz verilerle dolu mutfaklar hakkındaki veri kümesini kullanacaksınız.

Bu veri kümesini, bir grup malzemeye dayalı olarak belirli bir ulusal mutfağı tahmin etmek için çeşitli sınıflandırıcılarla kullanacaksınız. Bunu yaparken, algoritmaların sınıflandırma görevleri için nasıl kullanılabileceğine dair daha fazla bilgi edineceksiniz.

Ders öncesi quiz

Hazırlık

1. Dersi tamamladığınızı varsayarak, kök /data klasöründe bu dört ders için bir cleaned_cuisines.csv dosyasının bulunduğundan emin olun.

Alıştırma - ulusal mutfağı tahmin etme

  1. Bu dersin notebook.ipynb klasöründe çalışarak, o dosyayı ve Pandas kütüphanesini içe aktarın:

    import pandas as pd
    cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
    cuisines_df.head()
    

    Veri şu şekilde görünüyor:

Unnamed: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
  1. Şimdi birkaç kütüphane daha içe aktarın:

    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
    from sklearn.svm import SVC
    import numpy as np
    
  2. Eğitim için X ve y koordinatlarını iki veri çerçevesine bölün. cuisine etiketler veri çerçevesi olabilir:

    cuisines_label_df = cuisines_df['cuisine']
    cuisines_label_df.head()
    

    Şu şekilde görünür:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Unnamed: 0 sütununu ve cuisine sütununu drop() ile düşürün. Kalan veriyi eğitilebilir özellikler olarak kaydedin:

    cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
    cuisines_feature_df.head()
    

    Özellikleriniz şöyle görünür:

almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010

Artık modelinizi eğitmeye hazırsınız!

Sınıflandırıcıyı seçmek

Veriniz temizlenip eğitim için hazır olduğuna göre, işi yapmak için hangi algoritmanın kullanılacağına karar vermeniz gerekiyor.

Scikit-learn, sınıflandırmayı Denetimli Öğrenme altında gruplar ve bu kategoride sınıflandırmak için birçok yol bulabilirsiniz. Çeşitlilik ilk bakışta oldukça kafa karıştırıcıdır. Aşağıdaki yöntemler hepsi sınıflandırma tekniklerini içerir:

  • Doğrusal Modeller
  • Destek Vektör Makineleri
  • Stokastik Gradyan İnişi
  • En Yakın Komşular
  • Gaussian İşlemleri
  • Karar Ağaçları
  • Ensemble yöntemleri (oylama sınıflandırıcısı)
  • Çok sınıflı ve çoklu çıktı algoritmaları (çok sınıflı ve çok etiketli sınıflandırma, çok sınıflı-çoklu çıktı sınıflandırma)

Sinir ağlarını da veri sınıflandırmak için kullanabilirsiniz, ancak bu dersin kapsamı dışındadır.

Hangi sınıflandırıcıyı seçmeli?

Peki, hangi sınıflandırıcıyı seçmelisiniz? Çoğunlukla, birkaçını çalıştırıp iyi bir sonuç aramak test yapmanın bir yoludur. Scikit-learn, oluşturulmuş bir veri seti üzerinde KNeighbors, SVC iki şekilde, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ve QuadraticDiscrinationAnalysis'ı karşılaştıran ve sonuçları görselleştiren bir yan yana karşılaştırma sunar:

sınıflandırıcı karşılaştırması

Scikit-learn dokümantasyonunda oluşturulmuş grafikler

AutoML, bu karşılaştırmaları bulutta çalıştırarak veriniz için en iyi algoritmayı seçmenize olanak tanıyarak bu problemi kolayca çözer. Burada deneyin

Daha iyi bir yaklaşım

Ancak, rastgele tahmin etmekten daha iyi bir yol, indirilip kullanılabilecek bu ML Cheat sheet üzerindeki fikirleri takip etmektir. Burada, çok sınıflı problemimiz için bazı seçeneklere sahibiz:

çok sınıflı problemler için cheat sheet

Microsoft’un Algoritma Cheat Sheet’inin bir kısmı, çok sınıflı sınıflandırma seçeneklerine dair detaylar

✅ Bu cheat sheet’i indirin, yazdırın ve duvarınıza asın!

Mantık yürütme

Elimizdeki kısıtlamalar göz önüne alındığında farklı yaklaşımlar üzerine mantık yürütelim:

  • Sinir ağları çok ağırdır. Temiz ancak minimal veri setimiz ve eğitimi yerel olarak defterlerde yaptığımız gerçeği göz önüne alındığında, sinir ağları bu görev için çok ağırdır.
  • İkili sınıflandırıcı yok. İkili sınıflandırıcı kullanmıyoruz, bu yüzden bir-vs-hepsi kuralı dışlanır.
  • Karar ağacı veya lojistik regresyon işe yarayabilir. Karar ağacı veya çok sınıflı veri için lojistik regresyon çalışabilir.
  • Çok sınıflı güçlendirilmiş karar ağaçları farklı bir problemi çözer. Çok sınıflı güçlendirilmiş karar ağacı, sıralamalar oluşturmak gibi parametrik olmayan görevler için daha uygundur, bu yüzden bize faydası yoktur.

Scikit-learn kullanımı

Verimizi analiz etmek için Scikit-learn kullanacağız. Ancak, Scikit-learn’de lojistik regresyon kullanmanın birçok yolu vardır. Geçirilebilecek parametrelere bakın.

Temelde, iki önemli parametre vardır - multi_class ve solver - bunları belirtmemiz gerekir, Scikit-learn’den lojistik regresyon yapmasını istediğimizde. multi_class değeri belirli bir davranışı uygular. solver değeri ise kullanılacak algoritmadır. Tüm çözücüler tüm multi_class değerleriyle eşleşmez.

Dokümanlara göre, çok sınıflı durumda, eğitim algoritması:

  • multi_class seçeneği ovr olarak ayarlandıysa bir-vs-hepsi (OvR) şemasını kullanır
  • multi_class seçeneği multinomial olarak ayarlandıysa çapraz entropi kaybını kullanır. (Şu anda multinomial seçeneği sadece ‘lbfgs’, ‘sag’, ‘saga’ ve ‘newton-cg’ çözücüleri tarafından desteklenmektedir.)"

🎓 Buradaki 'şema' ‘ovr’ (bir-vs-hepsi) veya ‘multinomial’ olabilir. Lojistik regresyon esasen ikili sınıflandırmayı desteklemek için tasarlandığından, bu şemalar çok sınıflı sınıflandırma görevlerini daha iyi ele almasını sağlar. kaynak

🎓 'Çözücü' optimizasyon problemlerinde kullanılacak algoritma olarak tanımlanır. kaynak.

Scikit-learn, çözücülerin farklı veri yapılarının sunduğu zorlukları nasıl işlediğini açıklamak için şu tabloyu sunar:

çözücüler

Alıştırma - veriyi bölme

Önceki derste lojistik regresyondan öğrendiğiniz için, ilk eğitim denememizde lojistik regresyona odaklanabiliriz. Verinizi train_test_split() çağırarak eğitim ve test gruplarına bölün:

X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)

Alıştırma - lojistik regresyon uygulama

Çok sınıflı durumu kullandığınızdan, hangi şema ile çalışacağınızı ve hangi çözücü 'yü ayarlayacağınızı seçmeniz gerekiyor. Çok sınıflı ayarla ve liblinear çözücüsü ile LogisticRegression kullanarak eğitin.

  1. multi_class değeri ovr ve çözücü liblinear olacak şekilde bir lojistik regresyon oluşturun:

    lr = LogisticRegression(multi_class='ovr',solver='liblinear')
    model = lr.fit(X_train, np.ravel(y_train))
    
    accuracy = model.score(X_test, y_test)
    print ("Accuracy is {}".format(accuracy))
    

    ✅ Çoğunlukla varsayılan olarak ayarlanan lbfgs gibi farklı bir çözücü deneyin

    İhtiyaç duyduğunuzda verilerinizi yassılaştırmak için Pandas ravel fonksiyonunu kullanın.

    Doğruluk %80'in üzerindedir!

  2. Bu modeli bir veri satırını (#50) test ederek iş başında görebilirsiniz:

    print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
    print(f'cuisine: {y_test.iloc[50]}')
    

    Sonuç yazdırılır:

    ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
    cuisine: indian
    

    ✅ Farklı bir satır numarası deneyip sonuçları kontrol edin

  3. Daha derine inerek, bu tahminin doğruluğunu kontrol edebilirsiniz:

    test= X_test.iloc[50].values.reshape(-1, 1).T
    proba = model.predict_proba(test)
    classes = model.classes_
    resultdf = pd.DataFrame(data=proba, columns=classes)
    
    topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
    topPrediction.head()
    

    Sonuç yazdırılır - Hint mutfağı en iyi tahmin olarak, iyi bir olasılıkla:

    0
    indian0.715851
    chinese0.229475
    japanese0.029763
    korean0.017277
    thai0.007634

    ✅ Modelin bunun Hint mutfağı olduğundan neden oldukça emin olduğunu açıklayabilir misiniz?

  4. Regresyon derslerinde yaptığınız gibi bir sınıflandırma raporu yazdırarak daha fazla detay alın:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precisionrecallf1-scoresupport
    chinese0.730.710.72229
    indian0.910.930.92254
    japanese0.700.750.72220
    korean0.860.760.81242
    thai0.790.850.82254
    accuracy0.801199
    macro avg0.800.800.801199
    weighted avg0.800.800.801199

🚀Challenge

Bu derste, temizlenmiş verilerinizi kullanarak bir dizi malzemeye dayanarak ulusal bir mutfağı tahmin edebilen bir makine öğrenimi modeli oluşturdunuz. Verileri sınıflandırmak için Scikit-learn'ün sunduğu birçok seçeneği okumak için biraz zaman ayırın. Sahne arkasında neler olup bittiğini anlamak için 'solver' kavramını daha derinlemesine inceleyin.

Ders sonrası quiz

Gözden Geçirme & Kendi Kendine Çalışma

Lojistik regresyonun matematiğini biraz daha derinlemesine inceleyin.

Ödev

Çözücüleri inceleyin


Feragatname:
Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, bulunduğu ana dilde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanılması sonucu ortaya çıkabilecek yanlış anlamalar veya yorum hatalarından sorumlu değiliz.