Scikit-learn

Материал из энциклопедия интернет-маркетинга MarketWiki

Scikit-learn (sklearn) - библиотека для Python с открытым исходным кодом, предоставляющая широкий набор инструментов для машинного обучения. Scikit-learn включает алгоритмы для классификации, регрессии, кластеризации, снижения размерности, выбора моделей и предобработки данных, ориентированные на работу с табличными данными среднего размера.

В интернет-маркетинге Scikit-learn является стандартным инструментом для построения прогнозных моделей (отток клиентов, LTV, вероятность покупки), сегментации аудитории, анализа эффективности каналов и автоматизации процессов принятия решений.

Коротко: Scikit-learn - популярный и очень удобный инструмент машинного обучения на Python. Если данные не слишком большие и нужно быстро и надёжно построить модель - большинство аналитиков в первую очередь берётся именно за него.

Архитектура Scikit-learn

[править]

Scikit-learn построен на едином, интуитивно понятном API.

Единый API для всех моделей

[править]

Все модели в Scikit-learn следуют одинаковому интерфейсу:

from sklearn import preprocessing, model_selection, linear_model

# Загрузка и подготовка данных
X, y = load_data()

# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Создание модели
model = linear_model.LogisticRegression()

# Обучение
model.fit(X_train, y_train)

# Прогнозирование
predictions = model.predict(X_test)
probabilities = model.predict_proba(X_test)

# Оценка качества
score = model.score(X_test, y_test)

Основные модули

[править]
Основные модули Scikit-learn
Модуль Назначение
sklearn.preprocessing Предобработка данных (масштабирование, нормализация, кодирование)
sklearn.model_selection Разделение выборок, кросс-валидация, поиск гиперпараметров
sklearn.linear_model Линейные модели (логистическая регрессия, линейная регрессия, Lasso, Ridge)
sklearn.tree Деревья решений
sklearn.ensemble Ансамблевые методы (Random Forest, Gradient Boosting, AdaBoost)
sklearn.cluster Кластеризация (KMeans, DBSCAN)
sklearn.decomposition Снижение размерности (PCA, TruncatedSVD)
sklearn.metrics Метрики качества (accuracy, precision, recall, ROC-AUC, MSE)

Применение Scikit-learn в маркетинге

[править]

Прогнозирование оттока клиентов (Churn Prediction)

[править]
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, roc_auc_score
from sklearn.model_selection import train_test_split

# Подготовка данных (признаки: RFM-метрики, частота визитов, история покупок)
features = ['recency', 'frequency', 'monetary', 'avg_check', 'days_since_last_visit']
X = df[features]
y = df['churned']  # 1 - ушёл, 0 - остался

# Разделение
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучение модели Random Forest
model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
model.fit(X_train, y_train)

# Прогнозирование
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1]

# Оценка
print(f'ROC-AUC: {roc_auc_score(y_test, y_proba):.4f}')
print(classification_report(y_test, y_pred))

# Важность признаков
feature_importance = pd.DataFrame({
    'feature': features,
    'importance': model.feature_importances_
}).sort_values('importance', ascending=False)

Кластеризация клиентов для сегментации

[править]
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Выбор признаков для кластеризации
segmentation_features = ['recency', 'frequency', 'monetary']

# Масштабирование (важно для KMeans)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df[segmentation_features])

# Определение оптимального количества кластеров (метод локтя)
inertias = []
for k in range(2, 11):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X_scaled)
    inertias.append(kmeans.inertia_)

# Обучение модели с выбранным количеством кластеров
kmeans = KMeans(n_clusters=5, random_state=42)
df['segment'] = kmeans.fit_predict(X_scaled)

# Анализ сегментов
segment_analysis = df.groupby('segment').agg({
    'recency': 'mean',
    'frequency': 'mean',
    'monetary': 'mean',
    'client_id': 'count'
}).round(2)
segment_analysis.columns = ['Средняя давность', 'Средняя частота', 'Средний чек', 'Количество']

Прогнозирование LTV

[править]
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# Признаки для прогноза LTV
features = ['first_purchase_date', 'category_preferences', 'avg_check_3m', 'frequency_3m', 'channel']
X = df[features]
y = df['ltv_12m']  # LTV за следующие 12 месяцев

# Предобработка (кодирование категориальных признаков)
categorical_features = ['category_preferences', 'channel']
numeric_features = ['avg_check_3m', 'frequency_3m']

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), numeric_features),
    ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])

# Обучение модели
model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=5)
pipeline = Pipeline(steps=[('preprocessor', preprocessor), ('regressor', model)])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

print(f'MAE: {mean_absolute_error(y_test, y_pred):.2f}')
print(f'RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.2f}')

Анализ эффективности каналов (атрибуция)

[править]
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

# Данные: затраты по каналам и выручка
channels = ['Яндекс.Директ', 'VK Реклама', 'SEO', 'Email', 'Content']
X = df[channels]
y = df['revenue']

# Масштабирование
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Регрессия для определения вклада каналов
model = LinearRegression()
model.fit(X_scaled, y)

# Коэффициенты - вклад каждого канала
attribution = pd.DataFrame({
    'channel': channels,
    'coefficient': model.coef_
}).sort_values('coefficient', ascending=False)

Паттерны использования

[править]

Предобработка данных

[править]
from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder

# Масштабирование
scaler = StandardScaler()      # нормализация к среднему 0 и дисперсии 1
scaler = MinMaxScaler()        # масштабирование в диапазон [0, 1]
X_scaled = scaler.fit_transform(X)

# Кодирование категориальных переменных
encoder = LabelEncoder()
df['category_encoded'] = encoder.fit_transform(df['category'])

Кросс-валидация и поиск гиперпараметров

[править]
from sklearn.model_selection import GridSearchCV, cross_val_score

# Поиск оптимальных гиперпараметров
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [5, 10, 15],
    'min_samples_split': [2, 5, 10]
}

grid_search = GridSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid,
    cv=5,
    scoring='roc_auc',
    n_jobs=-1
)
grid_search.fit(X_train, y_train)

print(f'Лучшие параметры: {grid_search.best_params_}')
print(f'Лучший ROC-AUC: {grid_search.best_score_:.4f}')

Оценка качества моделей

[править]
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score, f1_score,
    roc_auc_score, confusion_matrix, classification_report
)

# Метрики для классификации
print(f'Accuracy: {accuracy_score(y_test, y_pred):.4f}')
print(f'Precision: {precision_score(y_test, y_pred):.4f}')
print(f'Recall: {recall_score(y_test, y_pred):.4f}')
print(f'F1: {f1_score(y_test, y_pred):.4f}')
print(f'ROC-AUC: {roc_auc_score(y_test, y_proba):.4f}')

# Матрица ошибок
cm = confusion_matrix(y_test, y_pred)

Scikit-learn в маркетинговом стеке

[править]

Scikit-learn часто используется в комбинации с другими инструментами.

Scikit-learn в маркетинговом стеке
Инструмент Роль в пайплайне
Pandas Загрузка, очистка, агрегация данных
NumPy Численные операции
Scikit-learn Предобработка, моделирование, оценка
Matplotlib / Seaborn Визуализация результатов
Jupyter Notebook Интерактивная разработка

Преимущества и ограничения

[править]

Преимущества

[править]
  • Единый, интуитивный API для всех моделей.
  • Богатый выбор алгоритмов для разных задач.
  • Отличная документация и огромное сообщество.
  • Интеграция с NumPy и Pandas.
  • Встроенные инструменты для кросс-валидации и подбора параметров.

Ограничения

[править]
  • Не подходит для глубокого обучения (для этого есть PyTorch, Keras).
  • Работает в оперативной памяти (не предназначен для Big Data).
  • Ограниченная поддержка потоковой обработки данных.
  • Для очень больших данных (миллиарды строк) требуется Dask или Spark.

Значение для маркетолога

[править]

Понимание возможностей Scikit-learn позволяет маркетологу:

  • Эффективно взаимодействовать с Data Science-командой, понимая их инструментарий.
  • Ставить реалистичные задачи по внедрению ML в маркетинговые процессы.
  • Интерпретировать результаты моделей (важность признаков, прогнозные вероятности).
  • Участвовать в выборе приоритетов для внедрения прогнозной аналитики.

Связанные термины

[править]