Дізнайтеся, як створювати власні оцінювачі в scikit-learn, щоб розширити його функціональність та реалізувати власні алгоритми машинного навчання. Цей посібник охоплює все: від основ до передових методів.
Python Scikit-learn: Власні оцінювачі: Комплексний посібник з імплементації алгоритмів
Scikit-learn – це потужна та широко використовувана бібліотека Python для машинного навчання. Хоча вона надає велику колекцію попередньо створених алгоритмів, існують ситуації, коли вам потрібно реалізувати власні алгоритми. На щастя, scikit-learn пропонує гнучку структуру для створення власних оцінювачів, що дозволяє вам безперешкодно інтегрувати ваші алгоритми в екосистему scikit-learn. Цей вичерпний посібник проведе вас через процес створення власних оцінювачів, від розуміння основ до реалізації передових методів. Ми також розглянемо реальні приклади, щоб проілюструвати практичне застосування власних оцінювачів.
Навіщо створювати власні оцінювачі?
Перш ніж заглиблюватися в деталі реалізації, давайте зрозуміємо, чому ви можете захотіти створити власні оцінювачі:
- Реалізація нових алгоритмів: Scikit-learn не охоплює всі можливі алгоритми машинного навчання. Якщо ви розробили новий алгоритм або хочете реалізувати наукову статтю, створення власного оцінювача – це те, що вам потрібно.
- Налаштування існуючих алгоритмів: Можливо, ви захочете змінити існуючий алгоритм scikit-learn, щоб краще відповідати вашим конкретним потребам. Власні оцінювачі дозволяють розширювати або адаптувати існуючу функціональність.
- Інтеграція із зовнішніми бібліотеками: Можливо, ви захочете використовувати алгоритми з інших бібліотек Python, які безпосередньо несумісні з scikit-learn. Власні оцінювачі забезпечують міст між цими бібліотеками та API scikit-learn.
- Покращення можливості повторного використання коду: Інкапсулюючи свій алгоритм у власний оцінювач, ви можете легко повторно використовувати його в різних проектах і ділитися ним з іншими.
- Покращення інтеграції конвеєра: Власні оцінювачі безперешкодно інтегруються з конвеєрами scikit-learn, дозволяючи вам будувати складні робочі процеси машинного навчання.
Розуміння основ оцінювачів Scikit-learn
В основі своїй оцінювач scikit-learn – це клас Python, який реалізує методи fit і predict (а іноді й інші методи, такі як transform або fit_transform). Ці методи визначають поведінку оцінювача під час навчання та прогнозування. Існує два основних типи оцінювачів:
- Трансформатори: Ці оцінювачі перетворюють дані з одного формату в інший. Приклади включають
StandardScaler,PCAіOneHotEncoder. Вони зазвичай реалізують методиfitіtransform. - Моделі (предиктори): Ці оцінювачі вивчають модель на основі даних і використовують її для прогнозування. Приклади включають
LinearRegression,DecisionTreeClassifierіKMeans. Вони зазвичай реалізують методиfitіpredict.
Обидва типи оцінювачів мають спільний API, що дозволяє вам використовувати їх взаємозамінно в конвеєрах та інших інструментах scikit-learn.
Створення простого власного трансформатора
Почнемо з простого прикладу власного трансформатора. Цей трансформатор масштабуватиме кожну ознаку на постійний коефіцієнт. Цей трансформатор схожий на `StandardScaler`, але простіший і дозволяє вказувати власний коефіцієнт масштабування.
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
Ось розбір коду:
- Успадкування: Ми успадковуємо від
BaseEstimatorіTransformerMixin.BaseEstimatorнадає базову функціональність, як-отget_paramsіset_params, тоді якTransformerMixinнадає реалізацію за замовчуванням дляfit_transform(яка викликаєfit, а потімtransform). __init__: Це конструктор. Він приймає коефіцієнт масштабування як аргумент і зберігає його в атрибутіself.factor. Важливо визначити параметри вашого оцінювача в конструкторі.fit: Цей метод викликається для підгонки трансформатора до даних. У цьому випадку нам не потрібно нічого вивчати з даних, тому ми просто повертаємоself. Аргументyчасто не використовується для трансформаторів, але він потрібен для сумісності з API scikit-learn.transform: Цей метод викликається для перетворення даних. Ми просто множимо кожну ознаку на коефіцієнт масштабування.
Тепер давайте подивимося, як використовувати цей власний трансформатор:
# 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.]]
Створення простої власної моделі (предиктора)
Далі давайте створимо просту власну модель. Ця модель прогнозуватиме середнє значення навчальних даних для всіх майбутніх прогнозів. Хоча це не особливо корисно, це демонструє базову структуру власного предиктора.
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_)
Ось розбір коду:
- Успадкування: Ми успадковуємо від
BaseEstimatorіRegressorMixin.RegressorMixinнадає реалізації за замовчуванням для методів, пов’язаних з регресією (хоча ми не використовуємо їх у цьому прикладі). __init__: Ми ініціалізуємоself.mean_якNone. Цей атрибут зберігатиме середнє значення цільової змінної після підгонки.fit: Цей метод обчислює середнє значення цільової змінноїyі зберігає його вself.mean_.predict: Цей метод повертає масив тієї ж довжини, що й вхіднийX, де кожен елемент дорівнює збереженому середньому значенню.
Тепер давайте подивимося, як використовувати цю власну модель:
# 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.]
Реалізація перевірки параметрів
Дуже важливо перевіряти параметри, передані вашим власним оцінювачам. Це допомагає запобігти неочікуваній поведінці та надає користувачам інформативні повідомлення про помилки. Ви можете використовувати функцію check_estimator з sklearn.utils.estimator_checks, щоб автоматично перевірити свій оцінювач на відповідність набору загальних перевірок.
Спочатку давайте змінимо FeatureScaler, щоб включити перевірку параметрів:
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
Ось що ми додали:
validation.check_scalar: Ми використовуємо цю функцію в методіfit, щоб перевірити, чи є параметрfactorчислом з плаваючою комою, більшим або рівним 0.validation.check_is_fitted: Ми використовуємо цю функцію в методі `transform`, щоб переконатися, що оцінювач був підігнаний перед перетворенням даних.validation.check_array: Ми використовуємо цю функцію, щоб перевірити, чи є вхідний `X` дійсним масивом.
Тепер давайте використаємо check_estimator, щоб перевірити наш оцінювач:
from sklearn.utils.estimator_checks import check_estimator
# Perform checks
check_estimator(FeatureScaler)
Якщо з вашим оцінювачем виникнуть якісь проблеми (наприклад, неправильні типи параметрів або відсутні методи), check_estimator видасть помилку. Це потужний інструмент для забезпечення того, щоб ваші власні оцінювачі відповідали API scikit-learn.
Обробка гіперпараметрів за допомогою GridSearchCV
Однією з ключових переваг створення власних оцінювачів є те, що ви можете використовувати їх з інструментами налаштування гіперпараметрів scikit-learn, такими як GridSearchCV і RandomizedSearchCV. Щоб зробити ваш оцінювач сумісним з цими інструментами, вам потрібно переконатися, що його параметри доступні та їх можна змінювати. Зазвичай це обробляється автоматично завдяки класу `BaseEstimator`.
Давайте продемонструємо це на прикладі FeatureScaler. Ми будемо використовувати GridSearchCV, щоб знайти оптимальний коефіцієнт масштабування:
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_)
У цьому прикладі ми визначаємо сітку параметрів, яка визначає значення параметра factor для пошуку. GridSearchCV потім оцінить конвеєр з кожною комбінацією параметрів і поверне найкращий набір. Зверніть увагу на угоду про іменування `scaler__factor` для доступу до параметрів на етапі конвеєра.
Передові методи: Обробка складних типів даних і відсутніх значень
Власні оцінювачі також можна використовувати для обробки складних типів даних і відсутніх значень. Наприклад, ви можете захотіти створити трансформатор, який замінює відсутні значення за допомогою стратегії, специфічної для домену, або перетворює категоріальні ознаки на числові представлення. Ключем є ретельний розгляд конкретних вимог ваших даних і реалізація відповідної логіки в методах fit і transform.
Розглянемо приклад власного трансформатора, який замінює відсутні значення за допомогою медіани:
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
У цьому прикладі метод fit обчислює медіану для кожного стовпця у вхідних даних, ігноруючи відсутні значення (np.nan). Потім метод transform замінює будь-які відсутні значення у вхідних даних відповідною медіаною.
Ось як це використовувати:
# 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. ]]
Реальні приклади та випадки використання
Давайте розглянемо деякі реальні приклади, де власні оцінювачі можуть бути особливо корисними:
- Інженерія ознак часових рядів: Ви можете захотіти створити власний трансформатор, який видобуває ознаки з даних часових рядів, таких як ковзні статистики або запізнілі значення. Наприклад, на фінансових ринках ви можете створити оцінювач, який обчислює ковзне середнє та стандартне відхилення цін акцій протягом певного вікна. Цей оцінювач потім можна використовувати в конвеєрі для прогнозування майбутніх цін акцій. Розмір вікна може бути гіперпараметром, налаштованим за допомогою `GridSearchCV`.
- Обробка природної мови (NLP): Ви можете створити власний трансформатор, який виконує очищення тексту або вилучення ознак за допомогою методів, безпосередньо недоступних у scikit-learn. Наприклад, ви можете захотіти реалізувати власний стемер або лематизатор, адаптований до певної мови чи домену. Ви також можете інтегрувати зовнішні бібліотеки, такі як NLTK або spaCy, у свій власний оцінювач.
- Обробка зображень: Ви можете захотіти створити власний трансформатор, який застосовує певні операції обробки зображень, такі як фільтрація або виявлення країв, перш ніж передавати зображення в модель машинного навчання. Це може включати інтеграцію з бібліотеками, такими як OpenCV або scikit-image. Наприклад, оцінювач може нормалізувати яскравість і контрастність медичних зображень перед навчанням моделі для виявлення пухлин.
- Системи рекомендацій: Ви можете створити власний оцінювач, який реалізує алгоритми спільної фільтрації, такі як матрична факторизація, для створення персоналізованих рекомендацій. Це може включати інтеграцію з бібліотеками, такими як Surprise або implicit. Наприклад, система рекомендацій фільмів може використовувати власний оцінювач для прогнозування оцінок користувачів на основі їхніх минулих уподобань і оцінок інших користувачів.
- Аналіз геопросторових даних: Створіть власні трансформатори для роботи з даними про місцезнаходження. Це може включати обчислення відстаней між точками, виконання просторових з’єднань або вилучення ознак із географічних фігур. Наприклад, ви можете обчислити відстань кожного клієнта від найближчого місця розташування магазину, щоб інформувати маркетингові стратегії.
Найкращі практики для створення власних оцінювачів
Щоб забезпечити надійність, зручність обслуговування та сумісність ваших власних оцінювачів із scikit-learn, дотримуйтеся цих найкращих практик:
- Успадковуйте від
BaseEstimatorі відповідного Mixin: Це забезпечує базову функціональність і забезпечує сумісність з API scikit-learn. - Реалізуйте
__init__,fitіtransform(абоpredict): Ці методи є ядром вашого оцінювача. - Перевіряйте вхідні параметри: Використовуйте
sklearn.utils.validationдля перевірки параметрів, переданих вашому оцінювачу. - Відповідним чином обробляйте відсутні значення: Вирішіть, як ваш оцінювач повинен обробляти відсутні значення, і реалізуйте відповідну логіку.
- Документуйте свій код: Надайте чітку та стислу документацію для свого оцінювача, включаючи його призначення, параметри та використання. Використовуйте рядки документації, що відповідають конвенції NumPy/SciPy, для забезпечення узгодженості.
- Перевіряйте свій код: Використовуйте
sklearn.utils.estimator_checks, щоб перевірити свій оцінювач на відповідність набору загальних перевірок. Також напишіть модульні тести, щоб переконатися, що ваш оцінювач працює правильно. - Дотримуйтеся конвенцій Scikit-learn: Дотримуйтеся стилю кодування та конвенцій API scikit-learn, щоб забезпечити узгодженість і зручність обслуговування.
- Подумайте про використання декораторів: За потреби використовуйте декоратори, такі як
@validate_argumentsз бібліотек, таких як `typing-extensions`, щоб спростити перевірку параметрів.
Висновок
Створення власних оцінювачів у scikit-learn дозволяє розширити його функціональність і реалізувати власні алгоритми машинного навчання. Дотримуючись інструкцій і найкращих практик, викладених у цьому посібнику, ви можете створювати надійні, зручні в обслуговуванні та придатні для повторного використання оцінювачі, які безперешкодно інтегруються з екосистемою scikit-learn. Незалежно від того, чи реалізуєте ви нові алгоритми, налаштовуєте існуючі чи інтегруєтеся із зовнішніми бібліотеками, власні оцінювачі надають потужний інструмент для вирішення складних задач машинного навчання.
Не забудьте ретельно перевірити та задокументувати свої власні оцінювачі, щоб забезпечити їх якість і зручність використання. Завдяки твердому розумінню API scikit-learn і трохи креативності ви можете використовувати власні оцінювачі для створення складних рішень машинного навчання, адаптованих до ваших конкретних потреб. Удачі!