0
Yorum
1
Beğeni
0,0
Puan
271
Okunma
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)