Scikit-learn'ün işlevselliğini genişletmek ve kendi makine öğrenimi algoritmalarınızı uygulamak için scikit-learn'de özel tahmin ediciler oluşturmayı öğrenin. Bu kılavuz, temel bilgilerden ileri tekniklere kadar her şeyi kapsar.
Python Scikit-learn Özel Tahmin Ediciler: Algoritma Uygulamasına Kapsamlı Bir Kılavuz
Scikit-learn, makine öğrenimi için güçlü ve yaygın olarak kullanılan bir Python kütüphanesidir. Önceden oluşturulmuş çok çeşitli algoritmalar sunsa da, kendi özel algoritmalarınızı uygulamanız gereken durumlar vardır. Neyse ki, scikit-learn, özel tahmin ediciler oluşturmak için esnek bir çerçeve sunarak algoritmalarınızı scikit-learn ekosistemine sorunsuz bir şekilde entegre etmenize olanak tanır. Bu kapsamlı kılavuz, temel bilgileri anlamaktan ileri teknikleri uygulamaya kadar özel tahmin ediciler oluşturma sürecinde size yol gösterecektir. Özel tahmin edicilerin pratik uygulamalarını göstermek için gerçek dünya örneklerini de inceleyeceğiz.
Neden Özel Tahmin Ediciler Oluşturmalısınız?
Uygulama ayrıntılarına dalmadan önce, neden özel tahmin ediciler oluşturmak isteyebileceğinizi anlayalım:
- Yeni Algoritmalar Uygulayın: Scikit-learn, mümkün olan her makine öğrenimi algoritmasını kapsamaz. Yeni bir algoritma geliştirdiyseniz veya bir araştırma makalesini uygulamak istiyorsanız, özel bir tahmin edici oluşturmak doğru yoldur.
- Mevcut Algoritmaları Özelleştirin: Mevcut bir scikit-learn algoritmasını özel ihtiyaçlarınıza daha iyi uyacak şekilde değiştirmek isteyebilirsiniz. Özel tahmin ediciler, mevcut işlevselliği genişletmenize veya uyarlamanıza olanak tanır.
- Harici Kütüphanelerle Entegre Edin: Doğrudan scikit-learn ile uyumlu olmayan diğer Python kütüphanelerinden algoritmalar kullanmak isteyebilirsiniz. Özel tahmin ediciler, bu kütüphaneler ve scikit-learn'ün API'si arasında bir köprü sağlar.
- Kodun Yeniden Kullanılabilirliğini Artırın: Algoritmanızı özel bir tahmin edici içinde kapsülleyerek, onu farklı projelerde kolayca yeniden kullanabilir ve başkalarıyla paylaşabilirsiniz.
- Boru Hattı Entegrasyonunu Geliştirin: Özel tahmin ediciler, scikit-learn'ün boru hatlarıyla sorunsuz bir şekilde entegre olarak karmaşık makine öğrenimi iş akışları oluşturmanıza olanak tanır.
Scikit-learn Tahmin Edicilerinin Temel Bilgilerini Anlamak
Özünde, bir scikit-learn tahmin edicisi, fit ve predict yöntemlerini (ve bazen transform veya fit_transform gibi diğer yöntemleri) uygulayan bir Python sınıfıdır. Bu yöntemler, tahmin edicinin eğitim ve tahmin sırasındaki davranışını tanımlar. İki ana tahmin edici türü vardır:
- Dönüştürücüler: Bu tahmin ediciler, verileri bir formattan diğerine dönüştürür. Örnekler arasında
StandardScaler,PCAveOneHotEncoderbulunur. Genelliklefitvetransformyöntemlerini uygularlar. - Modeller (Tahminciler): Bu tahmin ediciler, verilerden bir model öğrenir ve tahminlerde bulunmak için kullanır. Örnekler arasında
LinearRegression,DecisionTreeClassifierveKMeansbulunur. Genelliklefitvepredictyöntemlerini uygularlar.
Her iki tahmin edici türü de ortak bir API paylaşır ve bunları boru hatlarında ve diğer scikit-learn araçlarında birbirinin yerine kullanmanıza olanak tanır.
Basit Bir Özel Dönüştürücü Oluşturma
Basit bir özel dönüştürücü örneğiyle başlayalım. Bu dönüştürücü, her özelliği sabit bir faktörle ölçekleyecektir. Bu dönüştürücü, `StandardScaler`'a benzer, ancak daha basittir ve özel bir ölçekleme faktörü belirtmenize olanak tanır.
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np
class FeatureScaler(BaseEstimator, TransformerMixin):
def __init__(self, factor=1.0):
self.factor = factor
def fit(self, X, y=None):
# No fitting needed for this transformer
return self
def transform(self, X):
return X * self.factor
İşte kodun bir dökümü:
- Kalıtım:
BaseEstimatorveTransformerMixin'den miras alıyoruz.BaseEstimator,get_paramsveset_paramsgibi temel işlevler sağlarken,TransformerMixin,fit_transformiçin varsayılan bir uygulama sağlar (bu da öncefit'i ve ardındantransform'u çağırır). __init__: Bu, yapıcıdır. Ölçekleme faktörünü bir argüman olarak alır veself.factorözniteliğinde saklar. Tahmin edicinizin parametrelerini yapılandırıcıda tanımlamak önemlidir.fit: Bu yöntem, dönüştürücüyü verilere uydurmak için çağrılır. Bu durumda, verilerden herhangi bir şey öğrenmemize gerek yok, bu yüzden sadeceself'i döndürüyoruz.yargümanı genellikle dönüştürücüler için kullanılmaz, ancak scikit-learn API'siyle uyumluluk için gereklidir.transform: Bu yöntem, verileri dönüştürmek için çağrılır. Her özelliği ölçekleme faktörüyle çarparız.
Şimdi, bu özel dönüştürücünün nasıl kullanılacağını görelim:
# Example Usage
from sklearn.pipeline import Pipeline
X = np.array([[1, 2], [3, 4], [5, 6]])
# Create a FeatureScaler with a factor of 2
scaler = FeatureScaler(factor=2.0)
# Transform the data
X_transformed = scaler.transform(X)
print(X_transformed)
# Output:
# [[ 2. 4.]
# [ 6. 8.]
# [10. 12.]]
# Using in a pipeline
pipe = Pipeline([('scaler', FeatureScaler(factor=3.0))])
X_transformed_pipeline = pipe.fit_transform(X)
print(X_transformed_pipeline)
# Output:
# [[ 3. 6.]
# [ 9. 12.]
# [15. 18.]]
Basit Bir Özel Model (Tahmin Edici) Oluşturma
Ardından, basit bir özel model oluşturalım. Bu model, gelecekteki tüm tahminler için eğitim verilerinin ortalamasını tahmin edecektir. Özellikle yararlı olmasa da, özel bir tahmin edicinin temel yapısını gösterir.
from sklearn.base import BaseEstimator, RegressorMixin
import numpy as np
class MeanPredictor(BaseEstimator, RegressorMixin):
def __init__(self):
self.mean_ = None
def fit(self, X, y):
self.mean_ = np.mean(y)
return self
def predict(self, X):
return np.full(X.shape[0], self.mean_)
İşte kodun bir dökümü:
- Kalıtım:
BaseEstimatorveRegressorMixin'den miras alıyoruz.RegressorMixin, regresyonla ilgili yöntemler için varsayılan uygulamalar sağlar (ancak bu örnekte bunları kullanmıyoruz). __init__:self.mean_öğesiniNoneolarak başlatıyoruz. Bu öznitelik, uydurulduktan sonra hedef değişkenin ortalamasını saklayacaktır.fit: Bu yöntem, hedef değişkeny'nin ortalamasını hesaplar veself.mean_içinde saklar.predict: Bu yöntem, girişXile aynı uzunlukta bir dizi döndürür ve her öğe depolanan ortalamaya eşittir.
Şimdi, bu özel modelin nasıl kullanılacağını görelim:
# Example Usage
X = np.array([[1], [2], [3]])
y = np.array([10, 20, 30])
# Create a MeanPredictor
predictor = MeanPredictor()
# Fit the model
predictor.fit(X, y)
# Predict on new data
X_new = np.array([[4], [5], [6]])
y_pred = predictor.predict(X_new)
print(y_pred)
# Output:
# [20. 20. 20.]
Parametre Doğrulaması Uygulama
Özel tahmin edicilerinize geçirilen parametreleri doğrulamak çok önemlidir. Bu, beklenmeyen davranışları önlemeye yardımcı olur ve kullanıcılara bilgilendirici hata mesajları sağlar. Tahmin edicinizi bir dizi ortak kontrole karşı otomatik olarak test etmek için sklearn.utils.estimator_checks'ten check_estimator işlevini kullanabilirsiniz.
İlk olarak, parametre doğrulaması içerecek şekilde FeatureScaler'ı değiştirelim:
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.utils import validation
class FeatureScaler(BaseEstimator, TransformerMixin):
def __init__(self, factor=1.0):
self.factor = factor
def fit(self, X, y=None):
# Validate the input
self.factor = validation.check_scalar(
self.factor,
'factor',
target_type=float,
min_val=0.0,
include_boundaries=True
)
return self
def transform(self, X):
validation.check_is_fitted(self)
X = validation.check_array(X)
return X * self.factor
İşte eklediklerimiz:
validation.check_scalar:factorparametresinin 0'a eşit veya daha büyük bir float olduğunu doğrulamak içinfityönteminde bu işlevi kullanıyoruz.validation.check_is_fitted: Tahmin edicinin verileri dönüştürmeden önce uydurulmuş olmasını sağlamak için `transform` yönteminde bu işlevi kullanıyoruz.validation.check_array: Giriş `X`'in geçerli bir dizi olduğunu doğrulamak için bu işlevi kullanıyoruz.
Şimdi, tahmin edicimizi test etmek için check_estimator'ı kullanalım:
from sklearn.utils.estimator_checks import check_estimator
# Perform checks
check_estimator(FeatureScaler)
Tahmin edicinizle ilgili herhangi bir sorun varsa (örneğin, yanlış parametre türleri veya eksik yöntemler), check_estimator bir hata verecektir. Bu, özel tahmin edicilerinizin scikit-learn API'sine uymasını sağlamak için güçlü bir araçtır.
GridSearchCV ile Hiperparametreleri İşleme
Özel tahmin ediciler oluşturmanın temel faydalarından biri, bunları GridSearchCV ve RandomizedSearchCV gibi scikit-learn'ün hiperparametre ayarlama araçlarıyla kullanabilmenizdir. Tahmin edicinizi bu araçlarla uyumlu hale getirmek için, parametrelerinin erişilebilir ve değiştirilebilir olduğundan emin olmanız gerekir. Bu, genellikle `BaseEstimator` sınıfı sayesinde otomatik olarak ele alınır.
Bunu FeatureScaler ile gösterelim. En uygun ölçekleme faktörünü bulmak için GridSearchCV'yi kullanacağız:
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
import numpy as np
# Create a pipeline with the FeatureScaler
pipe = Pipeline([('scaler', FeatureScaler())])
# Define the parameter grid
param_grid = {'scaler__factor': [0.5, 1.0, 1.5, 2.0]}
# Create a GridSearchCV object
grid_search = GridSearchCV(pipe, param_grid, cv=3, scoring='r2') # Using R^2 as an example scoring metric.
# Generate some sample data
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([2, 4, 6, 8, 10])
# Fit the grid search
grid_search.fit(X, y)
# Print the best parameters and score
print("Best parameters:", grid_search.best_params_)
print("Best score:", grid_search.best_score_)
Bu örnekte, üzerinden arama yapılacak factor parametresinin değerlerini belirten bir parametre ızgarası tanımlıyoruz. GridSearchCV daha sonra boru hattını her parametre kombinasyonuyla değerlendirecek ve en iyi performansı gösteren seti döndürecektir. Bir boru hattı aşamasındaki parametrelere erişmek için `scaler__factor` adlandırma kuralına dikkat edin.
Gelişmiş Teknikler: Karmaşık Veri Türlerini ve Eksik Değerleri İşleme
Özel tahmin ediciler, karmaşık veri türlerini ve eksik değerleri işlemek için de kullanılabilir. Örneğin, alana özgü bir strateji kullanarak eksik değerleri atayan veya kategorik özellikleri sayısal gösterimlere dönüştüren bir dönüştürücü oluşturmak isteyebilirsiniz. Anahtar, verilerinizin özel gereksinimlerini dikkatlice değerlendirmek ve fit ve transform yöntemlerinde uygun mantığı uygulamaktır.
Eksik değerleri medyanı kullanarak atayan özel bir dönüştürücü örneğini ele alalım:
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np
class MedianImputer(BaseEstimator, TransformerMixin):
def __init__(self):
self.median_ = None
def fit(self, X, y=None):
# Calculate the median for each column
self.median_ = np.nanmedian(X, axis=0)
return self
def transform(self, X):
# Impute missing values with the median
X_imputed = np.where(np.isnan(X), self.median_, X)
return X_imputed
Bu örnekte, fit yöntemi, giriş verilerindeki her sütun için medyanı hesaplar ve eksik değerleri (np.nan) yoksayar. transform yöntemi daha sonra giriş verilerindeki tüm eksik değerleri karşılık gelen medyanla değiştirir.
İşte nasıl kullanılacağı:
# Example Usage
X = np.array([[1, 2, np.nan], [3, np.nan, 5], [np.nan, 4, 6]])
# Create a MedianImputer
imputer = MedianImputer()
# Fit the imputer
imputer.fit(X)
# Transform the data
X_imputed = imputer.transform(X)
print(X_imputed)
# Output:
# [[1. 2. 5.5]
# [3. 4. 5. ]
# [2. 4. 6. ]]
Gerçek Dünya Örnekleri ve Kullanım Durumları
Özel tahmin edicilerin özellikle yararlı olabileceği bazı gerçek dünya örneklerini inceleyelim:
- Zaman Serisi Özellik Mühendisliği: Zaman serisi verilerinden, hareketli istatistikler veya gecikmeli değerler gibi özellikleri çıkaran özel bir dönüştürücü oluşturmak isteyebilirsiniz. Örneğin, finansal piyasalarda, belirli bir pencerede hisse senedi fiyatlarının hareketli ortalamasını ve standart sapmasını hesaplayan bir tahmin edici oluşturabilirsiniz. Bu tahmin edici daha sonra gelecekteki hisse senedi fiyatlarını tahmin etmek için bir boru hattında kullanılabilir. Pencere boyutu, `GridSearchCV` tarafından ayarlanabilen bir hiperparametre olabilir.
- Doğal Dil İşleme (NLP): Scikit-learn'de doğrudan kullanılamayan teknikleri kullanarak metin temizleme veya özellik çıkarma gerçekleştiren özel bir dönüştürücü oluşturabilirsiniz. Örneğin, belirli bir dil veya alana göre uyarlanmış özel bir kök bulucu veya lemmatizer uygulamak isteyebilirsiniz. Ayrıca, özel tahmin ediciniz içinde NLTK veya spaCy gibi harici kütüphaneleri entegre edebilirsiniz.
- Görüntü İşleme: Görüntüleri bir makine öğrenimi modeline beslemeden önce filtreleme veya kenar algılama gibi belirli görüntü işleme işlemlerini uygulayan özel bir dönüştürücü oluşturmak isteyebilirsiniz. Bu, OpenCV veya scikit-image gibi kütüphanelerle entegrasyonu içerebilir. Örneğin, bir tahmin edici, tümörleri tespit etmek için bir modeli eğitmeden önce tıbbi görüntülerin parlaklığını ve kontrastını normalleştirebilir.
- Öneri Sistemleri: Kişiselleştirilmiş öneriler oluşturmak için matris faktörizasyonu gibi işbirlikçi filtreleme algoritmaları uygulayan özel bir tahmin edici oluşturabilirsiniz. Bu, Surprise veya implicit gibi kütüphanelerle entegrasyonu içerebilir. Örneğin, bir film öneri sistemi, kullanıcıların geçmiş tercihlerine ve diğer kullanıcıların derecelendirmelerine göre kullanıcı derecelendirmelerini tahmin etmek için özel bir tahmin edici kullanabilir.
- Coğrafi Veri Analizi: Konum verileriyle çalışmak için özel dönüştürücüler oluşturun. Bu, noktalar arasındaki mesafeleri hesaplamayı, mekansal birleştirmeler gerçekleştirmeyi veya coğrafi şekillerden özellikleri çıkarmayı içerebilir. Örneğin, pazarlama stratejilerini bilgilendirmek için her müşterinin en yakın mağaza konumundan uzaklığını hesaplayabilirsiniz.
Özel Tahmin Ediciler Oluşturmak İçin En İyi Uygulamalar
Özel tahmin edicilerinizin sağlam, bakımı kolay ve scikit-learn ile uyumlu olduğundan emin olmak için bu en iyi uygulamaları izleyin:
BaseEstimator'dan ve uygun Mixin'den miras alın: Bu, temel işlevsellik sağlar ve scikit-learn'ün API'siyle uyumluluk sağlar.__init__,fitvetransform'u (veyapredict'i) uygulayın: Bu yöntemler, tahmin edicinizin çekirdeğidir.- Giriş Parametrelerini Doğrulayın: Tahmin edicinize geçirilen parametreleri doğrulamak için
sklearn.utils.validation'ı kullanın. - Eksik Değerleri Uygun Şekilde İşleyin: Tahmin edicinizin eksik değerleri nasıl işlemesi gerektiğine karar verin ve uygun mantığı uygulayın.
- Kodunuzu Belgeleyin: Amacı, parametreleri ve kullanımı dahil olmak üzere tahmin ediciniz için açık ve özlü belgeler sağlayın. Tutarlılık için NumPy/SciPy kuralına uyan docstring'ler kullanın.
- Kodunuzu Test Edin: Tahmin edicinizi bir dizi ortak kontrole karşı test etmek için
sklearn.utils.estimator_checks'i kullanın. Ayrıca, tahmin edicinizin doğru çalıştığını doğrulamak için birim testleri yazın. - Scikit-learn'ün Kurallarına Uyun: Tutarlılık ve sürdürülebilirlik sağlamak için scikit-learn'ün kodlama stiline ve API kurallarına uyun.
- Dekoratörleri Kullanmayı Düşünün: Uygun olduğunda, parametre doğrulamasını basitleştirmek için `typing-extensions` gibi kütüphanelerden
@validate_argumentsgibi dekoratörler kullanın.
Sonuç
Scikit-learn'de özel tahmin ediciler oluşturmak, işlevselliğini genişletmenize ve kendi makine öğrenimi algoritmalarınızı uygulamanıza olanak tanır. Bu kılavuzda özetlenen yönergeleri ve en iyi uygulamaları izleyerek, scikit-learn ekosistemine sorunsuz bir şekilde entegre olan sağlam, bakımı kolay ve yeniden kullanılabilir tahmin ediciler oluşturabilirsiniz. İster yeni algoritmalar uyguluyor, ister mevcut olanları özelleştiriyor veya harici kütüphanelerle entegre ediyor olun, özel tahmin ediciler karmaşık makine öğrenimi sorunlarını ele almak için güçlü bir araç sağlar.
Kalitelerini ve kullanılabilirliklerini sağlamak için özel tahmin edicilerinizi iyice test etmeyi ve belgelemeyi unutmayın. Scikit-learn API'si hakkında sağlam bir anlayış ve biraz yaratıcılıkla, özel ihtiyaçlarınıza göre uyarlanmış gelişmiş makine öğrenimi çözümleri oluşturmak için özel tahmin edicilerden yararlanabilirsiniz. İyi şanslar!