Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pandas as pd
- import numpy as np
- from sklearn.metrics import auc
- import matplotlib.pyplot as plt
- # генерация данных для 100 пользователей
- np.random.seed(42)
- n = 100
- treatment = np.array([1]*50 + [0]*50)
- outcome = np.concatenate([np.random.choice([1, 0], p=[0.2, 0.8], size=50),
- np.random.choice([1, 0], p=[0.1, 0.9], size=50)])
- uplift_prediction = np.random.rand(n)
- # создание DataFrame
- data = {
- 'user_id': range(1, n+1),
- 'treatment': treatment,
- 'outcome': outcome,
- 'uplift_prediction': uplift_prediction
- }
- df = pd.DataFrame(data)
- # сортировка данных по uplift_prediction
- df = df.sort_values(by='uplift_prediction', ascending=False).reset_index(drop=True)
- # инициализация переменных
- nt = 0 # количество пользователей в группе лечения
- nt_1 = 0 # количество успешных исходов в группе лечения
- nc = 0 # количество пользователей в контрольной группе
- nc_1 = 0 # количество успешных исходов в контрольной группе
- cgain = [] # кумулятивный прирост
- random_curve = [] # случайная кривая
- optimum_curve = [] # оптимальная кривая
- # Расчет общего количества успешных исходов
- total_outcome = df['outcome'].sum()
- # Расчёт конверсий
- conversion_treatment_total = df[(df['treatment']==1)].shape[0] / df[(df['treatment']==1) & (df['outcome']==1)].shape[0]
- conversion_control_total = df[(df['treatment']==0)].shape[0] / df[(df['treatment']==0) & (df['outcome']==0)].shape[0]
- # Расчет CGain, Random и Optimum
- for i, row in df.iterrows():
- if row['treatment'] == 1: # если пользователь в группе воздействия
- nt += 1
- if row['outcome'] == 1:
- nt_1 += 1
- else: # если пользователь в контрольной группе
- nc += 1
- if row['outcome'] == 0:
- nc_1 += 1
- # Корректный расчет CGain (кумулятивный прирост)
- conversion_treatment = nt / df[(df['treatment']==1) & (df['outcome']==1)].shape[0]
- conversion_control = nc / df[(df['treatment']==0) & (df['outcome']==0)].shape[0]
- cgain.append(conversion_treatment - conversion_control) # Разница между конверсией в treatment и control
- # Расчет случайной кривой
- random_curve.append(total_outcome * (i + 1) / len(df))
- # Расчет оптимальной кривой
- optimum_curve.append(min(total_outcome, (i + 1)))
- # Нормализация кривых
- cgain = [val / (conversion_treatment_total - conversion_control_total) for val in cgain] # Нормализуем CGain
- max_incremental_purchases = total_outcome if total_outcome > 0 else 1 # Защита от деления на ноль
- random_curve = [val / max_incremental_purchases for val in random_curve]
- optimum_curve = [val / max_incremental_purchases for val in optimum_curve]
- # расчёт площади под кривыми
- qini_auc = auc(range(1, len(cgain) + 1), cgain)
- random_auc = auc(range(1, len(random) + 1), random)
- # расчёт Qini Score
- qini_score = qini_auc - random_auc
- # вывод Qini Score
- print(f'Qini Score: {qini_score}')
- # построение графиков
- plt.figure(figsize=(10, 6))
- plt.plot(range(1, len(cgain) + 1), cgain, label='Model', color='blue')
- plt.plot(range(1, len(random_curve) + 1), random_curve, label='Random', color='red', linestyle='--')
- plt.plot(range(1, len(optimum_curve) + 1), optimum_curve, label='Optimum', color='green', linestyle='--')
- plt.xlabel('Number of users targeted')
- plt.ylabel('Number of Incremental Purchases')
- plt.title('Gains Chart for Uplift (Qini Curve) with Random')
- plt.legend()
- plt.grid(True)
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement