#!/usr/bin/env python # coding: utf-8 # # Пример использование подходов из sklift.models в sklearn.pipeline # #
#
# # # #
# SCIKIT-UPLIFT REPO | # SCIKIT-UPLIFT DOCS #
# ENGLISH VERSION # #
# В данном ноутбуке рассмотрим простой пример применения одного из подходов прогнозирования uplift в [sklearn.pipeline](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.pipeline). # # Данные для примера взяты из [MineThatData E-Mail Analytics And Data Mining Challenge dataset by Kevin Hillstrom](https://blog.minethatdata.com/2008/03/minethatdata-e-mail-analytics-and-data.html). Этот набор данных содержит 64 000 клиентов, которые в последний раз совершали покупки в течение двенадцати месяцев. Среди клиентов была проведена рекламная кампания с помощью email рассылки: # # * 1/3 клиентов были выбраны случайным образом для получения электронного письма, рекламирующего мужскую продукцию; # * 1/3 клиентов были выбраны случайным образом для получения электронного письма, рекламирующего женскую продукцию; # * С оставшейся 1/3 коммуникацию не проводили. # # Для каждого клиента из выборки замерили факт перехода по ссылке в письме, факт совершения покупки и сумму трат за две недели, следущими после получения письма. # # Полное описание датасета можной найти по [ссылке](https://blog.minethatdata.com/2008/03/minethatdata-e-mail-analytics-and-data.html). # # Установим необходимые библиотеки: # In[1]: get_ipython().system('pip install scikit-uplift==0.1.2 xgboost==1.0.2 category_encoders==2.1.0') # Загрузим данные: # In[2]: import urllib.request import pandas as pd csv_path = '/content/Hilstorm.csv' url = 'http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv' urllib.request.urlretrieve(url, csv_path) # Для простоты примера оставим только два сегмента пользователей: # * тем, кому рассылалась по электронной почте рекламная кампания с участием женских товаров; # * тем, кому не рассылалась рекламная кампания. # # В качестве целевой переменной будем использовать переменную `visit`. # In[3]: import pandas as pd; pd.set_option('display.max_columns', None) get_ipython().run_line_magic('matplotlib', 'inline') dataset = pd.read_csv(csv_path) print(f'Размер датасета до обработки: {dataset.shape}') dataset = dataset[dataset['segment']!='Mens E-Mail'] dataset.loc[:, 'treatment'] = dataset['segment'].map({ 'Womens E-Mail': 1, 'No E-Mail': 0 }) dataset = dataset.drop(['segment', 'conversion', 'spend'], axis=1) print(f'Размер датасета после обработки: {dataset.shape}') dataset.head() # Разобъем все данные на обучающую и валидационную выборку: # In[4]: from sklearn.model_selection import train_test_split Xyt_tr, Xyt_val = train_test_split(dataset, test_size=0.5, random_state=42) X_tr = Xyt_tr.drop(['visit', 'treatment'], axis=1) y_tr = Xyt_tr['visit'] treat_tr = Xyt_tr['treatment'] X_val = Xyt_val.drop(['visit', 'treatment'], axis=1) y_val = Xyt_val['visit'] treat_val = Xyt_val['treatment'] # Select categorical features: # In[5]: cat_cols = X_tr.select_dtypes(include='object').columns.tolist() print(cat_cols) # Создадим нужные объекты и объединим их в pipieline. # In[6]: from sklearn.pipeline import Pipeline from category_encoders import CatBoostEncoder from sklift.models import ClassTransformation from xgboost import XGBClassifier encoder = CatBoostEncoder(cols=cat_cols) estimator = XGBClassifier(max_depth=2, random_state=42) ct = ClassTransformation(estimator=estimator) my_pipeline = Pipeline([ ('encoder', encoder), ('model', ct) ]) # Обучать pipeline будем как обычно, но колонку treatment добавим как параметр шага model: `model__treatment`. # In[7]: my_pipeline = my_pipeline.fit( X=X_tr, y=y_tr, model__treatment=treat_tr ) # Предскажем uplift и посчитаем uplift@30% # In[8]: from sklift.metrics import uplift_at_k uplift_predictions = my_pipeline.predict(X_val) uplift_30 = uplift_at_k(y_val, uplift_predictions, treat_val, strategy='overall') print(f'uplift@30%: {uplift_30:.4f}')