آپ کے LLM پروڈکٹ کے تجربے کے مثبت نتائج برآمد ہوئے ہیں اور توقع ہے کہ کام کی تکمیل کی شرح میں 8% اضافہ ہوگا۔ جب آپ کوئی خصوصیت جاری کرتے ہیں تو قیادت جشن مناتی ہے۔ تین ماہ بعد، اہم اشارے بمشکل منتقل ہوئے ہیں۔
تجربہ شماریاتی اعتبار سے درست تھا۔ اس نے صرف غلط سوال کا جواب دیا۔
علاج کا اوسط اثر آپ کے صارف کی بنیاد کے مجموعی علاج کے ردعمل کو ایک عدد میں کم کرتا ہے۔ یہ کمپریشن اس وقت کارآمد ہے جب یہ فیصلہ کیا جائے کہ آیا کسی خصوصیت کو پہلی جگہ بنانا ہے۔
تاہم، ایک بار جب آپ اسے بنانے کا عہد کر لیتے ہیں، علاج کی اوسط تاثیر اب سب سے زیادہ قابل عمل میٹرک نہیں رہتی ہے۔ AI سمریائزیشن ٹولز کے بھاری صارفین نے پہلے ہی اپنے ورک فلو کو بہتر بنا لیا ہے اور نئے خلاصے اکثر بے کار ہوتے ہیں۔ ہلکے استعمال کرنے والے اکثر اس بات کا کھوج لگاتے ہیں کہ کیا ہو رہا ہے اور ایک فوری خلاصے سے صحیح معنوں میں فائدہ اٹھاتے ہیں۔
فیچرز کو یکساں طور پر ہر کسی کو صرف اس لیے تقسیم کرنا کہ اوسط اثر مثبت ہوتا ہے نقطہ نظر نہیں آتا۔ دوسرے لفظوں میں، یہ فیچر کچھ صارفین کی بہت مدد کرے گا، دوسروں پر بہت کم اثر پڑے گا، اور تیسرے گروپ کو فعال طور پر روکے گا۔
یہ ہیٹروجنیٹی کا مسئلہ ہے۔ معیاری مصنوعات کی آزمائشیں اوسط افادیت کے بارے میں بائنری سوالات کا جواب دیتی ہیں۔ اضافہ ماڈلنگ اس بائنری کو ایک لطیف سپیکٹرم میں بدل دیتا ہے۔ تجرباتی ڈیٹا جو مثبت اوسط حاصل کرتا ہے اس کے بارے میں پوشیدہ معلومات پر مشتمل ہوتا ہے کہ کون سے صارفین کامیاب ہیں اور آپ کو ان پر عمل کرنے کی اجازت دیتا ہے۔
اضافہ ماڈلنگ مخصوص خصوصیات کی بنیاد پر ہر صارف کے لیے مشروط اوسط علاج اثر (CATE) کا تخمینہ لگاتا ہے۔ آپ کو پوائنٹس ملیں گے جن پر آپ فوری کارروائی کر سکتے ہیں۔
اعلی پیشین گوئی CATE والے صارفین کو خصوصیت حاصل ہوتی ہے۔ 0 کے قریب CATE والے صارفین کو چھوڑ دیا جاتا ہے۔ نتیجہ ایک دانے دار رول آؤٹ ہے جو علاج پر توجہ مرکوز کرتا ہے جو حقیقی قدر کو بڑھاتا ہے اور تخمینہ لاگت اور صارف کی الجھن کو حقیقی فوائد کے متناسب رکھتا ہے۔
ML انجینئرز اور پروڈکٹ ڈیٹا سائنسدانوں کے لیے جو حسب ضرورت AI رول آؤٹس کو ترتیب دے رہے ہیں، یہ گائیڈ آپ کو scikit-learn کا استعمال کرتے ہوئے شروع سے ہی ماڈلنگ میں بہتری لانے کے لیے رہنمائی کرتا ہے۔ ہم اسے ضرورت سے زیادہ انحصار جیسے causalml یا econml کے بغیر بناتے ہیں، تاکہ آپ بنیادی میکانزم کو سمجھ سکیں۔
ہم دو میٹا لرنر اپروچز کو نافذ کرتے ہیں اور اس بات کا اندازہ کرنے کے لیے ایک Qini وکر بناتے ہیں کہ ماڈل کس حد تک صارفین کی درجہ بندی کرتا ہے اور تقسیم شدہ ریلیز کے فیصلے کا اصول لکھتا ہے۔ ڈیٹاسیٹ 50,000 صارف کے SaaS پروڈکٹ کو مختلف منگنی کے درجات میں متفاوت کے ساتھ نقل کرتا ہے۔
آخر تک، آپ سمجھ جائیں گے کہ تخمینوں پر کب بھروسہ کرنا ہے اور اپنے ماڈل کو ایک حقیقی تعیناتی پالیسی میں کیسے ترجمہ کرنا ہے۔
انڈیکس
AI ذاتی نوعیت کے لیے علاج کی اوسط تاثیر کیوں گمراہ کن ہے۔
اس بات پر غور کریں کہ علاج کا اوسط اثر اصل میں کیا ہوتا ہے۔ ایک عام SaaS پروڈکٹ میں، بھاری صارفین کو آپٹ ان تجربات میں زیادہ نمائندگی دی جاتی ہے کیونکہ وہ نئی خصوصیات کو کثرت سے استعمال کرتے ہیں۔ ہلکے صارفین خود کو کم سمجھتے ہیں کیونکہ وہ ٹوگل کو نظر انداز کرتے ہیں۔
اوسط اثر تجربہ میں حصہ لینے والے صارفین کے اختلاط کی عکاسی کرتا ہے، اور یہ مرکب ممکنہ طور پر بالکل ویسا نہیں ہوگا جیسا کہ عام آبادی کو مکمل لانچ کے وقت سامنا کرنا پڑا۔
زیادہ اہم بات یہ ہے کہ علاج کا اوسط اثر ذیلی گروپوں میں علاج کے اثر کی سمت کو دھندلا دیتا ہے۔
ایک ایسے منظر نامے پر غور کریں جہاں AI سمری فیچر ہلکے صارفین کے لیے صرف 9.6 فیصد پوائنٹ لفٹ، درمیانے صارفین کے لیے 7.4 فیصد پوائنٹ لفٹ، اور بھاری صارفین کے لیے 6.7 فیصد پوائنٹ لفٹ پیدا کرتا ہے۔ اس کا اوسط کسی ایسی چیز سے ہوتا ہے جو یکساں طور پر مثبت نظر آتا ہے۔
تاہم، یہاں اسٹریٹجک ضرورت یہ ہے کہ ہلکے صارفین پر رول آؤٹ پر توجہ مرکوز کی جائے جبکہ بھاری صارفین کی نگرانی کی جائے تاکہ یہ یقینی بنایا جا سکے کہ آپٹمائزڈ ورک فلو میں خلل نہ پڑے۔ شپنگ اس پھیلاؤ کو مکمل طور پر نظر انداز کرتی ہے۔
یہ نمونہ AI صلاحیتوں کے تمام زمروں میں ظاہر ہوتا ہے۔ انٹرپرائز ٹیموں کے لیے AI میٹنگ سمریزر پر غور کریں۔ نئے جوائن کرنے والوں کو لمبے دھاگوں کو برقرار رکھنے میں دشواری کا سامنا ہے۔ ٹیم کے تجربہ کار ارکان جو کہ AI سے زیادہ تیزی سے پڑھتے ہیں لکھ سکتے ہیں ان کا خلاصہ سست پڑ رہا ہے۔ ایک مثبت اوسط کسی خصوصیت کی تعمیر کا جواز پیش کرتا ہے، لیکن اسے تمام صارفین میں یکساں طور پر تقسیم کرنے کے بارے میں کچھ نہیں کہتا۔
اضافہ ماڈلنگ CATE کا تخمینہ لگا کر اس مسئلے کو حل کرتی ہے، کسی خاص صارف کے لیے متوقع علاج کے اثر، مشاہدہ شدہ خصوصیات کو مدنظر رکھتے ہوئے۔ بہت مثبت CATE والے صارفین علاج حاصل کرتے ہیں، جبکہ کم CATE والے صارفین کو روک دیا جاتا ہے۔ آپ مرحلہ 3 میں جو Qini وکر بنائیں گے وہ آپ کو بتائے گا کہ صرف اعلی CATE والے حصوں پر کارروائی کرکے اور باقی کو چھوڑ کر کتنی قیمت حاصل کی جا سکتی ہے۔
بہتر ماڈلنگ دراصل کیا کرتی ہے۔
اضافہ ماڈلنگ causal inference پر بنایا گیا ہے۔ بنیادی مقدار انفرادی علاج کا اثر ہے، جو کسی خاص صارف کے لیے ممکنہ نتائج میں فرق کی نمائندگی کرتا ہے۔
ITE(i) = Y_i(1) - Y_i(0)
Y_i(1) آپ کس قسم کے صارف ہیں؟ i اس کا تعلق فعالیت سے ہے۔ Y_i(0) آپ کس قسم کے صارف ہیں؟ i میں اس کے بغیر کروں گا۔ مسئلہ یہ ہے کہ ایک خاص صارف کے لیے، ہم صرف دو مقداروں میں سے ایک کا مشاہدہ کرتے ہیں: Y_i(1) علاج کرنے والے صارفین اور Y_i(0) کنٹرول صارفین کے لیے، ہر صارف صرف ایک شعبے میں ظاہر ہوتا ہے۔
CATE آبادی کی سطح کا ایک اینالاگ ہے، صارف کی خصوصیات کی بنیاد پر متوقع انفرادی علاج کا اثر۔
CATE(x) = E[Y(1) - Y(0) | X = x]
میٹا لرنر اپروچ CATE کا تخمینہ علاج اور کنٹرول گروپس میں الگ الگ نتائج کے ماڈلز کو لاگو کرکے اور پھر پیشین گوئیوں میں فرق کا حساب لگا کر لگاتا ہے۔ T-learner اور X-learner (Künzel et al.) دونوں شناخت کے تین مفروضوں پر مبنی ہیں۔
-
مبہم نہیں (مشروط ignorability): علاج کی تفویض کا تعین مشاہدہ شدہ covariates T ⊥ (Y(0)، Y(1)) سے کیا جاتا ہے | X. بے ترتیب تجربات میں، یہ خود بخود برقرار رہتا ہے۔ مشاہداتی انتخاب کے مطالعے کے لیے الجھانے والے عوامل پر قابو پانے کے لیے فیچر سیٹ کی ضرورت ہوتی ہے۔
-
نقل (مثبتیت): ہر صارف کے پاس علاج یا کنٹرول حاصل کرنے کا غیر صفر امکان ہوتا ہے (0 < P(T=1|X=x) < 1)۔ اگر کچھ صارفین کے لیے معاہدے کا امکان تقریباً صفر ہے (12%، جیسا کہ ہلکے صارفین اس ڈیٹاسیٹ میں کرتے ہیں)، تو اس خطے کے لیے CATE کے تخمینے میں زیادہ فرق ہوگا۔
-
سوٹ بار: ہر صارف کے نتائج کا انحصار صرف ان کے اپنے علاج پر ہے، قطع نظر اس کے کہ ان کے آس پاس کے دوسرے صارفین کیا کرتے ہیں۔ اس مفروضے کی خلاف ورزی ہو سکتی ہے اگر صارف اپنے ورک اسپیس یا سماجی گراف کا اشتراک کرتے ہیں (دیکھیں "آگے کیا کرنا ہے”)۔
شرطیں
آپ کو درج ذیل کی ضرورت ہوگی:
اس ٹیوٹوریل کے لیے پیکجز انسٹال کریں۔
pip install numpy pandas scikit-learn matplotlib scipy
موجودہ صورتحال کچھ یوں ہے: یہ ٹیوٹوریلز کے مکمل نمبر اسٹیک کو انسٹال کرے گا۔ مجھے چارٹ جنریٹر میں KDE کے ساتھ Qini منحنی خطوط کو ہموار کرنے کے لیے اسکائپی کی ضرورت ہے۔ باقی سب کچھ معیاری ML ٹولز ہیں۔
مصنوعی ڈیٹاسیٹ حاصل کرنے کے لیے، ساتھی ریپوزٹری کو کلون کریں۔
git clone https://github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm.git
cd product-experimentation-causal-inference-genai-llm
python data/generate_data.py --seed 42 --n-users 50000 --out data/synthetic_llm_logs.csv
موجودہ صورتحال کچھ یوں ہے: ڈیٹا جنریٹر 50,000 مصنوعی SaaS پروڈکٹ کے صارفین کا ایک قابل تولید ڈیٹا سیٹ بناتا ہے۔ ہر صارف کے پاس منگنی کی درجہ بندی (کم، درمیانی، زیادہ)، استفسار کا اعتماد کا سکور، اور AI سمری خصوصیات کے لیے آپٹ ان جھنڈا ہوتا ہے۔ آپٹ ان کا زمینی سچائی کازل اثر تقریباً +8 فیصد پوائنٹس ہے۔ task_completedہم نے حصہ لینے والے طبقات میں ٹائرڈ تبدیلیوں کا اطلاق کیا۔ اس ٹیوٹوریل میں تمام نمبر اسی ڈیٹا سیٹ سے آتے ہیں۔
اس مضمون کا تمام کوڈ درج ذیل ساتھی نوٹ بک میں آخر سے آخر تک چلتا ہے: 08_uplift_modeling/uplift_demo.ipynb. ذخیرہ کلون کریں اور اسے چلائیں۔ uplift_demo.py ہم تمام نتائج کو دوبارہ پیش کرتے ہیں۔
ورکنگ مثال سیٹ اپ
ڈیٹا سیٹ صارف کی طرف سے ٹوگل کے ذریعے منتخب کردہ AI سمری فیچرز کا استعمال کرتے ہوئے SaaS پروڈکٹ کی نقل کرتا ہے۔ 50,000 صارفین، opt_in_agent_mode پروسیسنگ کالم کے طور پر task_completed بائنری نتیجہ کے ساتھ۔ مشغولیت کے درجات (کم، درمیانے، اونچے) کیپچر کرتے ہیں کہ ہر صارف آپ کے پروڈکٹ کے ساتھ کتنی فعال طور پر تعامل کرتا ہے۔
ڈیٹا لوڈ کریں اور ایک بیس لائن قائم کریں۔
import pandas as pd
import numpy as np
df = pd.read_csv("data/synthetic_llm_logs.csv")
print(df.shape)
print(df[["engagement_tier", "opt_in_agent_mode", "task_completed"]].head(10))
# Opt-in rates by tier
print("nOpt-in rate by engagement tier:")
print(df.groupby("engagement_tier").opt_in_agent_mode.mean().round(3))
# Naive ATE: treated minus control
naive_ate = (
df[df.opt_in_agent_mode == 1].task_completed.mean()
- df[df.opt_in_agent_mode == 0].task_completed.mean()
)
print(f"nNaive ATE (treated - control): {naive_ate:+.4f}")
print(f"Treated users: {(df.opt_in_agent_mode == 1).sum():,}")
print(f"Control users: {(df.opt_in_agent_mode == 0).sum():,}")
متوقع پیداوار:
(50000, 16)
engagement_tier opt_in_agent_mode task_completed
0 medium 0 0
...
Opt-in rate by engagement tier:
engagement_tier
heavy 0.647
light 0.120
medium 0.353
Name: opt_in_agent_mode, dtype: float64
Naive ATE (treated - control): +0.2106
Treated users: 13,451
Control users: 36,549
موجودہ صورتحال کچھ یوں ہے: 50,000 قطاریں لوڈ کریں اور آپ فوری طور پر سنجیدہ مصروفیت کے ساتھ انتخاب کے نمونے دیکھیں گے۔ بھاری صارفین 64.7%، درمیانے درجے کے صارفین 35.3%، اور ہلکے صارفین صرف 12% تھے۔ بولی ATE +0.2106 ہے، جو اصل بنیادی اثر سے دوگنا ہے۔
یہ فرق انتخابی تعصب کی عکاسی کرتا ہے۔ اس کا مطلب یہ ہے کہ علاج شدہ گروپ بھاری صارفین کی طرف متوجہ ہے جو فعالیت سے قطع نظر مزید کام مکمل کرتے ہیں۔ +0.21 نمبر فنکشنل اثر سے زیادہ مصروفیت کی سطحوں کی پیمائش کرتا ہے۔
اب بولی طبقاتی فرق پر ایک نظر ڈالیں، جس سے ظاہر ہوتا ہے کہ ہم جس متفاوت کا صحیح اندازہ لگانے کی کوشش کر رہے ہیں۔
# Naive per-tier gap (confounded but directionally useful)
print("Naive per-tier treated vs. control completion rate:")
for tier in ["light", "medium", "heavy"]:
sub = df[df.engagement_tier == tier]
t_rate = sub[sub.opt_in_agent_mode == 1].task_completed.mean()
c_rate = sub[sub.opt_in_agent_mode == 0].task_completed.mean()
print(f" {tier:8s}: treated={t_rate:.3f}, control={c_rate:.3f}, "
f"diff={t_rate - c_rate:+.3f}")
متوقع پیداوار:
Naive per-tier treated vs. control completion rate:
light : treated=0.551, control=0.455, diff=+0.096
medium : treated=0.745, control=0.670, diff=+0.075
heavy : treated=0.891, control=0.824, diff=+0.067
موجودہ صورتحال کچھ یوں ہے: یہاں تک کہ خام خلل کے وقفے درج ذیل ترتیب میں پیش کیے جاتے ہیں: ہلکا > درمیانے > بھاری (+0.096 > +0.075 > +0.067)۔ ہلکے استعمال کنندگان کے درجہ بندی میں سب سے بڑا فرق ہے، جبکہ بھاری صارفین کے پاس سب سے چھوٹا ہے۔
یہ متضاد ہے، یہ فرض کرتے ہوئے کہ بجلی استعمال کرنے والے ہمیشہ سب سے زیادہ فائدہ اٹھاتے ہیں، لیکن یہ AI خلاصہ کی خصوصیات کے لیے معنی خیز ہے۔ ہلکے استعمال کرنے والے اکثر لمبے دھاگوں میں سیاق و سباق کھو دیتے ہیں اور سب سے اوپر کے خلاصے سے حقیقی طور پر فائدہ اٹھاتے ہیں۔ بھاری صارفین نے پہلے سے ہی اندرونی طور پر تیار کیا ہے کہ کس طرح پروڈکٹ کو نیویگیٹ کیا جائے اور خلاصے کو مددگار سے زیادہ دخل اندازی معلوم ہو۔ ٹی لرنر کا اگلا مرحلہ ہر پرت کے اندر سوال کے اعتماد کو کنٹرول کرکے ان تخمینوں کو مزید بہتر کرتا ہے۔
شکل 1: متفاوت علاج کے اثرات کی تصوراتی مثال۔ کنٹرول اور ٹریٹڈ ڈسٹری بیوشنز (ڈاٹڈ اور ٹھوس لائنز) ہر شرکت کے اسٹریٹم کے لیے دکھائے گئے ہیں۔ CATE (دو منحنی خطوط کے درمیان فرق) فی ٹائر ہلکے سے بھاری صارفین تک کم ہوتا ہے۔ نیچے والا پینل دکھاتا ہے کہ کس طرح ATE اس پھیلاؤ کو ایک ہی اوسط میں سمیٹتا ہے، یہ غلط بیانی کرتا ہے کہ فیچر اصل میں ہر طبقہ کے لیے کس طرح برتاؤ کرتا ہے۔
ٹی لرنر دو مکمل طور پر الگ الگ ماڈلز میں فٹ بیٹھتا ہے۔ ایک علاج گروپ کے لیے اور ایک کنٹرول گروپ کے لیے۔ کسی بھی صارف کے لیے، پیش گوئی کی گئی CATE پروسیس شدہ ماڈل کی پیشین گوئی اور اس صارف کی خصوصیات کے لیے کنٹرول ماڈل کی پیشین گوئی کے درمیان فرق ہے۔
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
# Build feature matrix: query_confidence + engagement_tier dummies
X_full = pd.get_dummies(
df[["query_confidence", "engagement_tier"]],
drop_first=False
).astype(float)
feature_cols = X_full.columns.tolist()
print("Feature columns:", feature_cols)
X_all = X_full.values
treated_mask = df.opt_in_agent_mode == 1
control_mask = ~treated_mask
X1 = X_all[treated_mask] # features for treated users
Y1 = df[treated_mask].task_completed.values
X0 = X_all[control_mask] # features for control users
Y0 = df[control_mask].task_completed.values
# Fit separate models on each arm
m1 = LinearRegression().fit(X1, Y1) # outcome model for treated
m0 = LinearRegression().fit(X0, Y0) # outcome model for control
# CATE = mu_1(x) - mu_0(x)
cate_t = m1.predict(X_all) - m0.predict(X_all)
df["cate_tlearner"] = cate_t
print(f"nMean CATE (T-learner): {cate_t.mean():+.4f}")
print("nMean predicted CATE by engagement tier:")
print(df.groupby("engagement_tier").cate_tlearner.mean().round(4))
متوقع پیداوار:
Feature columns: ['query_confidence', 'engagement_tier_heavy', 'engagement_tier_light', 'engagement_tier_medium']
Mean CATE (T-learner): +0.0847
Mean predicted CATE by engagement tier:
engagement_tier
heavy 0.0665
light 0.0954
medium 0.0744
Name: cate_tlearner, dtype: float64
موجودہ صورتحال کچھ یوں ہے: شرکت کی تہوں کو ایک گرم کالم کے طور پر انکوڈ کریں اور مستقل خصوصیات کے ساتھ استفسار کے اعتماد کو برقرار رکھیں۔ دو LinearRegression ماڈل الگ سے فٹ ہوتے ہیں: m1 منتخب صارفین کے درمیان کام کی تکمیل کے لیے مشروط توقعات سیکھیں۔ m0 ایک ہی چیز غیر استعمال کنندگان میں سیکھی جاتی ہے۔ فیچر والے تمام صارفین کے لیے xپیش گوئی کی گئی CATE ہے: m1(x) - m0(x).
آؤٹ پٹ بولی فرق کی سمت کی تصدیق کرتا ہے، لیکن تخمینہ کو تیز تر بناتا ہے۔ تمام 50,000 صارفین کے لیے اوسط CATE +0.0847 ہے، جو کہ +0.08 کی اصل قیمت کے قریب ہے۔ درجات کی ترتیب ہلکی (+0.0954)> درمیانی (+0.0744)> بھاری (+0.0665) ہے۔ +0.2106 Naive ATE ہلکے اور بھاری صارفین کے درمیان 1.4x فرق کو چھپا رہا تھا۔ یہ پھیلاؤ ایک تقسیم کا اشارہ ہے۔
ٹی لرنرز کے پاس نام رکھنے کے قابل ایک اہم انتباہ ہے۔ یعنی، اگر ایک بازو دوسرے سے بہت چھوٹا ہے (یہاں: 13,451 ٹریٹڈ بمقابلہ 36,549 کنٹرول)، چھوٹے بازو پر تربیت یافتہ ماڈل زیادہ فرق دکھا سکتا ہے۔ اگر آپ کے پاس کل 50,000 صارفین ہیں تو لکیری ریگریشن اس کو اچھی طرح سے ہینڈل کرتا ہے۔ اگلے مرحلے میں ایکس لرنر براہ راست عدم توازن کو دور کرتا ہے۔
مرحلہ 2: ایکس لرنر (غیر متوازن علاج آرم پروسیسنگ)
چھوٹے بازو کی CATE کا اندازہ لگانے میں مدد کرنے کے لیے X-learner بڑے بازو کا استعمال کر کے T-learner کو بہتر بناتا ہے۔ یہ کمپیوٹنگ کے ذریعے کیا جاتا ہے۔ ممنوعہ علاج کا اثر ہر صارف کے لیے، ہم مشاہدہ شدہ نتائج سے کراس پرفارمنس ماڈل کے ذریعے پیش گوئی کیے گئے متضاد نتائج کو ممتاز کرتے ہیں۔
طریقہ کار چار مراحل پر مشتمل ہے:
-
نتیجہ خیز ماڈل فٹ
m0اورm1ہر بازو پر (ٹی لرنر کی طرح) -
پروسیسڈ صارفین کے لیے: کمپیوٹ
D1 = Y1 - m0(X1)یہ فرق ہے کہ ہر علاج کرنے والے صارف نے اصل میں کیا حاصل کیا اور کنٹرول ماڈل نے کیا پیش گوئی کی ہے کہ وہ علاج کے بغیر حاصل کریں گے۔ -
کنٹرول صارفین کے لیے: کمپیوٹ
D0 = m1(X0) - Y0پروسیس شدہ ماڈل کے درمیان فرق یہ ہے کہ ہر کنٹرول صارف پروسیسنگ کے ذریعے کیا حاصل کرے گا اور وہ اصل میں کیا حاصل کرے گا۔ -
ہم دو ٹاؤ ریگریسر (ایک فی بازو) کو فٹ کرتے ہیں اور پھر وزن کے طور پر رجحان کے اسکور کا استعمال کرتے ہوئے ان کو جوڑ دیتے ہیں۔ پارٹی (Künzel et al.):
tau(x) = g(x) * tau_1(x) + (1 - g(x)) * tau_0(x)جہاں g(x) رجحان کا سکور ہے۔ جب g(x) کم ہوتا ہے (اس فنکشنل ایریا میں چند صارفین پر کارروائی کی جاتی ہے)، بڑے کنٹرول سیکٹر میں اندازے کے مطابق tau_0 کو زیادہ وزن دیا جاتا ہے۔ اعلی g(x) tau_1 کو زیادہ وزن دیتا ہے۔
from sklearn.linear_model import LinearRegression, LogisticRegression
# Step 1: m0 and m1 already fitted in Step 1 above
# Step 2: imputed treatment effects for treated group
D1 = Y1 - m0.predict(X1) # Y(1) - mu_0(X1)
# Step 3: imputed treatment effects for control group
D0 = m1.predict(X0) - Y0 # mu_1(X0) - Y(0)
# Fit tau regressors on each arm
tau1_model = LinearRegression().fit(X1, D1) # tau for treated arm
tau0_model = LinearRegression().fit(X0, D0) # tau for control arm
# Step 4: estimate propensity score e(x) = P(T=1 | X)
ps_model = LogisticRegression(max_iter=1000).fit(X_all, df.opt_in_agent_mode.values)
e_x = ps_model.predict_proba(X_all)[:, 1]
# Kunzel et al. (2019): tau(x) = g(x)*tau_1(x) + (1 - g(x))*tau_0(x)
tau1_all = tau1_model.predict(X_all)
tau0_all = tau0_model.predict(X_all)
cate_x = e_x * tau1_all + (1 - e_x) * tau0_all
df["cate_xlearner"] = cate_x
print(f"Mean CATE (X-learner): {cate_x.mean():+.4f}")
print("nMean predicted CATE by engagement tier:")
print(df.groupby("engagement_tier").cate_xlearner.mean().round(4))
# Compare T-learner vs X-learner
print("nT-learner vs X-learner per tier:")
comp = df.groupby("engagement_tier")[["cate_tlearner", "cate_xlearner"]].mean().round(4)
print(comp)
متوقع پیداوار:
Mean CATE (X-learner): +0.0847
Mean predicted CATE by engagement tier:
engagement_tier
heavy 0.0665
light 0.0954
medium 0.0744
Name: cate_xlearner, dtype: float64
T-learner vs X-learner per tier:
cate_tlearner cate_xlearner
engagement_tier
heavy 0.0665 0.0665
light 0.0954 0.0954
medium 0.0744 0.0744
موجودہ صورتحال کچھ یوں ہے: ایک لکیری نتائج کے ماڈل اور چار خصوصیات کا استعمال کرتے ہوئے، ٹی لرنر اور ایکس لرنر ایک ہی پرت کے حساب سے CATE تیار کرتے ہیں۔ اس معاہدے کی توقع اس وقت کی جاتی ہے جب نتیجے میں آنے والا ماڈل اچھی طرح سے واضح ہو۔ ایکس لرنر کی انٹرسیکشن قیمت میں کوئی ایسی معلومات شامل نہیں ہوتی ہے جسے لکیری ماڈل پہلے ہی بازیافت نہیں کرسکتا ہے۔
پیداوار میں، کے فوائد
جب بھی ہم بیس ماڈل کو اپ گریڈ کرتے ہیں، ہم دونوں تخمینوں کو چلاتے ہیں اور اس کو ترجیح دیتے ہیں جو ہولڈنگ سیٹ پر بہتر انشانکن دکھاتا ہو۔
مرحلہ 3: کنی وکر اور K کا اضافہ
CATE ماڈل صرف اس صورت میں مفید ہے جب صارف کی درجہ بندی اصل علاج کے جواب کے آرڈر سے مماثل ہو۔ Qini وکر (Radcliffe, 2007) یہ پوچھ کر جانچتا ہے: اگر ہم صارفین کو پیشین گوئی شدہ CATE (نزول) کے مطابق ترتیب دیتے ہیں اور صرف اوپر k% پر کارروائی کرتے ہیں، تو مشاہدہ شدہ لفٹ کا کتنا حصہ درحقیقت بازیافت ہوتا ہے؟
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
# Sort users by predicted CATE descending
df_sorted = df.sort_values("cate_tlearner", ascending=False).copy()
n = len(df_sorted)
# Compute observed uplift at each percentile cutoff
top_ks = np.arange(0.01, 1.01, 0.01)
qini_vals = []
for k in top_ks:
top_n = max(1, int(k * n))
sub = df_sorted.iloc[:top_n]
treated_sub = sub[sub.opt_in_agent_mode == 1]
control_sub = sub[sub.opt_in_agent_mode == 0]
if len(treated_sub) > 0 and len(control_sub) > 0:
uplift = (treated_sub.task_completed.mean()
- control_sub.task_completed.mean())
else:
uplift = np.nan
qini_vals.append(uplift)
# Plot
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.plot(top_ks * 100, qini_vals, linewidth=2, label="T-learner Qini")
ax.axhline(naive_ate, color="gray", linestyle="--",
label=f"Naive ATE = {naive_ate:.4f}")
ax.set_xlabel("Top-k% of users (sorted by predicted CATE)")
ax.set_ylabel("Observed uplift in top-k group")
ax.set_title("Qini curve: T-learner ranking vs. observed uplift")
ax.legend()
plt.tight_layout()
plt.savefig("qini_curve.png", dpi=140)
print("Saved qini_curve.png")
# Print values at selected percentiles
print("nQini values at selected cutoffs:")
for target_k in [10, 20, 30, 50, 70, 100]:
idx = target_k - 1
print(f" Top {target_k:3d}%: observed uplift = {qini_vals[idx]:.4f}")
متوقع پیداوار:
Saved qini_curve.png
Qini values at selected cutoffs:
Top 10%: observed uplift = 0.0895
Top 20%: observed uplift = 0.1018
Top 30%: observed uplift = 0.0959
Top 50%: observed uplift = 0.0966
Top 70%: observed uplift = 0.1454
Top 100%: observed uplift = 0.2106
موجودہ صورتحال کچھ یوں ہے: تمام 50,000 صارفین کو T- Learner کی پیشن گوئی شدہ CATE (سب سے زیادہ پہلے) کے مطابق ترتیب دیں۔ ہر پرسنٹائل کٹ آف کے لیے، ہم اس ذیلی گروپ کے اندر کام کی تکمیل میں خام ٹریٹمنٹ ٹو کنٹرول فرق کا حساب لگاتے ہیں۔
سب سے اوپر 10% گروپ +0.0895 کا مشاہدہ شدہ اضافہ دکھاتا ہے اور ٹاپ 20% گروپ +0.1018 کا مشاہدہ شدہ اضافہ ظاہر کرتا ہے۔ دونوں +0.2106 کے بولی ATE سے کافی نیچے ہیں۔ یہ انتخاب سے پریشان ہے اور عملی اثرات سے زیادہ شرکت کی سطح کی عکاسی کرتا ہے۔
یہاں کی کنی ویلیو بھی CATE سگنل کو بقایا انتخاب کے تعصب کے ساتھ ملا دیتی ہے۔ پیش گوئی کی گئی CATE کے مطابق سب سے اوپر 54% میں تمام صارفین ہلکے استعمال کنندہ ہیں (12% کی سب سے کم آپٹ ان ریٹ کے ساتھ درجے)، اس لیے اس گروپ کے اندر پروسیس شدہ مائنس کنٹرول موازنہ اب بھی اندرون سطح انتخاب کے تعصب کی وجہ سے پریشان ہیں۔
اوپر 70% (+0.1454) میں چھلانگ اس مبہم اثر کو ظاہر کرتی ہے۔ جب درمیانے اور بھاری صارفین درجہ بندی کے گروپ میں داخل ہوتے ہیں، علاج شدہ سائیڈ میں اچانک بھاری صارفین ہوتے ہیں جن کی تکمیل کی شرح زیادہ ہوتی ہے (64.7% آپٹ ان)، جبکہ کنٹرول سائیڈ پر کم تکمیل کی شرح والے ہلکے صارفین کا غلبہ رہتا ہے۔ وہ سپائیک سلیکشن تعصب ہے، اس کے پیچھے کوئی حقیقی CATE سگنل نہیں ہے۔
مشاہدے میں اضافہ شدہ ترتیب میں، Qini کا قابل عمل خطہ تقریباً 20% سے 50% تک سرفہرست ہے، جس میں درجہ بندی زیادہ واضح طور پر ماڈل کے CATE تخمینے کو اعلیٰ صدور سے ظاہر کرتی ہے، جہاں نتائج کی سطح اور رجحان کے اسکور کے ارتباط کا غلبہ ہے۔
مرحلہ 4: رول آؤٹ رولز تقسیم کریں۔
CATE ماڈل ہر صارف کے لیے ایک پیشین گوئی شدہ علاج کا اثر تفویض کرتا ہے۔ حد مقرر کریں اور انہیں تعیناتی کی پالیسیوں میں تبدیل کریں۔ ان صارفین کو قابل بناتا ہے جن کی پیشن گوئی کی گئی CATE ایک خاص قدر سے زیادہ ہے اور انہیں دوسرے تمام صارفین کے لیے دبا دیتی ہے۔
# Inspect the CATE distribution first
print("CATE distribution (T-learner):")
print(pd.Series(df.cate_tlearner).describe().round(4))
print()
# Plot CATE distribution
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(df.cate_tlearner, bins=50, edgecolor="white", linewidth=0.5)
ax.axvline(0.085, color="red", linestyle="--", label="Threshold = 0.085")
ax.axvline(df.cate_tlearner.mean(), color="gray", linestyle=":",
label=f"Mean CATE = {df.cate_tlearner.mean():.4f}")
ax.set_xlabel("Predicted CATE (T-learner)")
ax.set_ylabel("Number of users")
ax.set_title("Distribution of predicted CATEs")
ax.legend()
plt.tight_layout()
plt.savefig("cate_distribution.png", dpi=140)
print("Saved cate_distribution.png")
# Apply rollout rule
threshold = 0.085
selected = df[df.cate_tlearner >= threshold].copy()
suppressed = df[df.cate_tlearner < threshold].copy()
print(f"nRollout threshold: CATE >= {threshold}")
print(f"Users selected for rollout: {len(selected):,} ({100*len(selected)/len(df):.0f}%)")
print(f"Users suppressed: {len(suppressed):,} ({100*len(suppressed)/len(df):.0f}%)")
print()
print("Tier composition of selected group:")
print((selected.groupby("engagement_tier").size() / len(selected)).round(3))
print()
print(f"Mean predicted CATE (selected): {selected.cate_tlearner.mean():.4f}")
print(f"Mean predicted CATE (suppressed): {suppressed.cate_tlearner.mean():.4f}")
متوقع پیداوار:
CATE distribution (T-learner):
count 50000.0000
mean 0.0847
std 0.0126
min 0.0515
25% 0.0731
50% 0.0897
75% 0.0963
max 0.1021
Name: cate_tlearner, dtype: float64
Saved cate_distribution.png
Rollout threshold: CATE >= 0.085
Users selected for rollout: 27,203 (54%)
Users suppressed: 22,797 (46%)
Tier composition of selected group:
engagement_tier
light 1.0
dtype: float64
Mean predicted CATE (selected): 0.0955
Mean predicted CATE (suppressed): 0.0719
موجودہ صورتحال کچھ یوں ہے: حد مقرر کرنے سے پہلے CATE کی پوری تقسیم کا جائزہ لیں۔ تمام 50,000 صارفین میں اوسط CATE +0.0847 ہے جس کے معیاری انحراف +0.0126 ہے۔ حد کو +0.085 (اوسط +0.0847 سے بالکل اوپر) پر سیٹ کرنے کے نتیجے میں 27,203 صارفین (54%) کو منتخب کیا جائے گا۔
منتخب گروپ کا درجہ بندی 100% ہلکے صارفین ہیں۔ لکیری ماڈل اور ان خصوصیات کا استعمال اس بات کو یقینی بناتا ہے کہ ہر پرت میں CATE رینجز دہلیز پر متجاوز نہ ہوں۔ ہلکے صارفین نے +0.0807 اور +0.1021 کے درمیان CATE کی پیش گوئی کی۔ اوسط صارف نے +0.0592 اور +0.0812 کے درمیان CATE کی پیش گوئی کی۔ 0.085 کی حد واضح طور پر دونوں کو الگ کرتی ہے۔
منتخب گروپ (+0.0955) کے لیے اوسط پیشن گوئی CATE دبے ہوئے گروپ (+0.0719) کے مقابلے میں 33% زیادہ ہے۔ یہ فوکس سیگمنٹڈ رول آؤٹ کی قدر ہے۔ 54% صارفین میں AI کے خلاصے تقسیم کریں جو سب سے زیادہ فائدہ اٹھائیں گے، انہیں چھوٹے متوقع فوائد کے ساتھ درمیانے اور بھاری صارفین تک محدود رکھیں، اور دونوں گروپوں کے نتائج کا ڈیٹا اکٹھا کریں تاکہ چوتھائی تک حد کو بہتر بنایا جا سکے۔

شکل 2: 50,000 صارف کے مصنوعی ڈیٹاسیٹ کے لیے پرت کے لحاظ سے CATE کی تقسیم۔ اوپری پینل شرکت کے درجے کے لحاظ سے ہموار KDE منحنی خطوط دکھاتا ہے۔ ہلکے صارفین (نیلے) کو سب سے زیادہ پیش گوئی کی گئی CATE کے ساتھ کلسٹر کیا جاتا ہے، جبکہ بھاری صارفین (سبز) سب سے کم کے ساتھ کلسٹر ہوتے ہیں۔ نیچے والا پینل سادہ ATE (+0.2106) کے ساتھ حوالہ لائن اور 95% بوٹسٹریپ اعتماد کے وقفے کے ساتھ اوسط CATE فی پرت دکھاتا ہے۔ تینوں درجہ بندی کے CIs بولی ATE سے بالکل نیچے ہیں، اس بات کی تصدیق کرتے ہیں کہ ذرائع انتخاب کے تعصب سے پریشان ہیں۔
ریلیز رولز کا نقشہ براہ راست فیچر فلیگ سسٹم پر۔
# Simulate the rollout decision for a single new user
def should_show_feature(query_confidence, engagement_tier, threshold=0.085):
"""Returns True if predicted CATE exceeds the rollout threshold."""
x = pd.get_dummies(
pd.DataFrame([{"query_confidence": query_confidence,
"engagement_tier": engagement_tier}]),
drop_first=False
).reindex(columns=feature_cols, fill_value=0).astype(float).values
cate = m1.predict(x)[0] - m0.predict(x)[0]
return cate >= threshold, round(cate, 4)
show, cate = should_show_feature(0.72, "heavy")
print(f"Heavy user, conf=0.72: show feature={show}, CATE={cate}")
show, cate = should_show_feature(0.72, "light")
print(f"Light user, conf=0.72: show feature={show}, CATE={cate}")
show, cate = should_show_feature(0.45, "medium")
print(f"Medium user, conf=0.45: show feature={show}, CATE={cate}")
متوقع پیداوار:
Heavy user, conf=0.72: show feature=False, CATE=0.0667
Light user, conf=0.72: show feature=True, CATE=0.0955
Medium user, conf=0.45: show feature=False, CATE=0.0681
موجودہ صورتحال کچھ یوں ہے: CATE کیلکولیشن کو ایک فنکشن میں لپیٹیں جو اس بات کی عکاسی کرتا ہے کہ اصل فیچر فلیگ سروس جب درخواست کی جاتی ہے تو کیا عمل کرتی ہے۔ معتدل استفسار کی وشوسنییتا کے ساتھ بھاری صارفین حاصل کرتے ہیں: show feature=False CATE +0.0667 ہے، 0.085 کی حد سے نیچے۔ ہلکے صارفین کے لئے ایک ہی سوال کی وشوسنییتا ہے۔ show feature=True CATE +0.0955 ہے۔ درمیانے، کم اعتماد والے صارفین +0.0681 حد سے نیچے آتے ہیں۔
یہ آؤٹ پٹ ڈومین کی کہانی سے مماثل ہیں۔ AI کا خلاصہ ان صارفین کی مدد کرتا ہے جنہیں سیشن کے دوران سیاق و سباق کو برقرار رکھنے میں دشواری ہوتی ہے، اور انگیجمنٹ لیئر اس مشکل کے لیے ایک طاقتور پراکسی ہے۔
مرحلہ 5: بوٹسٹریپ اعتماد کا وقفہ
اوپر CATE کے تخمینے پوائنٹ تخمینے ہیں جن میں کوئی غیر یقینی مقدار نہیں ہے۔ اس سے پہلے کہ ہم اس کے لیے ریلیز کے اصول بنا سکیں، ہمیں یہ جاننے کی ضرورت ہے کہ یہ تخمینہ ہمارے صارف کی بنیاد کے مختلف نمونوں میں کتنا مستحکم ہے۔
def bootstrap_cate_ci(df, X_all, feature_cols, n_reps=500, seed=7):
"""Bootstrap 95% CI for mean CATE overall and per engagement tier."""
rng = np.random.default_rng(seed)
n = len(df)
tier_reps = {"light": [], "medium": [], "heavy": []}
mean_reps = []
for _ in range(n_reps):
idx = rng.integers(0, n, size=n)
df_b = df.iloc[idx].reset_index(drop=True)
X_b = X_all[idx]
treated_b = df_b.opt_in_agent_mode == 1
m1_b = LinearRegression().fit(X_b[treated_b], df_b[treated_b].task_completed.values)
m0_b = LinearRegression().fit(X_b[~treated_b], df_b[~treated_b].task_completed.values)
cate_b = m1_b.predict(X_b) - m0_b.predict(X_b)
df_b["cate"] = cate_b
for tier in tier_reps:
tier_reps[tier].append(df_b[df_b.engagement_tier == tier].cate.mean())
mean_reps.append(cate_b.mean())
cis = {}
for tier, vals in tier_reps.items():
arr = np.array(vals)
cis[tier] = (float(np.percentile(arr, 2.5)),
float(np.percentile(arr, 97.5)))
arr = np.array(mean_reps)
cis["mean"] = (float(np.percentile(arr, 2.5)),
float(np.percentile(arr, 97.5)))
return cis
print("Running bootstrap (500 replicates, seed=7)...")
cis = bootstrap_cate_ci(df, X_all, feature_cols, n_reps=500, seed=7)
print(f"Mean CATE 95% CI: [{cis['mean'][0]:+.4f}, {cis['mean'][1]:+.4f}]")
print(f"Light tier 95% CI: [{cis['light'][0]:+.4f}, {cis['light'][1]:+.4f}]")
print(f"Medium tier 95% CI: [{cis['medium'][0]:+.4f}, {cis['medium'][1]:+.4f}]")
print(f"Heavy tier 95% CI: [{cis['heavy'][0]:+.4f}, {cis['heavy'][1]:+.4f}]")
متوقع پیداوار:
Running bootstrap (500 replicates, seed=7)...
Mean CATE 95% CI: [+0.0744, +0.0951]
Light tier 95% CI: [+0.0781, +0.1125]
Medium tier 95% CI: [+0.0596, +0.0892]
Heavy tier 95% CI: [+0.0483, +0.0842]
موجودہ صورتحال کچھ یوں ہے: ہم پورے 50,000 صارف ڈیٹاسیٹ کو 500 بار متبادل کے ساتھ دوبارہ نمونہ بناتے ہیں، ہر ایک نمونے میں T-learner کو ریفٹ کرتے ہیں، اور بوٹسٹریپ کی تکرار میں اوسط CATE تقسیم کا حساب لگاتے ہیں۔ تقسیم کے 2.5ویں اور 97.5ویں پرسنٹائل ہر تخمینہ کے لیے 95% اعتماد کے وقفے فراہم کرتے ہیں۔
ان CIs میں چیک کرنے کے لیے تین چیزیں ہیں: پہلا، مجموعی اوسط CI (+0.0744, +0.0951) +0.08 کی اصل قدر کو بریکٹ کرتا ہے، اس بات کی تصدیق کرتا ہے کہ تخمینہ لگانے والا کام کر رہا ہے۔ دوسرا، ہلکے درجے کا CI (+0.0781, +0.1125) بھاری درجے کے CI (+0.0483, +0.0842) سے زیادہ وسیع ہے۔ یہ ہلکے صارفین کے ساتھ مطابقت رکھتا ہے جن کے انتخاب کی شرح سب سے کم ہے (12%) اور اس وجہ سے تخمینوں کو درست کرنے کے لیے کم مشاہدات پر کارروائی کی گئی۔ تیسرا، پرت CIs کو دم سے مکمل طور پر الگ نہیں کیا جاتا ہے۔ ہلکی نچلی حد (+0.0781) بھاری اوپری باؤنڈ (+0.0842) کو بمشکل صاف کرتی ہے۔ یعنی آرڈر لائٹ > بھاری مستحکم ہے، لیکن زیادہ نہیں۔
تفریق رول آؤٹ کے بارے میں کاروباری فیصلوں کے لیے، استحکام کافی ہے۔ ریگولیٹری یا طبی سیاق و سباق میں بڑے نمونوں کی ضرورت ہوگی۔
جب بہتر ماڈلنگ ناکام ہوجاتی ہے۔
CATE ماڈل پرکشش دکھائی دیتا ہے کیونکہ یہ مسلسل، انفرادی سکور تیار کرتا ہے۔ CATE پر مبنی پالیسیوں کو متعین کرنے سے پہلے، آپ کو چار ناکامی کے طریقوں پر واضح طور پر توجہ دینی چاہیے۔
1. پتلے حصے (اوورلیپ کی خلاف ورزی)
ہلکے صارفین کے لیے CATE کا تخمینہ 13,451 علاج شدہ صارفین میں سے 12%، یا تقریباً 1,614 ہے۔ یہ کلاس لیول کی اوسط کا پتہ لگانے کے لیے کافی ہے، لیکن اچھی خاصی قدروں کے ساتھ کلاس کے اندر انفرادی سطح کے اثرات کا معتبر اندازہ لگانے کے لیے کافی نہیں ہے۔
اگر علاج کے بازو کے فیچر اسپیس والے علاقے میں کوریج کم ہے، تو CATE وہاں زیادہ تغیر کا تخمینہ لگاتا ہے۔ ایک ماڈل ہموار پیشین گوئیاں واپس کر سکتا ہے، لیکن ان کے پیچھے تجرباتی تعاون کمزور ہو سکتا ہے۔
درجہ بندی کا تعین کرنے سے پہلے، سب سے زیادہ CATE صارفین کی فعال تقسیم کو چیک کریں اور یقینی بنائیں کہ ہر علاقے میں پروسیسنگ اور کنٹرول مشاہدات موجود ہیں۔
لکیری رجعت کا تخمینہ تربیت کی حد سے باہر آسانی سے ہوتا ہے۔ اگر ماڈل کسی ایسے صارف کو پیشن گوئی کی گئی CATE تفویض کرتا ہے جس کی خصوصیت کی قدریں ایسے خطے میں ہیں جس کے لیے ایک بازو کے لیے کوئی تربیتی ڈیٹا نہیں ہے، تو اس تخمینے میں تجرباتی تعاون کا فقدان ہے۔
نیسٹڈ مفروضے خود بخود ناکام ہوجاتے ہیں۔ ماڈل ایک نمبر لوٹاتا ہے، لیکن P(T=1|X=x) اس علاقے میں تقریباً 0 یا 1 ہے، اس لیے CATE کی شناخت نہیں کی گئی ہے۔
اپنی CATE پیشین گوئیوں کے ساتھ اپنے پروپینسیٹی سکور کو چیک کریں اور آف پرپینسٹی کلپس یا فلیگ تخمینوں کی جانچ کریں۔ [0.05, 0.95].
3. چھوٹے k پر کنی شور
Qini منحنی خطوط بہت چھوٹے k (اوپر 5% یا کم) پر شور ہوتے ہیں۔ اگر ایک تشخیصی گروپ میں صرف چند سو صارفین ہیں، تو اس گروپ میں کارروائی کی جانے والی تعداد اتنی کم ہو سکتی ہے کہ مشاہدہ شدہ اضافہ نمونے لینے کے شور سے غلبہ رکھتا ہے۔
پہلے سے طے شدہ رول آؤٹ کا فیصلہ 20% سے 50% Qini رینج کے لیے ہوتا ہے، جہاں سگنلز زیادہ مستحکم ہوتے ہیں۔ مشاہداتی ترتیبات میں، بڑے k کے لیے اعلی Qini قدریں (جیسے اس ٹیوٹوریل میں سب سے اوپر 70% میں +0.1454) حقیقی CATE سگنل کو چھپاتے ہوئے انتخابی تعصب کی عکاسی کر سکتی ہیں۔ لفٹ کی قدروں کی تشریح کرنے سے پہلے ہر ٹاپ کے گروپ کے درجہ بندی کا جائزہ لیں۔
4. CATE ماڈل کی اوور فٹنگ
کوئی راستہ نہیں LinearRegression یہاں علاج شدہ بازو پر تربیت سے 13,451 مشاہدات اور چار خصوصیات حاصل ہوئیں: کمفرٹ مارجن؛ لکیری ریگریشن کو گریڈینٹ بوسٹنگ کے ساتھ تبدیل کرنا اور 30 فیچرز شامل کرنا ٹریننگ شور سے منسوب پروسیسنگ اثرات کی اوور فٹنگ کا باعث بن سکتا ہے۔ تربیتی سیٹ میں CATE کی پیشن گوئیاں بہت ہی متفاوت دکھائی دیتی ہیں اور ہولڈ آؤٹ سیٹ میں عالمی اوسط کی طرف رجوع کرتی ہیں۔ CATE ماڈل اس وقت پیچیدگی حاصل کرتا ہے جب یہ مخصوص اصلاحات کے لیے درجے کی اوسط سے آگے نکل جاتا ہے۔ ریلیز کے قواعد بنانے کے لیے استعمال کرنے سے پہلے رکھے گئے ڈیٹا سیٹس کا اندازہ کریں۔
آگے کیا کرنا ہے۔
مندرجہ بالا عمل درآمد بیرونی اضافہ لائبریریوں کے بغیر بنایا گیا تھا، لہذا آپ بالکل دیکھ سکتے ہیں کہ ہر قدم پر کیا حساب کیا جا رہا ہے۔ پیداواری مقاصد کے لیے causalml اور econml ہم دونوں تخمینہ کرنے والوں کے بہتر ورژن فراہم کرتے ہیں، بشمول ایک درخت پر مبنی ٹی-لرنر، ایک دوگنا طاقتور X-لارنر، اور ایک ایماندار کازل فارسٹ جو زیادہ فٹنگ کو کم کرنے کے لیے تربیت اور تخمینہ کے نمونوں کو تقسیم کرتا ہے۔ دونوں لائبریریاں یہاں بنائے گئے ایک ہی تصوراتی ڈھانچے کی پیروی کرتی ہیں۔
causalml اس میں پروڈکشن گریڈ کنی وکر اور ایریا انڈر دی رائز کریو (AUUC) میٹرک کا حساب شامل ہے، جو کنی وکر کو ایک واحد تقابلی اعداد و شمار تک گھٹا دیتا ہے۔ A/B فریم ورک میں بہتری کے ماڈل کا موازنہ چلاتے وقت، AUUC ایک معیاری لیڈر بورڈ میٹرک ہے۔
نام دینے کے قابل ایک ساختی حد: اس ٹیوٹوریل نے SUTVA فرض کیا ہے۔ اس کا مطلب ہے کہ ہر صارف کے نتائج کا انحصار صرف ان کے اپنے علاج کی حیثیت پر ہے۔ کام کی جگہ پر مبنی AI مصنوعات میں، یہ مفروضے اکثر غلط ہوتے ہیں۔ ایک ہی ورک اسپیس کے صارفین ایک مشترکہ ماحول کا اشتراک کرتے ہیں، اور ایک صارف کا سلوک مشترکہ آؤٹ پٹ، ردّعمل کے بدلے ہوئے نمونوں، یا کام کی جگہ کی تبدیل شدہ حرکیات کے ذریعے ٹیم کے اراکین کو متاثر کر سکتا ہے۔
اگر اس قسم کی مداخلت کا شبہ ہے تو، ایک DR-Learner مختلف قسم جو گروپ کے اندر تعلق کو CATE تخمینوں میں پھیلاتا ہے، زیادہ حقیقت پسندانہ غیر یقینی کی حد فراہم کرتا ہے۔ معیاری ٹی لرنرز اور ایکس لرنرز تمام مشاہدات کو آزاد خیال کرتے ہیں اور اس طرح جب ورک اسپیس لیول کے عوامل کام میں آتے ہیں تو غیر یقینی کو کم سمجھتے ہیں۔
اس ٹیوٹوریل کا ساتھی ذخیرہ github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm/tree/main/08_uplift_modeling پر ہے۔ ریپوزٹری کو کلون کریں اور اس کا استعمال کرتے ہوئے ڈیٹاسیٹ بنائیں: --n-users 50000 --seed 42اور چلائیں uplift_demo.py اس ٹیوٹوریل سے تمام نتائج دوبارہ پیش کریں۔
ATE وہ نمبر ہے جس کی آپ کو یہ فیصلہ کرنے کی ضرورت ہے کہ فیچر بنانا ہے یا نہیں۔ CATE وہ نمبر ہے جو یہ فیصلہ کرنے کے لیے ضروری ہے کہ اسے پہلے کس کو ملتا ہے۔ ایک دانے دار رول آؤٹ جو کہ 54% صارفین کے علاج پر توجہ مرکوز کرتا ہے جو کہ سب سے مضبوط پیشین گوئی والے ردعمل کے ساتھ ایک ہی خصوصیت کو ہر کسی کے سامنے لانے سے زیادہ نتائج دے گا۔ یونیفارم رول آؤٹ پالیسی کا انتخاب ہے۔ اطلاع حاصل کریں۔