Scikit-learn
Scikit-learn (sklearn) - библиотека для Python с открытым исходным кодом, предоставляющая широкий набор инструментов для машинного обучения. Scikit-learn включает алгоритмы для классификации, регрессии, кластеризации, снижения размерности, выбора моделей и предобработки данных, ориентированные на работу с табличными данными среднего размера.
В интернет-маркетинге Scikit-learn является стандартным инструментом для построения прогнозных моделей (отток клиентов, LTV, вероятность покупки), сегментации аудитории, анализа эффективности каналов и автоматизации процессов принятия решений.
Архитектура 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)
Основные модули
[править]| Модуль | Назначение |
|---|---|
| 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 часто используется в комбинации с другими инструментами.
| Инструмент | Роль в пайплайне |
|---|---|
| Pandas | Загрузка, очистка, агрегация данных |
| NumPy | Численные операции |
| Scikit-learn | Предобработка, моделирование, оценка |
| Matplotlib / Seaborn | Визуализация результатов |
| Jupyter Notebook | Интерактивная разработка |
Преимущества и ограничения
[править]Преимущества
[править]- Единый, интуитивный API для всех моделей.
- Богатый выбор алгоритмов для разных задач.
- Отличная документация и огромное сообщество.
- Интеграция с NumPy и Pandas.
- Встроенные инструменты для кросс-валидации и подбора параметров.
Ограничения
[править]- Не подходит для глубокого обучения (для этого есть PyTorch, Keras).
- Работает в оперативной памяти (не предназначен для Big Data).
- Ограниченная поддержка потоковой обработки данных.
- Для очень больших данных (миллиарды строк) требуется Dask или Spark.
Значение для маркетолога
[править]Понимание возможностей Scikit-learn позволяет маркетологу:
- Эффективно взаимодействовать с Data Science-командой, понимая их инструментарий.
- Ставить реалистичные задачи по внедрению ML в маркетинговые процессы.
- Интерпретировать результаты моделей (важность признаков, прогнозные вероятности).
- Участвовать в выборе приоритетов для внедрения прогнозной аналитики.
