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
-
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: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Ş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 -
Eğitim için X ve y koordinatlarını iki veri çerçevesine bölün.
cuisineetiketler 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 -
Unnamed: 0sütununu vecuisinesütununudrop()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:
| almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
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:

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:

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_classseçeneğiovrolarak ayarlandıysa bir-vs-hepsi (OvR) şemasını kullanırmulti_classseçeneğimultinomialolarak ayarlandıysa çapraz entropi kaybını kullanır. (Şu andamultinomialseç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:

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.
-
multi_classdeğeriovrve çözücüliblinearolacak ş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
lbfgsgibi farklı bir çözücü deneyinİhtiyaç duyduğunuzda verilerinizi yassılaştırmak için Pandas
ravelfonksiyonunu kullanın.Doğruluk %80'in üzerindedir!
-
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
-
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 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Modelin bunun Hint mutfağı olduğundan neden oldukça emin olduğunu açıklayabilir misiniz?
-
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))precision recall f1-score support chinese 0.73 0.71 0.72 229 indian 0.91 0.93 0.92 254 japanese 0.70 0.75 0.72 220 korean 0.86 0.76 0.81 242 thai 0.79 0.85 0.82 254 accuracy 0.80 1199 macro avg 0.80 0.80 0.80 1199 weighted avg 0.80 0.80 0.80 1199
🚀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
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.