REGRESYON DIŞINDA KALAN SIK KULLANILAN GÖZETİMLİ ÖĞRENME ALGORİTMALARI
K En Yakın Komşu (K-Nearest Neighbors-K-NN)
K En Yakın Komşu (K-Nearest Neighbors-K-NN) algoritması, bir veri noktasının sınıfını, kendisine en yakın k komşusunun sınıflarına göre belirleyen bir makine öğrenmesi yöntemidir. Hem sınıflandırma hem de regresyon problemlerinde kullanılabilir. K en yakın komşu algoritması, bir veri noktasının hangi kategoriye ait olduğunu belirlemek için, ona en yakın olan diğer veri noktalarına bakar. Bu algoritma, denetimli bir makine öğrenmesi algoritmasıdır, yani veri noktalarının hangi kategorilere ait olduğunu önceden biliyoruz. Örneğin, bir çiçeğin türünü tahmin etmek istiyoruz. Çiçeğin yaprak uzunluğu ve genişliği gibi bazı özelliklerine sahibiz. Bu özellikleri kullanarak, çiçeği bir grafikte gösterebiliriz. K en yakın komşu algoritmasının temel mantığıdır. Bu algoritma, farklı veri türleri ve özellikleri için de kullanılabilir. Örneğin, bir kişinin gelirini, yaşını, eğitimini, mesleğini gibi özelliklerine göre, kredi alıp alamayacağını tahmin etmek için de kullanılabilir. K en yakın komşu algoritmasının avantajları ve dezavantajları vardır. Avantajları şunlardır: Basit ve anlaşılır bir algoritmadır. Eğitim aşaması yoktur, yani veri noktalarını önceden işlemeye gerek yoktur. Farklı veri türleri ve özellikleri için uygulanabilir. Dezavantajları ise şunlardır: Tahmin aşaması yavaş olabilir, çünkü her yeni veri noktası için, tüm veri setine bakmak gerekir. Uzaklık ölçütü, veri setinin özelliklerine göre seçilmelidir. Örneğin, özellikler arasında büyük farklar varsa, standartlaştırma yapmak gerekir. K sayısının belirlenmesi, veri setine ve probleme göre değişir. K çok küçükse, gürültüye duyarlı olabilir. K çok büyükse, sınırlar belirsizleşebilir. Python dilinde K-NN algoritmasını uygulamak için, öncelikle gerekli kütüphaneleri içe aktarmalıyız. Bu kütüphaneler şunlardır: pandas: Veri işleme ve analizi için kullanılır. sklearn: Makine öğrenmesi modelleri ve metrikleri içerir. StandardScaler: Veriyi standartlaştırmak için kullanılır. Ardından, veri setimizi okuyup, bağımlı ve bağımsız değişkenleri ayırmalıyız. Veriyi standartlaştırmak, uzaklık temelli yöntemlerde daha doğru sonuçlar elde etmemizi sağlar. Son olarak, KNeighborsClassifier sınıfından bir model oluşturup, veriye uydurmalıyız. Modelimizi yeni veriler üzerinde tahmin yapmak için kullanabiliriz. Aşağıda, bir veri seti üzerinde K-NN algoritmasını uygulayan basit bir Python kodu örneği verilmiştir. Kod bloğunda, her adımın ne yaptığını açıklayan yorum satırları bulunmaktadır. # Gerekli kütüphaneleri içe aktarma import pandas as pd from sklearn.neighbors import KNeighborsClassifier # K-NN modeli from sklearn.preprocessing import StandardScaler # Veriyi standartlaştırmak # Veri setini okuma df = pd.read_csv("diabetes.csv") # Bağımlı ve bağımsız değişkenleri ayırma y = df["Outcome"] # Bağımlı değişken X = df.drop(["Outcome"], axis=1) # Bağımsız değişkenler # Veriyi standartlaştırma X_scaled = StandardScaler().fit_transform(X) X = pd.DataFrame(X_scaled, columns=X.columns) # K-NN modeli oluşturma ve veriye uydurma knn_model = KNeighborsClassifier().fit(X, y) # Yeni veriler üzerinde tahmin yapma random_user = X.sample(5) # Rasgele 5 veri noktası seçme knn_model.predict(random_user) # Tahmin sonuçlarını gösterme Karar Ağacı (Decision Tree) Karar ağacı algoritması, verileri sınıflara ayırmak veya bir değer tahmin etmek için kullanılan bir makine öğrenmesi yöntemidir. Verilerdeki özellikler, karar ağacının dallarını oluşturur. Her dalda, bir özelliğe göre veriler alt gruplara bölünür. Bu işlem, verilerin homojenliği artana kadar devam eder. Karar ağacının yaprakları, verilerin son sınıflarını veya tahmin edilen değerlerini gösterir. Karar ağacı algoritması, hem sayısal hem de kategorik verilerle çalışabilir. Sayısal verilerde, bir özelliğin belirli bir eşik değerinden büyük veya küçük olması gibi koşullar kullanılır. Kategorik verilerde, bir özelliğin belirli bir kategoriye ait olması gibi koşullar kullanılır. Karar ağacı algoritması, verileri bölmeden önce, hangi özelliğin en iyi bölünmeyi sağladığını belirlemek için bir ölçüt kullanır. Bu ölçüt, verilerin sahip olduğu belirsizliği veya karmaşıklığı azaltmayı amaçlar. Ölçüt olarak, entropi, gini indeksi veya varyans gibi farklı metrikler kullanılabilir. Karar ağacı algoritması, verileri çok fazla bölerek modelin aşırı uyum (overfitting) yapmasına neden olabilir. Aşırı uyum, modelin eğitim verilerinde çok iyi performans göstermesine, ancak yeni verilerde kötü performans göstermesine yol açar. Aşırı uyumu önlemek için, karar ağacının büyümesini sınırlayan bazı parametreler kullanılabilir. Örneğin, karar ağacının maksimum derinliği, minimum yaprak sayısı veya minimum bölünme örnek sayısı gibi parametreler ayarlanabilir. Karar ağacı algoritması, sınıflandırma veya regresyon problemlerinde kullanılabilir. Sınıflandırma problemlerinde, verilerin bir sınıfa ait olma olasılığını tahmin eder. Regresyon problemlerinde, verilerin bir sayısal değerini tahmin eder. Karar ağacı algoritmasının performansını değerlendirmek için, farklı metrikler kullanılabilir. Sınıflandırma problemlerinde, hata matrisi (confusion matrix), modelin doğru ve yanlış tahminlerini gösteren bir tablodur. Hata matrisinden, kesinlik (precision), geri çağırma (recall) ve doğruluk (accuracy) gibi metrikler hesaplanabilir. Kesinlik, modelin doğru tahmin ettiği sınıfın, tüm tahmin ettiği sınıflar arasındaki oranını gösterir. Geri çağırma, modelin doğru tahmin ettiği sınıfın, gerçekten o sınıfa ait olan tüm örnekler arasındaki oranını gösterir. Doğruluk, modelin tüm sınıfları doğru tahmin etme oranını gösterir. Regresyon problemlerinde, ortalama mutlak hata (mean absolute error), ortalama karesel hata (mean squared error) veya kök ortalama karesel hata (root mean squared error) gibi metrikler kullanılabilir. Bu metrikler, modelin tahmin ettiği değerler ile gerçek değerler arasındaki farkı ölçer. Python dilinde, karar ağacı algoritması uygulamak için sklearn kütüphanesi kullanılabilir. Sklearn kütüphanesi, karar ağacı oluşturmak, eğitmek, tahmin yapmak ve değerlendirmek için farklı fonksiyonlar sunar. Ayrıca, karar ağacının grafiksel olarak gösterilmesi için graphviz kütüphanesi kullanılabilir. Aşağıda, sklearn kütüphanesi kullanılarak karar ağacı algoritması uygulayan basit bir Python kodu örneği verilmiştir. Bu kod, iris veri kümesini kullanarak, bir çiçeğin türünü tahmin etmeye çalışır. Kodun açıklamaları yorum satırları olarak verilmiştir. # Gerekli kütüphaneleri içe aktar import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix from sklearn import tree import graphviz # Iris veri kümesini yükle iris = pd.read_csv("raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv") # Veri kümesini bağımsız ve bağımlı değişkenlere ayır X = iris.drop("species", axis=1) # Bağımsız değişkenler (çiçeğin özellikleri) y = iris["species"] # Bağımlı değişken (çiçeğin türü) # Veri kümesini eğitim ve test verileri olarak böl X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Karar ağacı sınıflandırıcısını oluştur clf = DecisionTreeClassifier(criterion="gini", max_depth=3, random_state=42) # Karar ağacı sınıflandırıcısını eğitim verileri ile eğit clf.fit(X_train, y_train) # Test verileri ile tahmin yap y_pred = clf.predict(X_test) # Model performansını değerlendir print("Hata Matrisi: ", confusion_matrix(y_test, y_pred)) print("Sınıflandırma Raporu: ", classification_report(y_test, y_pred)) # Karar ağacını grafiksel olarak göster dot_data = tree.export_graphviz(clf, out_file=None, feature_names=X.columns, class_names=y.unique(), filled=True, rounded=True) graph = graphviz.Source(dot_data) graph.render("iris_decision_tree") Destek Vektör Makineleri (SVM) SVM, iki veya daha fazla sınıf arasındaki verileri ayırmak için kullanılan bir makine öğrenmesi yöntemidir. SVM, verileri en iyi şekilde ayıran bir doğru veya düzlem bulmaya çalışır. Bu doğru veya düzleme karar sınırı denir. Karar sınırı, iki sınıfın en yakın noktalarına (destek vektörleri) eşit uzaklıkta olmalıdır. Bu uzaklığa marj denir. Marj ne kadar büyükse, sınıflandırma o kadar iyi olur. SVM, doğrusal olarak ayrılabilen veriler için iyi çalışır. Ancak bazı veriler doğrusal olarak ayrılamaz. Bu durumda, SVM, verileri daha yüksek boyutlu bir uzaya aktararak sınıflandırma yapabilir. Buna kernel trick denir. Kernel trick, verilerin karmaşıklığını azaltmak için farklı fonksiyonlar kullanır. Örneğin, polinom kernel, verileri polinom fonksiyonu ile çarparak daha yüksek boyutlu bir uzaya aktarır. Gaussian RBF kernel, verilerin belirli bir noktaya ne kadar benzediğini normal dağılım ile hesaplar. Python’da SVM kullanmak için scikit-learn kütüphanesini kullanabilirsiniz. Bu kütüphanede SVC (Support Vector Classifier) ve SVR (Support Vector Regressor) sınıfları bulunur. SVC, sınıflandırma problemleri için, SVR ise regresyon problemleri için kullanılır. Ayrıca kernel, C, degree, gamma gibi hiperparametreleri ayarlayabilirsiniz. Bu hiperparametreler, SVM’in performansını etkiler. Aşağıda, scikit-learn ile basit bir SVM örneği verilmiştir. Bu örnekte, iris veri seti kullanılmıştır. Iris veri seti, üç farklı türdeki iris çiçeğinin yaprak uzunlukları ve genişliklerini içerir. SVM, bu verileri kullanarak çiçek türlerini sınıflandırmaya çalışır. python # Kütüphaneleri içe aktarma from sklearn import datasets from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # Veri setini yükleme iris = datasets.load_iris() X = iris.data # Özellikler y = iris.target # Sınıflar # Veri setini eğitim ve test olarak bölme X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # SVM modelini oluşturma svm = SVC(kernel="rbf", C=1.0, gamma=0.1) # RBF kernel, C=1.0, gamma=0.1 olarak ayarlandı # Modeli eğitim verisi ile eğitme svm.fit(X_train, y_train) # Modeli test verisi ile değerlendirme y_pred = svm.predict(X_test) # Test verisinde tahmin yapma acc = accuracy_score(y_test, y_pred) # Doğruluk skorunu hesaplama print("Accuracy:", acc) # Doğruluk skorunu yazdırma Bu kodu çalıştırdığınızda, doğruluk skorunun yaklaşık olarak 0.95 olduğunu görebilirsiniz. Bu, SVM’in iris veri setini oldukça iyi sınıflandırdığını gösterir. Topluluk Öğrenmesi (Ensemble Learning) Topluluk öğrenmesi, birden fazla makine öğrenmesi modelinin bir arada kullanılarak daha iyi sonuçlar elde etmeyi amaçlayan bir yöntemdir. Bu yöntemde, farklı modellerin tahminleri birleştirilerek nihai bir karar verilir. Topluluk öğrenmesi, tek bir modelin yetersiz kaldığı veya aşırı uyum yaptığı durumlarda faydalı olabilir. Topluluk öğrenmesi modelleri, temel modellerin nasıl eğitildiği ve nasıl birleştirildiğine göre üç ana kategoriye ayrılabilir: torbalama, yükseltme ve yığma. Torbalama, eğitim verisinin rastgele alt kümelerini alarak aynı türden modelleri paralel olarak eğitir. Bu modellerin tahminleri, sınıflandırma için çoğunluk oyu, regresyon için ise ortalama alma yöntemiyle birleştirilir. Torbalama, modellerin varyansını azaltarak daha kararlı bir sonuç verir. Torbalama yöntemlerinden en bilineni, karar ağaçlarından oluşan Rastgele Orman (Random Forest) algoritmasıdır. Yükseltme, eğitim verisinin bir alt kümesiyle bir model eğitir, sonra bu modelin hatalı tahmin ettiği örneklerin ağırlığını artırarak yeni bir model eğitir. Bu işlem, belirli bir sayıda model elde edilene kadar tekrarlanır. Bu modellerin tahminleri, sınıflandırma için ağırlıklı oylama, regresyon için ise ağırlıklı ortalama alma yöntemiyle birleştirilir. Yükseltme, modellerin sapmasını azaltarak daha doğru bir sonuç verir. Yükseltme yöntemlerinden en bilinenleri, AdaBoost, Gradient Boosting ve XGBoost algoritmalarıdır. Yığma, farklı türden modelleri eğitim verisiyle eğitir, sonra bu modellerin tahminlerini yeni bir eğitim verisi olarak kullanarak bir üst model (meta model) eğitir. Bu üst model, temel modellerin tahminlerini birleştirerek nihai bir sonuç verir. Yığma, modellerin çeşitliliğini artırarak daha esnek bir sonuç verir. Yığma yöntemlerinden en bilineni, Stacking algoritmasıdır. Scikit-learn kütüphanesi, Python dilinde makine öğrenmesi uygulamaları için popüler bir araçtır. Bu kütüphanede, sklearn.ensemble modülü altında çeşitli topluluk öğrenmesi modellerine erişilebilir. Bu modeller, veri analizi, sınıflandırma ve regresyon gibi görevler için kullanılabilir. Rastgele Orman (Random Forest) Rastgele Orman algoritması, birden fazla karar ağacı kullanarak sınıflandırma veya regresyon problemlerini çözmek için tasarlanmış bir makine öğrenmesi algoritmasıdır. Bu algoritma, eğitim verilerinin alt kümelerini rastgele seçerek (torbalama) ve her ağaçta kullanılacak özellikleri rastgele belirleyerek (rastgele alt uzay) farklı karar ağaçları oluşturur. Bu şekilde, her ağaç verilere aşırı uyum sağlamaz ve ağaçlar arasındaki korelasyon azalır. Sonuç olarak, ağaçların tahminleri ortalaması alınarak (sınıflandırma için modu) daha doğru ve kararlı bir sonuç elde edilir. GradientBoost ve XGBoost ise, yükseltme (boosting) adı verilen başka bir topluluk yöntemidir. Bu yöntemde, her yeni ağaç, önceki ağaçların hatalarını düzeltmek için eğitilir. Böylece, her ağaç önceki ağaçlara bir iyileştirme katkısı sağlar. GradientBoost, kayıp fonksiyonunun gradyanını hesaplayarak hataları minimize etmeye çalışır. XGBoost ise, GradientBoost’un geliştirilmiş bir versiyonudur. XGBoost, ağaçların karmaşıklığını düzenlemek için L1 ve L2 düzenlileştirme terimleri kullanır. Ayrıca, eğitimi hızlandırmak ve bellek kullanımını azaltmak için verileri histogramlara dönüştürür. Python kodları ile Rastgele Orman, GradientBoost ve XGBoost algoritmalarını kullanmak için aşağıdaki örnekleri inceleyebilirsiniz. python # Rastgele Orman için from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification from sklearn.metrics import accuracy_score # Rastgele bir sınıflandırma verisi oluşturalım X, y = make_classification(n_samples=100, n_features=10, n_classes=2, random_state=42) # Rastgele Orman sınıflandırıcısını tanımlayalım rfc = RandomForestClassifier(n_estimators=100, max_features="sqrt") # Sınıflandırıcıyı verilere uyduralım rfc.fit(X, y) # Tahminleri alalım y_pred = rfc.predict(X) # Doğruluğu hesaplayalım acc = accuracy_score(y, y_pred) print("Rastgele Orman - Doğruluk: ", acc) # GradientBoost için from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import make_classification from sklearn.metrics import accuracy_score # Rastgele bir sınıflandırma verisi oluşturalım X, y = make_classification(n_samples=100, n_features=10, n_classes=2, random_state=42) # GradientBoost sınıflandırıcısını tanımlayalım gbc = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) # Sınıflandırıcıyı verilere uyduralım gbc.fit(X, y) # Tahminleri alalım y_pred = gbc.predict(X) # Doğruluğu hesaplayalım acc = accuracy_score(y, y_pred) print("GradientBoost - Doğruluk: ", acc) # XGBoost için from xgboost import XGBClassifier from sklearn.datasets import make_classification from sklearn.metrics import accuracy_score # Rastgele bir sınıflandırma verisi oluşturalım X, y = make_classification(n_samples=100, n_features=10, n_classes=2, random_state=42) # XGBoost sınıflandırıcısını tanımlayalım xgb = XGBClassifier(n_estimators=100, learning_rate=0.1, reg_lambda=1, reg_alpha=0) # Sınıflandırıcıyı verilere uyduralım xgb.fit(X, y) # Tahminleri alalım y_pred = xgb.predict(X) # Doğruluğu hesaplayalım acc = accuracy_score(y, y_pred) print("XGBoost - Doğruluk: ", acc) |