Scikit-learn (sklearn) Nedir ve Neden Kullanılmalıdır?
Scikit-learn, Python programlama dili için açık kaynaklı bir makine öğrenmesi kütüphanesidir. Basit ve verimli araçlar sunarak, veri analizi ve modelleme görevlerini kolaylaştırmayı hedefler. Scikit-learn, sınıflandırma, regresyon, kümeleme, boyut indirgeme, model seçimi ve önişleme gibi geniş bir yelpazede algoritmaları içerir.
Neden Scikit-learn Kullanmalıyız?
- Kullanım Kolaylığı: Temiz ve tutarlı bir API'ye sahiptir, bu da öğrenmeyi ve kullanmayı kolaylaştırır.
- Geniş Algoritma Yelpazesi: Çeşitli makine öğrenmesi algoritmalarını içerir, böylece farklı veri setleri ve problem türleri için uygun modelleri kolayca deneyebilirsiniz.
- Dokümantasyon: Kapsamlı ve iyi düzenlenmiş bir dokümantasyona sahiptir, bu da algoritma detaylarını ve kullanım örneklerini anlamayı kolaylaştırır.
- Topluluk Desteği: Büyük ve aktif bir topluluğa sahiptir, bu da sorun giderme ve yardım alma konusunda avantaj sağlar.
- Entegrasyon: NumPy, SciPy ve Matplotlib gibi diğer bilimsel Python kütüphaneleriyle sorunsuz bir şekilde entegre olur.
- Performans: Cython ile yazılmış bazı kısımları sayesinde yüksek performansa sahiptir.
Scikit-learn'ün Temel Bileşenleri Nelerdir?
Scikit-learn kütüphanesi, çeşitli makine öğrenmesi görevlerini gerçekleştirmek için kullanılabilecek birçok farklı modül ve sınıfa sahiptir. İşte en temel bileşenlerden bazıları:
- Estimators (Tahminleyiciler): Makine öğrenmesi modellerini eğitmek ve tahminler yapmak için kullanılan temel sınıflardır. Örnek:
LinearRegression
,LogisticRegression
,DecisionTreeClassifier
. - Transformers (Dönüştürücüler): Verileri önişlemek ve dönüştürmek için kullanılan sınıflardır. Örnek:
StandardScaler
,MinMaxScaler
,PCA
. - Datasets (Veri Setleri): Scikit-learn, deneme ve öğrenme amaçlı kullanılabilecek bazı yerleşik veri setleri içerir. Örnek:
load_iris
,load_digits
,make_classification
. - Model Selection (Model Seçimi): Modelleri değerlendirmek ve en iyi parametreleri bulmak için kullanılan araçlardır. Örnek:
train_test_split
,cross_val_score
,GridSearchCV
. - Metrics (Metrikler): Model performansını ölçmek için kullanılan fonksiyonlardır. Örnek:
accuracy_score
,mean_squared_error
,r2_score
.
Örnek Kod: Basit Bir Doğrusal Regresyon Modeli
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# Veri oluşturma
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])
# Veriyi eğitim ve test kümelerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Doğrusal regresyon modelini oluşturma ve eğitme
model = LinearRegression()
model.fit(X_train, y_train)
# Test verisi üzerinde tahmin yapma
y_pred = model.predict(X_test)
# Hata metriklerini hesaplama
mse = mean_squared_error(y_test, y_pred)
print(f"Ortalama Karesel Hata (MSE): {mse}")
Veri Önişleme (Preprocessing) Neden Önemlidir ve Hangi Teknikler Kullanılır?
Veri önişleme, makine öğrenmesi modellerinin performansını önemli ölçüde etkileyebilir. Ham veriler genellikle eksik değerler, aykırı değerler ve tutarsız formatlar içerir. Bu nedenle, verileri modellemeye uygun hale getirmek için önişleme adımları gereklidir.
Veri Önişleme Teknikleri:
- Eksik Değerlerin İşlenmesi: Eksik değerleri doldurmak için çeşitli yöntemler kullanılabilir.
- Ortalama/Medyan ile Doldurma: Sayısal sütunlardaki eksik değerler, o sütunun ortalaması veya medyanı ile doldurulabilir.
- Sabit Bir Değerle Doldurma: Eksik değerler, belirli bir sabit değerle (örneğin, 0 veya -1) doldurulabilir.
- En Sık Görülen Değerle Doldurma: Kategorik sütunlardaki eksik değerler, o sütunda en sık görülen değerle doldurulabilir.
- KNN Doldurma: K-En Yakın Komşu algoritması kullanılarak eksik değerler tahmin edilebilir.
- Özellik Ölçeklendirme (Feature Scaling): Farklı ölçeklerdeki özellikleri aynı aralığa getirmek için kullanılır.
- Standardizasyon (StandardScaler): Özellikleri ortalaması 0 ve standart sapması 1 olacak şekilde ölçeklendirir.
- Min-Max Ölçeklendirme (MinMaxScaler): Özellikleri belirli bir aralığa (genellikle 0 ile 1 arasına) ölçeklendirir.
- RobustScaler: Aykırı değerlere karşı daha dayanıklıdır ve medyanı kullanır.
- Kategorik Verilerin Kodlanması (Categorical Encoding): Kategorik verileri sayısal verilere dönüştürmek için kullanılır.
- One-Hot Encoding: Her kategori için ayrı bir sütun oluşturur ve ilgili satırda 1, diğerlerinde 0 değerini atar.
- Label Encoding: Her kategoriye benzersiz bir sayısal etiket atar.
- Ordinal Encoding: Kategoriler arasında bir sıralama varsa, bu sıralamaya göre sayısal etiketler atanır.
- Aykırı Değerlerin İşlenmesi (Outlier Handling): Aykırı değerleri tespit etmek ve düzeltmek için kullanılır.
- Z-Skor Yöntemi: Z-skoru belirli bir eşiği aşan değerler aykırı değer olarak kabul edilir.
Örnek Kod: Veri Önişleme
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
import pandas as pd
# Örnek veri seti
data = {'cinsiyet': ['erkek', 'kadın', 'erkek', 'kadın', None],
'yas': [25, 30, None, 35, 40],
'maas': [50000, 60000, 70000, 80000, 90000]}
df = pd.DataFrame(data)
# Eksik değerleri doldurma
imputer_yas = SimpleImputer(strategy='mean')
df['yas'] = imputer_yas.fit_transform(df[['yas']])
imputer_cinsiyet = SimpleImputer(strategy='most_frequent')
df['cinsiyet'] = imputer_cinsiyet.fit_transform(df[['cinsiyet']])
# Kategorik verileri kodlama
encoder = OneHotEncoder(sparse_output=False)
encoded_cinsiyet = encoder.fit_transform(df[['cinsiyet']])
encoded_df = pd.DataFrame(encoded_cinsiyet, columns=encoder.get_feature_names_out(['cinsiyet']))
df = pd.concat([df, encoded_df], axis=1)
df.drop('cinsiyet', axis=1, inplace=True)
# Özellik ölçeklendirme
scaler = StandardScaler()
df['maas'] = scaler.fit_transform(df[['maas']])
print(df)
Model Seçimi ve Değerlendirme Nasıl Yapılır?
Model seçimi ve değerlendirme, bir makine öğrenmesi projesinin kritik adımlarındandır. Farklı algoritmaların ve parametrelerin performansını karşılaştırarak, en iyi modeli seçmek ve modelin gerçek dünyadaki performansını tahmin etmek için kullanılır.
Model Seçimi Yöntemleri:
- Train-Test Split: Veri seti, eğitim ve test kümelerine ayrılır. Model eğitim kümesi üzerinde eğitilir ve test kümesi üzerinde değerlendirilir.
- Cross-Validation (Çapraz Doğrulama): Veri seti, birden fazla katmana ayrılır. Model, her katman için farklı bir kombinasyon kullanılarak eğitilir ve değerlendirilir. Bu, modelin genelleme yeteneğini daha iyi tahmin etmeye yardımcı olur.
- K-Fold Cross-Validation: Veri seti K eşit parçaya ayrılır. Her bir parça sırayla test kümesi olarak kullanılırken, geri kalan parçalar eğitim kümesi olarak kullanılır.
- Stratified K-Fold Cross-Validation: Sınıf dağılımlarının korunması gereken durumlarda kullanılır. Her katmanda sınıf oranları aynı kalır.
- Grid Search: Modelin hiperparametrelerini optimize etmek için kullanılır. Belirli bir parametre aralığında tüm olası kombinasyonları dener ve en iyi performansı veren parametreleri seçer.
- Randomized Search: Grid Search'e benzer, ancak parametre kombinasyonlarını rastgele seçer. Özellikle geniş parametre aralıklarında daha verimli olabilir.
Model Değerlendirme Metrikleri:
- Sınıflandırma Metrikleri:
- Accuracy (Doğruluk): Toplam doğru tahminlerin oranı.
- Precision (Kesinlik): Pozitif olarak tahmin edilen örneklerin ne kadarının gerçekten pozitif olduğunu gösterir.
- Recall (Hassasiyet): Gerçekte pozitif olan örneklerin ne kadarının doğru bir şekilde pozitif olarak tahmin edildiğini gösterir.
- F1-Score: Precision ve Recall'ın harmonik ortalamasıdır.
- AUC-ROC: ROC eğrisinin altında kalan alandır ve modelin sınıflandırma performansını değerlendirmek için kullanılır.
- Regresyon Metrikleri:
- Mean Squared Error (MSE): Tahmin edilen değerler ile gerçek değerler arasındaki farkların karelerinin ortalamasıdır.
- Root Mean Squared Error (RMSE): MSE'nin kareköküdür.
- Mean Absolute Error (MAE): Tahmin edilen değerler ile gerçek değerler arasındaki farkların mutlak değerlerinin ortalamasıdır.
- R-squared (R²): Modelin bağımsız değişkenler tarafından açıklanan varyansın yüzdesini gösterir.
Örnek Kod: Model Seçimi ve Değerlendirme
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_iris
# Veri setini yükleme
iris = load_iris()
X, y = iris.data, iris.target
# Veriyi eğitim ve test kümelerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Lojistik regresyon modelini oluşturma
model = LogisticRegression(max_iter=1000)
# Çapraz doğrulama ile modelin performansını değerlendirme
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print(f"Çapraz Doğrulama Doğrulukları: {cv_scores}")
print(f"Ortalama Çapraz Doğrulama Doğruluğu: {cv_scores.mean()}")
# Grid Search ile hiperparametre optimizasyonu
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
print(f"En İyi Parametreler: {grid_search.best_params_}")
print(f"En İyi Çapraz Doğrulama Doğruluğu: {grid_search.best_score_}")
# En iyi model ile test verisi üzerinde tahmin yapma
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
# Modelin performansını değerlendirme
accuracy = accuracy_score(y_test, y_pred)
print(f"Test Doğruluğu: {accuracy}")
print(classification_report(y_test, y_pred))
Scikit-learn ile Kümeleme (Clustering) Nasıl Yapılır?
Kümeleme, benzer özelliklere sahip veri noktalarını gruplara ayırma işlemidir. Scikit-learn, K-Means, Hierarchical Clustering, DBSCAN gibi çeşitli kümeleme algoritmaları sunar.
K-Means Kümeleme:
K-Means, veri noktalarını K sayıda kümeye ayırmayı amaçlayan bir algoritmadır. Her küme, bir merkez noktası (centroid) ile temsil edilir ve veri noktaları, en yakın merkez noktasına sahip kümeye atanır. Algoritma, merkez noktalarının konumunu yinelemeli olarak güncelleyerek kümeleri optimize eder.
Adım Adım K-Means Kümeleme:
- K değerini belirleyin: Kaç küme oluşturmak istediğinize karar verin.
- Başlangıç merkez noktalarını seçin: Rastgele K sayıda veri noktasını başlangıç merkez noktası olarak seçin.
- Veri noktalarını kümelere atayın: Her veri noktasını, en yakın merkez noktasına sahip kümeye atayın.
- Merkez noktalarını güncelleyin: Her kümenin merkez noktasını, o kümedeki veri noktalarının ortalaması olarak güncelleyin.
- Tekrarlayın: Adım 3 ve 4'ü, merkez noktaları değişmeyene veya belirli bir sayıda yineleme tamamlanana kadar tekrarlayın.
Hierarchical Clustering (Hiyerarşik Kümeleme):
Hiyerarşik kümeleme, veri noktalarını bir hiyerarşik yapı içinde gruplara ayırmayı amaçlayan bir algoritmadır. İki ana türü vardır: Agglomerative (birleştirici) ve Divisive (bölücü).
DBSCAN (Density-Based Spatial Clustering of Applications with Noise):
DBSCAN, veri noktalarının yoğunluğuna göre kümeler oluşturmayı amaçlayan bir algoritmadır. Gürültülü verilerle başa çıkmak için etkilidir ve küme sayısını önceden belirtmeyi gerektirmez.
Örnek Kod: K-Means Kümeleme
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# Örnek veri seti oluşturma
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# K-Means modelini oluşturma ve eğitme
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
y_kmeans = kmeans.fit_predict(X)
# Kümeleme sonuçlarını görselleştirme
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75);
plt.show()
Boyut İndirgeme (Dimensionality Reduction) Teknikleri Nelerdir ve Ne İşe Yararlar?
Boyut indirgeme, veri setindeki özellik sayısını azaltma işlemidir. Yüksek boyutlu verilerle çalışırken, modelin karmaşıklığını azaltmak, hesaplama maliyetini düşürmek ve overfitting'i önlemek için kullanılır.
Boyut İndirgeme Teknikleri:
- Principal Component Analysis (PCA): Veri setindeki varyansı en iyi şekilde açıklayan temel bileşenleri bulur ve orijinal özellikleri bu bileşenlere dönüştürür.
- Linear Discriminant Analysis (LDA): Sınıflar arasındaki ayrımı en iyi şekilde sağlayan doğrusal kombinasyonları bulur. Sınıflandırma problemlerinde kullanılır.
- t-distributed Stochastic Neighbor Embedding (t-SNE): Yüksek boyutlu verileri düşük boyutlu bir uzaya (genellikle 2 veya 3 boyutlu) gömerek görselleştirmeyi kolaylaştırır.
- Feature Selection (Özellik Seçimi): Veri setindeki en önemli özellikleri seçer ve geri kalan özellikleri atar.
- Variance Thresholding: Düşük varyansa sahip özellikleri atar.
- SelectKBest: Belirli bir sayıda en iyi özelliği seçer.
- Recursive Feature Elimination (RFE): Modelin performansına göre özellikleri yinelemeli olarak eler.
Örnek Kod: PCA ile Boyut İndirgeme
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# Veri setini yükleme
iris = load_iris()
X, y = iris.data, iris.target
# PCA modelini oluşturma ve eğitme
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
# Boyut indirgenmiş veriyi görselleştirme
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='viridis')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
Scikit-learn Algoritmalarının Karşılaştırılması
Algoritma | Tür | Avantajları | Dezavantajları | Uygulama Alanları |
---|---|---|---|---|
Linear Regression | Regresyon | Basit, hızlı, yorumlanabilir | Doğrusal ilişkiler gerektirir, aykırı değerlere duyarlı | Fiyat tahmini, talep tahmini |
Logistic Regression | Sınıflandırma | Basit, hızlı, yorumlanabilir | Doğrusal ayrılabilirlik gerektirir | Spam filtreleme, kredi riski değerlendirmesi |
Decision Tree | Sınıflandırma, Regresyon | Yorumlanabilir, doğrusal olmayan ilişkileri modelleyebilir | Overfitting'e yatkın | Müşteri segmentasyonu, risk analizi |
Random Forest | Sınıflandırma, Regresyon | Yüksek doğruluk, overfitting'e karşı dayanıklı | Yorumlanabilirlik zor | Görüntü sınıflandırma, dolandırıcılık tespiti |
Support Vector Machine (SVM) | Sınıflandırma, Regresyon | Yüksek boyutlu verilerde iyi performans, çeşitli kernel fonksiyonları | Parametre ayarlaması zor, büyük veri setlerinde yavaş | Metin sınıflandırma, biyoinformatik |
K-Means | Kümeleme | Basit, hızlı | Küme sayısını önceden belirlemek gerekir, yerel minimumlara takılabilir | Müşteri segmentasyonu, anomali tespiti |
Scikit-learn ile Pipeline Kullanımı
Pipeline, makine öğrenmesi iş akışındaki adımları (veri önişleme, özellik mühendisliği, model eğitimi vb.) tek bir nesne altında birleştirmeyi sağlayan bir araçtır. Bu, kodun daha düzenli, okunabilir ve bakımı kolay olmasını sağlar.
Pipeline'ın Avantajları:
- Kodun Düzenlenmesi: İş akışındaki adımları tek bir yerde tanımlar.
- Hata Önleme: Eğitim ve test verilerine aynı önişleme adımlarını uygulayarak tutarlılık sağlar.
- Model Seçimi ve Hiperparametre Optimizasyonu: Cross-validation ve Grid Search gibi teknikleri daha kolay kullanmanızı sağlar.
- Kodun Tekrar Kullanılabilirliği: Aynı iş akışını farklı veri setleri üzerinde kolayca uygulayabilirsiniz.
Örnek Kod: Pipeline Kullanımı
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# Veri setini yükleme
iris = load_iris()
X, y = iris.data, iris.target
# Veriyi eğitim ve test kümelerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Sayısal ve kategorik sütunları tanımlama
numeric_features = [0, 1, 2, 3]
# kategorik özellik olmadığı için boş liste
categorical_features = []
# Önişleme adımlarını tanımlama
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# ColumnTransformer ile önişleme adımlarını birleştirme
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
# Modeli tanımlama
model = LogisticRegression(solver='liblinear', random_state=0)
# Pipeline'ı oluşturma
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', model)])
# Modeli eğitme
pipeline.fit(X_train, y_train)
# Test verisi üzerinde tahmin yapma
y_pred = pipeline.predict(X_test)
# Modelin performansını değerlendirme
from sklearn.metrics import accuracy_score, classification_report
accuracy = accuracy_score(y_test, y_pred)
print(f"Doğruluk: {accuracy}")
print(classification_report(y_test, y_pred))
Scikit-learn'de Kullanılan Yaygın Veri Setleri
Veri Seti | Açıklama | Kullanım Alanları | Özellik Sayısı | Örnek Sayısı |
---|---|---|---|---|
Iris | Çiçeklerin taç ve çanak yapraklarının uzunluk ve genişlikleri | Sınıflandırma, kümeleme | 4 | 150 |
Digits | El yazısıyla yazılmış rakamların görüntüleri | Sınıflandırma | 64 | 1797 |
Breast Cancer | Meme kanseri hücrelerinin özellikleri | Sınıflandırma | 30 | 569 |
Wine | Şarapların kimyasal özellikleri | Sınıflandırma | 13 | 178 |
Boston Housing | Boston'daki evlerin özellikleri ve fiyatları | Regresyon | 13 | 506 |
Gerçek Hayattan Örnekler ve Vaka Çalışmaları
- Müşteri Segmentasyonu: Bir perakende şirketi, müşteri verilerini (satın alma geçmişi, demografik bilgiler vb.) kullanarak müşterilerini farklı segmentlere ayırmak isteyebilir. Scikit-learn'deki kümeleme algoritmaları (K-Means, DBSCAN) bu amaçla kullanılabilir.
- Dolandırıcılık Tespiti: Bir finans kuruluşu, kredi kartı işlemlerini analiz ederek dolandırıcılık faaliyetlerini tespit etmek isteyebilir. Scikit-learn'deki sınıflandırma algoritmaları (Logistic Regression, Random Forest) bu amaçla kullanılabilir.
- Sağlık Teşhisi: Bir hastane, hasta verilerini (semptomlar, test sonuçları vb.) kullanarak hastalık teşhisi koymak isteyebilir. Scikit-learn'deki sınıflandırma algoritmaları (Support Vector Machine, Decision Tree) bu amaçla kullanılabilir.
- Doğal Dil İşleme: Bir şirket, müşteri geri bildirimlerini analiz ederek ürün veya hizmetlerinin kalitesini artırmak isteyebilir. Scikit-learn'deki metin sınıflandırma algoritmaları bu amaçla kullanılabilir.
Scikit-learn ile İlgili İpuçları ve Püf Noktaları
- Veri Önişlemeye Özen Gösterin: Veri önişleme, model performansını önemli ölçüde etkileyebilir. Eksik değerlerin işlenmesi, özellik ölçeklendirme ve kategorik verilerin kodlanması gibi adımlara dikkat edin.
- Doğru Algoritmayı Seçin: Farklı algoritmaların farklı veri setleri ve problem türleri için daha uygun olduğunu unutmayın. Deneme yanılma yöntemiyle en iyi algoritmayı bulmaya çalışın.
- Hiperparametreleri Optimize Edin: Modelin hiperparametrelerini optimize etmek, performansını artırabilir. Grid Search ve Randomized Search gibi teknikleri kullanarak en iyi parametreleri bulmaya çalışın.
- Modeli Değerlendirin: Modelin performansını değerlendirmek için uygun metrikleri kullanın. Sınıflandırma problemleri için accuracy, precision, recall ve F1-score gibi metrikleri, regresyon problemleri için MSE, RMSE ve R² gibi metrikleri kullanabilirsiniz.
- Pipeline Kullanın: Pipeline, kodun daha düzenli, okunabilir ve bakımı kolay olmasını sağlar. Makine öğrenmesi iş akışındaki adımları tek bir nesne altında birleştirmek için Pipeline kullanın.
- Dokümantasyonu İnceleyin: Scikit-learn'ün kapsamlı dokümantasyonu, algoritma detaylarını ve kullanım örneklerini anlamanıza yardımcı olabilir.