راهنمای پایان به پایان برای ساختن یک کارت امتیازی با استفاده از یادگیری ماشین

ساخت وبلاگ

در این سری ، ابتدا یک ابزار منبع باز را مرور می کنم و سپس نحوه استفاده از آن را برای مشکلات دنیای واقعی نشان می دهم. در طی این فرآیند ، من تمام برنامه نویسی را نشان می دهم و تمام اصطلاحات ، قضیه ها و الگوریتم هایی را که باید بدانید لیست می کنم.

مخاطبان بالقوه:

  • دانش آموزانی که می خواهند یک پروژه کامل را در رزومه قرار دهند ، و سعی می کنند مصاحبه های بیشتری انجام دهند
  • دانشمندان داده/مهندسان ML که می خواهند یک کارت امتیازی بسازند و به تولید فشار بیاورند

در این وبلاگ ، شما یاد خواهید گرفت:

  • با استفاده از یادگیری ماشین با پایتون یک کارت امتیازی ایجاد کنید
  • Skillset: رگرسیون لجستیک ، تقویت شیب ، وزن شواهد (WOE) ، ارزش اطلاعات (IV) ، Biing ، Chi-Square Biing

ایجاد کارت امتیازی یک مشکل بسیار معمولی در سطح صنعت است ، مانند

  1. ارزیابی معامله یا اعتبار مشتری برای انجام اقدامات بیشتر مانند صدور کارت اعتباری یا ارائه پیشنهاد انتقال تراز برای مشتریان معتبر در یک شرکت کارت اعتباری ،
  2. ارائه تبلیغات یا حق بیمه برای مشتریان با ارزش بالا در یک بستر تجارت الکترونیکی ،
  3. ارائه تقسیم بندی مشتری خوب برای رسیدن به افراد مناسب در یک شرکت بازاریابی.

شما باید یک سیستم را برای به ثمر رساندن مشتری بسازید ، و باید برای افراد غیر فناوری قابل توضیح باشد ، زیرا وقتی چیزی پیش می رود (هشدار کاذب) ، شما می دانید که چگونه آن را برای مدیر/مشتری/تجاری توضیح دهید.

معرفی:

کد و داده های این وبلاگ در اینجا موجود است:

GitHub-Bruceyanghy/end-to-end-guide-to-building-a-scorecard-usting-machine-leaing…

در حال حاضر نمی توانید آن عمل را انجام دهید. شما با یک برگه یا پنجره دیگر وارد سیستم شده اید. شما در یک برگه دیگر یا ...

ابزار منبع باز: وزغ

TOAD یک کتابخانه تولید به Go برای کارتهای امتیازی است. این کشور EDA ، مهندسی ویژگی و تولید کارت امتیازی را ارائه می دهد. عملکرد اصلی آن مهمترین و وقت گیر ترین فرآیندهای مانند انتخاب ویژگی و ریزش خوب را نشان می دهد.

مجموعه داده: پیش فرض مجموعه داده های کارت اعتباری

توضیحات را می توان در Kaggle یافت. مجموعه داده اصلی را می توان در UCI یافت.

25 متغیر وجود دارد:

  • شناسه: شناسه مشتری
  • 23 ویژگی ها عبارتند از: محدودیت تعادل ، رابطه جنسی ، تحصیلات ، ازدواج ، سن ، بازپرداخت ، میزان صورتحساب ، میزان پرداخت قبلی
  • برچسب: پرداخت پیش فرض (1 = بله ، 0 = خیر)

با فرض اینکه شما یک دانشمند داده در یک شرکت کارت اعتباری هستید ، به منظور ارتقاء استفاده از کارت اعتباری ، مدیر شما به شما گفت که یک سیستم کارت امتیازی را برای مشتریان موجود بسازید تا برخی از پیشنهادات انتقال تعادل را برای آنها ارسال کنید. بیایید 6 ماه با 0 ٪ APR + 3 ٪ هزینه بگوییم.

شما داده های تاریخی در مورد این مشتریان دارید. شما نمی خواهید به کسانی که دائماً به طور پیش فرض ارسال می شوند ، ارسال کنید زیرا احتمالاً آنها پول را می گیرند و فرار می کنند. شرکت شما پس از 6 ماه قادر به جمع آوری این مانده های انتقال نخواهد بود و این به یک ضرر برای شرکت شما تبدیل می شود. همچنین ممکن است برای جمع آوری این بدهی ها نیاز به استخدام یک آژانس جمع آوری داشته باشید. این خوب نیست

بنابراین همه چیز به سیستم کارت امتیازی شما بستگی دارد!

1. پیش پردازش داده ها

در زندگی واقعی ممکن است شما نیاز به واکشی و دریافت داده های خام را از پایگاه داده شرکت خود با استفاده از پرس و جو مانند SQL بدست آورید. این ممکن است زمان زیادی را برای شما بگذارد.

در این وبلاگ فقط از پرونده CSV استفاده خواهیم کرد.

بسته ها را نصب و وارد کنید

واردات pkg_resourcesوارد کردن پیپنصب بسته =مورد نیاز =<'pandas','numpy', 'matplotlib', 'seabo','toad','pickle','sklea'>گمشده = مورد نیاز - نصب شدهدر صورت گم شدن:PIP PANDAS را نصب کنید! پیپ نصب numpyPIP نصب matplotlib! پیپ نصب Seabo! پیپ نصب وزغ!Pip Sklea را نصب کنیدواردات پاندا به عنوان PDاز Sklea. Metrics واردات ROC_AUC_SCORE ، ROC_CURVE ، AUC ، PRECISION_RECALL_CURVEاز sklea. model_selection واردات قطار_test_splitاز sklea. linear_model واردات لجستیک وارداتاز Sklea. Ensemble واردات GradientBoostingClassifierوارد کردن numpy به عنوان npگلوبریاضیات وارداتواردات دریایی را به عنوان SNS وارد کنیدوارد کردن matplotlib. pyplot به عنوان pltوارد کردن وزغترشی وارد کردن

داده ها را بارگیری کنید و نرخ برچسب پیش فرض را بررسی کنید

# برای بارگذاری پرونده CSV از پاندا استفاده کنیدdata = pd. read_csv ('uci_credit_card. csv')# اندازه داده ها را بررسی کنیدداده ها# چند خط را بررسی کنیدdata. head ()#استفاده از برچسب جهانداده ها ['label'] = data ['default. payment. next. month']data = data. drop (ستون ها = ['default. payment. next. month'])#نسبت کلاهبرداری داده ها را بررسی کنیدTarget_info (داده ['برچسب'])# یک لیست حذف را برای بسته بندی کارت امتیازی تنظیم کنیدudude_list = ['id' ، 'label']

22 ٪ نرخ کلاهبرداری (افراد پیش فرض) ، این یک نرخ پیش فرض بسیار بالا در داده های تاریخی است.

تقسیم قطار و تست

در یک پروژه زندگی واقعی ، ممکن است بخواهید قطار و آزمایش را بر اساس تاریخ/زمان تقسیم کنید ، انجام یک تقسیم تصادفی خوب نیست ، زیرا این سریال را می شکند و ممکن است باعث افزایش بیش از حد شود.

ما از شناسه کاربر به عنوان زمان انجام تقسیم استفاده خواهیم کرد.

# از ستون ID برای تقسیم داده های آزمون قطار استفاده کنیدdata. id. describ ()train = data_split (داده، شروع = 0، پایان = 22500، date_col = 'ID')test = data_split (داده، شروع = 22500، پایان = 172792، date_col = 'ID')

2. قابلیت فیلتر کردن

ابتدا باید فیلتر کردن ویژگی ها را انجام دهیم تا ویژگی هایی که ارزش اطلاعاتی پایین و همبستگی بالایی دارند حذف کنیم.

###فیلتر کردن ویژگی با مقدار از دست رفته، IV و همبستگی:##اگر نرخ مقدار از دست رفته بیشتر از آستانه است، ویژگی را حذف کنید##اگر ضریب همبستگی بیشتر از آستانه است، ویژگی را حذف کنید##اگر IV کوچکتر از آستانه است، ویژگی ها را حذف کنیدtrain_selected، drop_lst= toad. selection. select(frame = قطار،target=train['label']،خالی = 0. 7،iv = 0. 02، corr = 1،retu_drop=درست است،exclude=exclude_list)print("keep:", train_selected. shape[1],"drop vala:", len(drop_lst['empty']),"drop iv:", len(drop_lst['iv']),"drop corr:", len(drop_lst['corr']))

بنابراین در مجموع 23 ویژگی را حفظ می کنیم و 2 ویژگی ['SEX', 'Marriage'] را حذف می کنیم زیرا آنها IV پایین دارند.

  • وزن شواهد (WOE) - رابطه بین یک متغیر پیشگو و یک متغیر هدف باینری را توصیف می کند.
  • ارزش اطلاعات (IV) - قدرت آن رابطه را بر اساس WOE اندازه گیری می کند. سطح صنعت این است که ویژگی های با IV کمتر از 0. 02 را حذف کند
# جدول iv را در یک دیتافریم خروجی بگیریدdef output_iv_importance(train_selected, label_col):feat_import_iv = toad. quality (train_selected, label_col, iv_only=True)feat_import_iv=feat_import_iv['iv']feat_import_iv = feat_import_iv. reset_index()feat_import_iv. columns = ['name','iv']بازگشت feat_import_ivdf_iv=output_iv_importance(train_selected،'label')df_iv. head(30)

این رتبه بندی IV برای همه ویژگی ها است. می بینیم که PAY_0 بالاترین IV را دارد، که منطقی است زیرا این ویژگی آخرین وضعیت بازپرداخت را نشان می دهد. EDUCATION و AGE در مقایسه با وضعیت و مبلغ پرداخت، IV پایینی دارند.

3. ویژگی Biing

Bining ویژگی تبدیل یک متغیر پیوسته یا عددی به یک ویژگی طبقه بندی است.

مزایای ویژگی Biing:

  1. این مدل رگرسیون لجستیک را ساده می کند و خطر برازش بیش از حد مدل را کاهش می دهد
  2. رگرسیون لجستیک یک مدل خطی تعمیم یافته است و توانایی بیان آن محدود است. باینینگ ویژگی می تواند غیرخطی بودن را به مدل وارد کند، که می تواند توانایی بیان مدل را بهبود بخشد و به برازش بهتر مدل کمک کند.
  3. The discretized features are very robust to abnormal data : for example, the value of a feature is 1 if age>30 و در غیر این صورت 0. اگر ویژگی ها گسسته نباشند، نقطه داده غیرعادی "300 سال قدمت" بر برازش مدل تأثیر می گذارد.
  4. این می تواند داده های تهی را به عنوان یک کلاس جداگانه در نظر بگیرد

مراحل مربوط به ویژگی های مختلف:

مرحله 1. اولیه سازی: c = toad. transform. combiner ()

مرحله 2. آموزش آموزش:

c. fit (dataframe ،y = 'هدف' ،روش = 'chi' ،min_samples = 0. 05 ،n_bins = هیچ ،خالی_پاتات = نادرست)
  • Y: ستون هدف
  • روش: روش biing ، پشتیبانی از Chi (chi-square biing) ، dt (biing درخت تصمیم) ، KMEAN ، QUANTILE ، مرحله (اندازه مساوی اندازه گام)
  • min_samples: هر جعبه حاوی کمترین تعداد نمونه است که می تواند یک عدد یا نسبت باشد
  • n_bins: تعداد سطل ها ؛اگر امکان تقسیم تعداد زیادی جعبه امکان پذیر نباشد ، حداکثر تعداد سطل تقسیم می شود.
  • خالی_په: اینکه آیا جعبه های خالی را به طور جداگانه جدا کنید

مرحله 3. گره های Biing را بررسی کنید: C. Export ()

مرحله 4به صورت دستی biing: c. load (DICT)

مرحله 5نتایج Biing را اعمال کنید: C. Transform (DataFrame ، LABELS = FALSE)

  • برچسب ها: آیا می توان نتایج بنفش را به برچسب های جعبه تبدیل کرد. اگر نادرست باشد ، خروجی 0 ، 1 ، 2… (متغیرهای گسسته مطابق با نسبت طبقه بندی می شوند) ، و اگر خروجی واقعی (-inf ، 0] ، (0،10] ، (10 ، Inf).
زمان وارداتstart = time. time ()combiner = toad. transform. combiner ()# از ویژگی های فیلتر شده برای آموزش استفاده کنید# از بنفش مربع پایدار استفاده کنید ،# مشخص کنید که هر سطل حداقل 5 ٪ داده برای اطمینان از ثبات دارد# مقادیر خالی به طور خودکار به بهترین سطل اختصاص می یابدcombiner. fit (x = train_selected ،y = train_selected ['label'] ،روش = 'chi' ،min_samples = 0. 05 ،exclude=exclude_list)پایان = TIME. TIME ()چاپ ((شروع پایان)/60)#چاشنیسطل = combiner. export ()

نتیجه Biing:

#بینانهtrain_selected_bin = combiner. transform (train_selected)test_bin = combiner. transform (تست [train_selected_bin. columns])#سطل های تنظیم کنندهاز Toad. plot واردات bin_plot ، badrate_plotbin_plot (train_selected_bin ، x = 'pay_amt1' ، target = 'label')bin_plot (test_bin ، x = 'pay_amt1' ، target = 'label')

در این طرح ، طرح نوار نشان دهنده نسبت داده ها در سطل مربوطه است. خط قرمز نشان دهنده نسبت مشتریان پیش فرض است.

ما باید اطمینان حاصل کنیم که Biing دارای یکنواختی است ، به این معنی که خط در همان جهت و بدون پرش ناگهانی یا افت.

این طرح خوب به نظر می رسد ، اگر یک پرش یا افت ناگهانی وجود داشته باشد ، برای ترکیب Biing باید از C. Set_rules (DICT) استفاده کنیم.

#تعیین قوانینقانون =<'PAY_AMT1':[['0', 'nan'],['1'], ['2'], ['3']]>#c. set_rules (قانون)

4- به WOE تبدیل شده و PSI را محاسبه کنید

تحول وای پس از انجام بینینگ انجام می شود.

مراحل به شرح زیر است:

  1. برای تبدیل داده ها از Combiner C تنظیم شده فوق استفاده کنید
  2. تبدیل وای t را راه اندازی کنید: t= toad. transform. WOETtransformer()
  3. آموزش t: t. fit_transform قطارها و خروجی داده های تبدیل شده برای مجموعه قطار
  4. هدف: داده های ستون هدف (نه نام ستون)
  5. exclude : ستون هایی که نیازی به تغییر شکل توسط WOE ندارند. توجه: تمام ستون ها، از جمله ستون هایی که biing نشده اند، تبدیل می شوند و ستون هایی که نیازی به تبدیل توسط WOE ندارند، از طریق exclude حذف می شوند، به ویژه ستون هدف.
  6. تبدیل داده های تست/OOT: transer. transform
##تبدیل به WOEt=toad. transform. WOETtransformer()مجموعه آموزشی #تغییرtrain_woe = t. fit_transform(X=train_selected_bin,y=train_selected_bin['label']،exclude=exclude_list)مجموعه تست #تغییرtest_woe = t. transform(test_bin)final_data_woe = pd. concat([train_woe, test_woe])

PSI را محاسبه کنید

PSI (شاخص پایداری جمعیت) نشان دهنده ثبات توزیع است. ما اغلب از آن برای نمایش ویژگی ها و ارزیابی پایداری مدل استفاده می کنیم. سطح صنعت حذف ویژگی هایی با PSI بیشتر از 0. 2 است

#نام ویژگی را دریافت کنیدfeatures_list = [شاهد شاهکار در train_woe. columns اگر شاهکار در exclude_list نباشد]#PSI را با استفاده از وزغ محاسبه کنیدpsi_df = toad. metrics. PSI(train_woe[features_list], test_woe[features_list]). sort_values(0)#در یک دیتافریم قرار دهیدpsi_df = psi_df. reset_index()psi_df = psi_df. rename(ستون ها = )# ویژگی کمتر از 0. 25psi005 = list(psi_df[psi_df. psi<0.25].feature)# ویژگی بزرگتر از 0. 25psi_remove = list(psi_df[psi_df.psi>=0. 25]. ویژگی)# لیست حذف را حفظ کنیدبرای من در exclude_list:اگر من در psi005 هستم:عبوردیگر:psi005. append(i)# ویژگی هایی که geater از 0. 25 هستند را حذف کنیدtrain_selected_woe_psi = tran_woe[psi005]off_woe_psi = test_woe[psi005]# خروجی جدول داده های نهایی ماآخرین_داده_وای = pd. concat([train_selected_woe_psi, off_woe_psi])

5. خروجی نهایی IV

این مرحله خروجی IV پس از تبدیل WOE است، که کمی با ویژگی های خام IV متفاوت است.

# خروجی IVfeatures_use = [شاهد شاهکار در final_data_woe. columns اگر شاهکار در exclude_list نباشد]len (features_use)df_iv=output_iv_importance(final_data_woe[features_use+['label']],'label')

ایده این است که ویژگی ها را با بالاترین IV و کمترین PSI دریافت کنید.

6. تیونینگ مدل

رگرسیون لجستیک

بیشترین استفاده از الگوریتم در فرآیند مدلسازی کارت امتیازی اعتباری، رگرسیون لجستیک است. دلایل به شرح زیر است:

  • رابطه خطی ساده: رابطه بین متغیرها یک رابطه خطی است
  • تفسیرپذیری خوب: تأثیر متغیرهای ورودی بر روی متغیرهای هدف به راحتی در دسترس است
  • به جای کلاسهای تبعیض آمیز ، به احتمال زیاد بدهید: اطلاعات مشخصه مشتری (مانند ازدواج ، سن ، عملکرد اعتبار تاریخی و غیره) می توانند یکپارچه شوند و به یک ارزش احتمالی تبدیل شوند ، که یک مبنای بصری برای پیش بینی مشتری خوب یا بد فراهم می کند. یعنی هرچه مقدار بزرگتر باشد ، احتمال اینکه مشتری در آینده به طور پیش فرض پیش فرض شود ، کمتر باشد.
  • استقرار آسان: آزمایش ، استقرار ، نظارت ، تنظیم و غیره نسبتاً ساده است
def check_train_test_auc (x_train ، y_train ، x_test ، y_test):از sklea. linear_model واردات لجستیک وارداتLR = LogisticRegression (Random_state = 42 ، C = 0. 1 ، مجازات = 'L2' ، Solver = 'Newton-CG')  LR = LogisticRegression (Class_weight = 'Balanced')lr. fit (x_train ، y_train) pred_train = lr. predict_proba (x_train) [: ، 1]از Toad. Metrics واردات KS ، AUC چاپ ('قطار ks' ، ks (pred_train ، y_train))چاپ ('قطار AUC' ، AUC (pred_train ، y_train)) pred_oot = lr. predict_proba (x_test) [: ، 1]چاپ ('تست ks' ، ks (pred_oot ، y_test))چاپ ('تست AUC' ، AUC (pred_oot ، y_test)) از sklea. metrics واردات confusion_matrix ، دقت_کور ، ROC_AUC_SCORE ، plot_roc_curve ، طبقه بندی_رپورت شکل ، ax = plt. subplots (figsize = (12 ، 8))plot_roc_curve (lr ، x_test ، y_test ، color = 'blue' ، ax = ax)#Train & Testcheck_train_test_auc (x_train = train_woe [ویژگی های_use] ، y_train = train_woe ['label'] ،x_test = test_woe [ویژگی های_use] ، y_test = test_woe ['label'])

ما می توانیم ببینیم که تفاوت زیادی بین قطار AUC و تست AUC یا Train KS و Test Ks وجود ندارد. این بدان معنی است که مدل ما بیش از حد نیست.

یک GradientBoostingClassifier را آموزش دهید و جدول اهمیت ویژگی را بررسی کنید

برای دیدن اینکه آیا یک مدل GBDT بهتر از LR عمل خواهد کرد و جدول اهمیت ویژگی را با IV مقایسه می کند.

def get_evaluation_scores (برچسب ، پیش بینی):از Sklea. Metrics Import Classification_Report ، Confusion_Matrix ، Accuracy_scoreاز Sklea. Metrics واردات متعادل_ ACCURACY_SCORETP ، FN ، FP ، TN = Confusion_Matrix (برچسب ، پیش بینی ، برچسب = [1،0]). تغییر شکل (-1)چاپ ('مثبت مثبت :' ، TP)چاپ ("منفی واقعی" ، TN)چاپ ('مثبت کاذب' ، FP)چاپ ('منفی کاذب' ، FN)دقت = (tp+tn)/(tp+fn+fp+tn)چاپ ("دقت:" ، دقت)فراخوان = TP/(TP+FN)چاپ ('(یادآوری):' ، یادآوری)دقت = tp/(tp+fp)چاپ ('(دقت):' ، دقت)#نمره F1 = 2*(P*r)/(P+R)f1 = 2*دقت*فراخوان/(دقت+فراخوان)چاپ ('نمره F1:' ، F1) چاپ (طبقه بندی_ گزارش (برچسب ، پیش بینی)) چاپ ('ballanced_accuracy_score:' ، ballanced_accuracy_score (برچسب ، پیش بینی))دقت را برگردانید ، به یاد بیاوریدdef emaluate_result (df_train ، df_test ، ویژگی های_Name):از Sklea. Ensemble واردات adaboostclassifer ، GradientBoostingClassifier ، RandomForestClassifer ، Extratreesclassiferواردات دریایی را به عنوان SNS وارد کنیدوارد کردن matplotlib. pyplot به عنوان pltstart = time. time ()x_train = df_train [ویژگی های_NAME]y_train = df_train ['label'] x_test = df_test [ویژگی های_Name]y_test = df_test ['label'] مدل = GradientBoostingClassifier (n_estimators = 250 ، random_state = 0)model. fit (x_train ، y_train)پیش بینی ها = model. predict (x_test)get_evaluation_scores (برچسب = y_test ، پیش بینی = پیش بینی)feat_importances = pd. series (model. feature_importances_ ، index = ویژگی ها_ نام)feat_importances = pd. dataframe (feat_importances) . reset_index ()feat_importances. columns = ['feature_name' ، 'feature_importance']feat_importances = feat_importances. sort_values (['action_importance'] ، صعودی = false)وارد کردن matplotlib. pyplot به عنوان pltplt. figure (figsize = (15،15)) sns_plot1 = sns. barplot (feat_importances. feature_importance ، feat_importances. feature_name ، برآوردگر = جمع)plt. title ("دارای اهمیت" ، اندازه = 18)plt. ylabel ('' ، اندازه = 15)plt. tick_params (برچسب ها = 18)بازگرداندن feat_importances ، مدل ، x_train ، y_train ، x_test ، y_testfet_importance_gbdt_reason ، مدل ، x_train ، y_train ، x_test ، y_test = reasure_result (df_train = train_woe ،df_test = test_woe ،ویژگی ها_ نام = ویژگی ها_ USE)

همانطور که از جدول اهمیت ویژگی می بینیم ، GBDT وزن زیادی (64 ٪) را در ویژگی PAY_0 قرار می دهد.

def plot_roc_pre_recall_curve (برچسب ها ، پروب ها):از Sklea. Metrics Import Precision_Recall_Curve# Curve ROC FPR و TPR را از برچسب های واقعی در مقابل مقادیر نمره دریافت کنیدFPR ، TPR ، _ = ROC_CURVE (برچسب ها ، پروب ها) # منطقه ROC را در زیر منحنی (AUC) از نقاط داده FPR و TPR محاسبه کنیدroc_auc = AUC (FPR ، TPR) # دقت را محاسبه کنید و از برچسب های واقعی در مقابل مقادیر نمره یادآوری کنیددقت ، یادآوری ، _ = Precision_recall_curve (برچسب ها ، پروب ها) plt. figure (figsize = (8 ، 3)) plt. subplot (1،2،1)LW = 2plt. plot (fpr ، tpr ، color = 'darkorange' ، lw = lw ، label = 'curve roc (منطقه = 0. 4f)' ٪ roc_auc)plt. plot ([0 ، 1] ، [0 ، 1] ، رنگ = 'navy' ، lw = lw ، linestyle = '-')plt. xlim ([0. 0 ، 1. 0])plt. ylim ([0. 0 ، 1. 05])plt. xlabel ("نرخ مثبت کاذب")plt. ylabel ("نرخ مثبت واقعی")plt. title ("منحنی ROC")plt. legend (loc = "پایین راست")plt. grid (درست) plt. subplot (1،2،2)plt. step (یادآوری ، دقت ، رنگ = 'نارنجی "، که در آن =' پست")# plt. fill_between (یادآوری ، دقت ، مرحله = 'post' ، alpha = 0. 5 ، رنگ = 'نارنجی')plt. xlabel ("فراخوان")plt. ylabel ("دقت")plt. ylim ([0. 0 ، 1. 05])plt. xlim ([0. 0 ، 1. 0])plt. title ("منحنی فراخوان دقیق")plt. grid (درست) سمت چپ = 0. 125 # سمت چپ زیر مجموعه های شکلسمت راست = 0. 9 # سمت راست زیر مجموعه های شکلپایین = 0. 1 # پایین زیرمجموعه های شکلبالا = 0. 9 # بالای زیر مجموعه های شکلWSPACE = 0. 5 # مقدار عرض برای فضای خالی بین زیرمجموعه ها رزرو شده استHspace = 0. 2 # مقدار ارتفاع برای فضای سفید بین زیرمجموعه ها رزرو شده استplt. subplots_adjust (چپ ، پایین ، راست ، بالا ، wspace ، hspace)plt. show ()probs = model. predict_proba (x_test) [: ، 1]sns. set (font_scale = 1)plot_roc_pre_recall_curve (y_test ، پروب)

منحنی ROC و دقیق به نظر می رسد خوب است.

7. تولید مدل

بیایید مدل تولید خود را برای رگرسیون لجستیک آموزش دهیم

#داده های قطار و آزمون آماده سازیx_train = train_woe [ویژگی های_ته]y_train = train_woe ['label']x_test = test_woe [ویژگی های_ته]y_test = test_woe ['label']#Train LR#lr = LogisticRegression (Random_state = 42 ، C = 0. 1 ، پنالتی = 'L2' ، Solver = 'Newton-CG')LR = LogisticRegression (Class_weight = 'Balanced')lr. fit (x_train ، y_train)#بررسی AUCپروب = lr. predict_proba (x_test) [: ، 1]sns. set (font_scale = 1)plot_roc_pre_recall_curve (y_test ، پروب)

AUC LR: 0. 7835

AUC GBDT: 0. 7892

تفاوت بزرگی بین این مدل ها نیست. بنابراین استفاده از LR برای ساخت کارت امتیازی اشکالی ندارد.

8. تنظیم کارت امتیازی

پارامترهای زیر مهمترین موارد برای تنظیم کارت امتیازی است.

معنای واقعی این است که وقتی شانس پایه 35 باشد ، نمره معیار 1000 است و وقتی نسبت دو برابر معیار باشد ، نمره معیار 80 امتیاز کاهش می یابد.

# تنظیم کارت امتیازیکارت = toad. scorecard (combiner = combiner ،transer = t ،class_weight = 'متعادل' ،ج = 0. 1 ،base_score = 1000 ،base_odds = 35 ،PDO = 80 ،نرخ = 2)card. fit (train_woe [ویژگی های_use] ، train_woe ['label'])#اشاره در داده های آزمونآزمون ['creditscore'] = card. predict (آزمون)آزمون ['creditscore']. توصیف ()#کارت امتیازیfinal_card_score = card. export ()LEN (Final_card_score)#ترانسفورماتور را به DataFrame تبدیل کرده و در CSV ذخیره کنیدکلیدها = لیست (card. export (). کلیدها ())score_card_df = pd. dataframe ()برای n در کلیدها:temp = pd. dataframe. from_dict (final_card_score [n] ، Orient = 'index')temp = temp. reset_index ()temp. columns = ['biing' ، 'Score']دما ['متغیر'] = ntemp = temp[['variable','biing','score']] SCORE_CARD_DF = SCORE_CARD_DF. APPEND (TEMP)Score_card_df. head (30)

در اینجا ما کارت امتیازی خود را داریم. پس از دریافت این جدول ، می توانیم این فایل CSV را به توسعه دهنده پرتاب کنیم و به آنها اجازه دهیم تا یک سرویس را برای نمره هر مشتری تهیه کنند.

اما کاری بیشتر وجود دارد که ما باید انجام دهیم. برای یک کارت امتیازی معمولی ، ما باید دامنه نمره داشته باشیم و هر محدوده سطح اعتماد را ارائه می دهد.

به این ترتیب ، افراد طرف تجاری راحت تر می توانند اقدامی را در برابر مشتریان سطح مختلف انجام دهند.

به عنوان مثال ، ما می توانیم سطح اعتبار را مانند این تنظیم کنیم:

9. تجزیه و تحلیل توزیع

ما باید توزیع نمره مشتریان پیش فرض v. s. مشتریان خوب به منظور تقسیم سطح اعتبار (سطح 0 تا سطح 8).

plt. figure (figsize = (12،10))وارد کردنوارد کردن numpyاز Matplotlib واردات Pyplot را به عنوان plt وارد کنیدW = 40n = math. ceil ((داده ['creditscore']. حداکثر () - داده ها ['creditscore']. min ())/w)#bins = numpy. linspace (-10 ، 10 ، 100)plt. hist (data [data. label == 1] . creditscore ، alpha = 0. 5 ، label = 'black' ، bins = n)plt. hist (data [data. label == 0] . creditscore ، alpha = 0. 5 ، label = 'سفید' ، سطل = n)plt. legend (loc = 'بالا سمت چپ ")plt. title ('توزیع نمره اعتبار: مجموعه آزمون' ، اندازه = 15)plt. show ()

سیاه به معنای مشتریان پیش فرض و سفید به معنای مشتریان خوب است.

یک مدل خوب توزیع سیاه/سفید را به وضوح جدا می کند.

توزیع ایده آل شکل لبخند است

  • Good customers with high credit scores>به خیلی راست
  • Default customers with low credit scores>به سمت چپ

مدل فعلی ما این توزیع ها را به خوبی جدا نمی کند. برای من ، من به کشف ویژگی های بیشتر برای افزایش قدرت پیش بینی برمی گردم. اما ما همیشه می توانیم ابتدا یک مدل پایه بسازیم و بر اساس آن پیشرفت کنیم.

10. تنظیم آستانه

ما باید تنظیمات آستانه را برای سطوح مختلف اعتبار انجام دهیم ، و این یک تجارت بین ضرر و پوشش است.

بیایید بگوییم که رئیس شما با ضرر خوب است ، اما شما باید 70 ٪ از مشتریان خوب را برای ماه آینده پوشش دهید.

به عبارت دیگر ، هدف شما پیدا کردن آستانه با از دست دادن 10 ٪ و پوشش 70 ≥ است.

def get_credit_level (تست،Target_score = 'Order_Score' ،out_col = 'order_level' ،Left_bound = -100 ،سطح_0 = 100 ،سطح_1 = 200 ،سطح_2 = 250 ،سطح_3 = 300 ،سطح_4 = 350 ،سطح_5 = 400 ،سطح_6 = 450 ،سطح_7 = 500 ،سطح_8 = 800):سطح = []برای من در محدوده (لن (تست)):if (test[target_score][i]>Left_bound) & (آزمایش [Target_score] [i]<=level_0):Level. Append (0)elif (test[target_score][i]>Level_0) & (تست [Target_score] [i]<=level_1):سطح. کار (1)elif (test[target_score][i]>سطح_1) و (تست [Target_score] [i]<=level_2):سطح. کار (2)elif (test[target_score][i]>Level_2) & (آزمایش [Target_score] [i]<=level_3):سطح. کار (3)elif (test[target_score][i]>سطح_3) و (تست [Target_score] [i]<=level_4):Level. Append (4)elif (test[target_score][i]>سطح_4) و (تست [target_score] [i]<=level_5):Level. Append (5)elif (test[target_score][i]>Level_5) & (تست [Target_score] [i]<=level_6):سطح. کار (6)elif (test[target_score][i]>سطح_6) و (آزمایش [Target_score] [i]<=level_7):سطح. کار (7)elif (test[target_score][i]>سطح_7) و (تست [Target_score] [i]<=level_8):سطح. کار (8) تست [out_col] = سطحتست بازگشتdef plot_bts_level_loss (تست ، target_col):bts_level_df = تست [target_col] . Value_counts ()bts_level_df = pd. dataframe (bts_level_df)df_label_level = تست [test. label == 1] . GroupBy (target_col) ['label']. count ()/ test. groupby (target_col) ['label']. count ()df_label_level = pd. dataframe (df_label_level)bts_level_df. sort_index (). plot. bar (عنوان = '')df_label_level. plot ()تست = get_credit_level (تست ،Target_score = 'CreditScore' ،out_col = 'creditscore_level' ،Left_bound = -1000 ،سطح_0 = 250 ،سطح_1 = 300 ،سطح_2 = 400 ،سطح_3 = 500 ،سطح_4 = 580 ،سطح 5 = 630 ،سطح_6 = 690 ،سطح_7 = 730 ،سطح_8 = 1000)plot_bts_level_loss (تست ، target_col = 'creditscore_level')def get_loss_coverage (آزمون ، target_level):#ضرر 8-LEVEL 8 (درصد افراد پیش فرض)L5_loss = test[test[target_level]>=5 ].label.value_counts()/len(test[test[target_level]>= 5])#پوشش 5- سطح 8 (درصد افراد خوب)L5_coverage=test[test[target_level]>= 5] . label. value_counts () [0]/تست [test. label == 0] . shape [0]چاپ ("سطح 5 سطح 8: از دست دادن" ، l5_loss [1] ، "؛ پوشش است" ، l5_coverage)#باخت 6 سطح 8 ضررL6_loss=test[test[target_level]>=6 ].label.value_counts()/len(test[test[target_level]>= 6])#پوشش 8 سطح 8 سطحL6_coverage=test[test[target_level]>= 6] . label. value_counts () [0]/تست [test. label == 0] . shape [0]چاپ ("سطح 6 سطح 8: از دست دادن" ، l6_loss [1] ، "؛ پوشش است" ، l6_coverage)

این طرح نشان دهنده توزیع هر سطح اعتبار و نرخ پیش فرض اعتبار در آن سطح است.

با بررسی هر سطح ، یک جدول ضرر و پوشش خواهید داشت. به عنوان مثال ، اگر پیشنهادات انتقال تراز را برای همه افراد 7501 (L0-L8) ارسال کنید ، 21 ٪ از دست دادن (1548/7501) را متحمل خواهید شد.

برای رسیدن به هدف (از دست دادن 10 ٪ و پوشش 70 ≥) ، باید L6-L8 را با از دست دادن 10. 1 ٪ (347+120+34)/(2573+1570+796) و یک پوشش 75 ٪ (2226 ٪ انتخاب کنید.+1450+762)/5953.

در اصل ، ماه آینده (با فرض اینکه مجموعه آزمون داده های ماه آینده است) افراد سمت تجاری پیشنهادات انتقال تعادل را با رتبه 6 یا بالاتر از آنها ، در مجموع 4939 مشتری به مشتریان ارسال می کنند.

11. کارت امتیازی ما را به صورت دستی آزمایش کنید

آیا می توانیم ماه آینده یک پیشنهاد انتقال تعادل را با اطلاعات زیر به مشتری ارسال کنیم؟

بیایید کارت امتیازی را به صورت دستی بررسی کنیم.

استنتاج توسط وزغ:

با بررسی جدول سطح اعتبار ما:

می بینیم که این مشتری یک مشتری سطح 8 با اعتبار کامل است. بنابراین می توانیم پیشنهاد انتقال تعادل را برای او صادر کنیم.

نتیجه:

این وبلاگ در طی مراحل پایان تا پایان ساخت یک کارت امتیازی اعتباری بر اساس وزغ منبع باز ML می رود.

کلمات کلیدی زیر ML در این وبلاگ مورد بحث قرار گرفته است:

ارزش اطلاعات (IV) ، وزن شواهد (WOE) ، شاخص پایداری جمعیت (PSI) ، AUC (منطقه تحت منحنی ROC) ، KS (Kolmogorov-Smiov) ، رگرسیون لجستیک (LR) ، GBDT (درخت تصمیم گیری تقویت گرادیان)

برای کارهای آینده ، به عنوان یک دانشمند داده ، می توانید از سایر مدل های ML برای ساختن کارت امتیازی مانند شبکه های عصبی عمیق استفاده کنید تا دقت بیشتری را افزایش داده و نرخ مثبت کاذب را برای بهبود رضایت مشتری کاهش دهید.

توجه داشته باشید از ویرایشگران Data Science: در حالی که ما به نویسندگان مستقل اجازه می دهیم مقالات را مطابق با قوانین و دستورالعمل های خود منتشر کنند ، ما سهم هر نویسنده را تأیید نمی کنیم. شما نباید بدون اینکه به دنبال مشاوره حرفه ای باشید ، به آثار نویسنده اعتماد کنید. برای جزئیات بیشتر به اصطلاحات خواننده ما مراجعه کنید.< SPAN> کلمات کلیدی زیر ML در این وبلاگ مورد بحث قرار گرفته است:

راهنمای تجارت فارکس...
ما را در سایت راهنمای تجارت فارکس دنبال می کنید

برچسب : نویسنده : نسیم خاکسار بازدید : <-PostHit-> تاريخ : چهارشنبه 15 شهريور 1402 ساعت: 0:32