Garfield
YZF Admin
K-en yakın komşu (KNN) modeli, yeni bir örneği eğitim verisindeki en benzer K örneğe bakarak sınıflandırır veya sayısal bir değer tahmin eder. scikit-learn ile temel akış; veriyi eğitim ve test kümelerine ayırmak, özellikleri ölçeklemek,
KNN iki temel kullanım için seçilir:
Bu ayrım önemlidir:
Kod çalıştığında doğruluk değeri
Regresyonda sonuç sınıf etiketi değil, komşu hedef değerlerinden hesaplanan sayısal tahmindir. Başarıyı doğrulukla değil, probleme uygun hata ölçüleriyle; örneğin ortalama mutlak hata veya ortalama kare hata ile değerlendirin. KNN özellikle çok büyük veri kümelerinde tahmin sırasında çok sayıda uzaklık hesabı yaptığı için yavaşlayabilir; bu durumda veri boyutunu, özellik sayısını ve kullanılan K değerini ayrıca değerlendirmeniz gerekir.
KNeighborsClassifier ya da KNeighborsRegressor modelini kurmak, modeli eğitmek ve test verisiyle sonucu ölçmektir. Aşağıdaki varsayımsal örnekte model, çiçeğin ölçülerine göre türünü tahmin eder.KNN modeli için gerekenler
Python ortamındascikit-learn ve örnekte kullanılan pandas paketleri kurulu olmalıdır. KNN uzaklık hesabına dayandığı için özelliklerin aynı ölçekte olması önemlidir. Örneğin santimetre cinsinden bir özellik ile binlerce değer alan başka bir özellik birlikte kullanılırsa büyük ölçekli özellik sonucu gereğinden fazla etkileyebilir.KNN iki temel kullanım için seçilir:
| Amaç | Kullanılacak sınıf | Çıktı |
|---|---|---|
| Sınıflandırma | KNeighborsClassifier | Etiket veya sınıf adı |
| Sayısal tahmin | KNeighborsRegressor | Sayısal değer |
KNeighborsClassifier “hangi sınıfa ait?” sorusunu, KNeighborsRegressor ise “yaklaşık kaç?” sorusunu yanıtlar. Modelin yüksek doğruluk vermesi, verinin nedensel ilişkisini kanıtlamaz; yalnızca verilen özelliklerle test örnekleri arasındaki benzerliğin işe yaradığını gösterir.Sınıflandırma modeli kurma
Aşağıdaki kod, Iris veri kümesinin bir bölümünü eğitim için kullanır.StandardScaler, her özelliği benzer ölçeğe getirir. Ölçekleyici yalnızca eğitim verisiyle öğrenilir; test verisine doğrudan yeniden öğrenme uygulanmaz. Böylece test bilgisi eğitim aşamasına sızdırılmaz.- Veriyi ve model bileşenlerini içe aktarın. Veri kümesi, eğitim-test bölme aracı ve işlem hattı için gerekli sınıfları kullanın.
- Veriyi eğitim ve test kümelerine ayırın. Test kümesini eğitim sırasında kullanmayın; bu küme modelin görmediği örneklerdeki performansı ölçmek içindir.
- Ölçekleme ve KNN adımlarını bir işlem hattında birleştirin. İşlem hattı, eğitim ve tahmin sırasında aynı dönüşümlerin uygulanmasını sağlar.
- Modeli eğitin ve test verisiyle tahmin üretin. Test doğruluğu, doğru sınıflandırılan örneklerin tüm test örneklerine oranıdır.
Python:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# Örnek veri kümesini yükle
iris = load_iris()
X = iris.data
y = iris.target
# Eğitim ve test kümelerini ayır
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Ölçekleme ile KNN'yi tek işlem hattında birleştir
model = Pipeline([
("olcekleme", StandardScaler()),
("knn", KNeighborsClassifier(n_neighbors=5))
])
# Modeli eğit ve tahmin üret
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Doğruluk:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred, target_names=iris.target_names))
Kod çalıştığında doğruluk değeri
0 ile 1 arasında yazdırılır. Örneğin 0.90, test örneklerinin yaklaşık yüzde 90'ının doğru sınıflandırıldığı anlamına gelir. Bu değer yalnızca kullanılan test bölümü için geçerlidir; farklı bir veri bölmesi veya gerçek üretim verisi aynı sonucu vermeyebilir.K değerini ve uzaklık ölçüsünü ayarlama
n_neighbors=5, her yeni örnek için en yakın beş eğitim örneğinin dikkate alınacağını belirtir. Çok küçük K, modelin tekil veya gürültülü örneklere aşırı duyarlı olmasına; çok büyük K ise farklı sınıfları fazla genellemesine yol açabilir. K değerini tek bir test kümesinde tekrar tekrar seçmek yerine eğitim verisi üzerinde çapraz doğrulamayla karşılaştırmak daha güvenlidir.
Python:
from sklearn.model_selection import GridSearchCV
arama = GridSearchCV(
estimator=model,
param_grid={
"knn__n_neighbors": [3, 5, 7, 9, 11],
"knn__weights": ["uniform", "distance"]
},
cv=5,
scoring="accuracy"
)
arama.fit(X_train, y_train)
print("En iyi ayarlar:", arama.best_params_)
print("Çapraz doğrulama skoru:", arama.best_score_)
print("Test skoru:", arama.score(X_test, y_test))
uniform, komşuların eşit ağırlıkta sayılmasıdır. distance, daha yakın komşulara daha fazla ağırlık verir. Çapraz doğrulama skoru eğitim verisinin kendi bölümleri arasındaki performansı, test skoru ise en son ayrılan görülmemiş bölümdeki performansı gösterir. İkisi arasındaki büyük fark aşırı uyum veya veri bölünmesi sorunu olabileceğini düşündürür; bu durum tek başına kesin bir teşhis değildir.Sayısal değer tahmin etme
Hedef sütun sınıf adı değil de fiyat, sıcaklık veya puan gibi sayısal bir değer olduğunda sınıfı değiştirin:
Python:
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error
# Iris tür etiketleri yerine sürekli sayısal hedefli örnek veri kullan.
X_reg, y_reg = make_regression(
n_samples=100, n_features=4, noise=10, random_state=42
)
X_reg_train, X_reg_test, y_reg_train, y_reg_test = train_test_split(
X_reg, y_reg, test_size=0.2, random_state=42
)
regresyon_modeli = Pipeline([
("olcekleme", StandardScaler()),
("knn", KNeighborsRegressor(n_neighbors=5, weights="distance"))
])
regresyon_modeli.fit(X_reg_train, y_reg_train)
tahminler = regresyon_modeli.predict(X_reg_test)
print(tahminler[:5])
print("Ortalama mutlak hata:", mean_absolute_error(y_reg_test, tahminler))
Regresyonda sonuç sınıf etiketi değil, komşu hedef değerlerinden hesaplanan sayısal tahmindir. Başarıyı doğrulukla değil, probleme uygun hata ölçüleriyle; örneğin ortalama mutlak hata veya ortalama kare hata ile değerlendirin. KNN özellikle çok büyük veri kümelerinde tahmin sırasında çok sayıda uzaklık hesabı yaptığı için yavaşlayabilir; bu durumda veri boyutunu, özellik sayısını ve kullanılan K değerini ayrıca değerlendirmeniz gerekir.
Son düzenleme: