使用toad库进行机器学习评分卡全流程

这篇具有很好参考价值的文章主要介绍了使用toad库进行机器学习评分卡全流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 加载数据

导入模块

import pandas as pd
from sklearn.metrics import roc_auc_score,roc_curve,auc
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import numpy as np
import math
import xgboost as xgb
import toad
from toad.plot import bin_plot, badrate_plot
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler
from toad.metrics import KS, F1, AUC
from toad.scorecard import ScoreCard

加载数据

 # 加载数据
df = pd.read_csv('scorecard.txt')
print(df.info())
df.head()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

df.describe()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

数据划分

feature_list = list(df.columns)
feature_drop = ['bad_ind','uid','samp_type']
for lt in feature_drop:
    feature_list.remove(lt)
df_dev = df[df['samp_type']=='dev']
df_val = df[df['samp_type']=='val']
df_off = df[df['samp_type']=='off']
print(feature_list)
print('dev',df_dev.shape)
print('val',df_val.shape)
print('off',df_off.shape)

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

简单数据分析

toad.detector.detect(df)

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
toad库能够同时处理数值型数据和分类型数据。由于没有缺失值,我们不用进行数据填充。

2 特征筛选

使用缺失率、IV和相关系数进行特征筛选。

# 根据缺失值、IV和相关系数进行特征筛选
dev_slt, drop_slt = toad.selection.select(df_dev, df_dev['bad_ind'], 
                                          empty=0.7, 
                                          iv=0.03, 
                                          corr=0.7, 
                                          return_drop=True, 
                                          exclude=feature_drop)
print('keep:', dev_slt.shape,';drop empty:',drop_slt['empty'].shape,';drop iv:',drop_slt['iv'].shape,';drop_corr:',drop_slt['corr'].shape)

keep: (65304, 12) ;drop empty: (0,) ;drop iv: (1,) ;drop_corr: (0,)

3 卡方分箱

使用toad库,能够对所有特征切分节点,然后进行分箱

# 使用卡方分箱
# 使用卡方分箱
cmb = toad.transform.Combiner()
cmb.fit(dev_slt, 
        dev_slt['bad_ind'], 
        method='chi', 
        min_samples=0.05, 
        exclude=feature_drop)
bins = cmb.export()
print(bins)

{‘td_score’: [0.7989831262724624], ‘jxl_score’: [0.4197048501965005], ‘mj_score’: [0.3615303943747963], ‘zzc_score’: [0.4469861520889339], ‘zcx_score’: [0.7007847486465795], ‘person_info’: [-0.2610139784946237, -0.1286774193548387, -0.0537175627240143, 0.013863440860215, 0.0626602150537634, 0.078853046594982], ‘finance_info’: [0.0476190476190476], ‘credit_info’: [0.02, 0.04, 0.11], ‘act_info’: [0.1153846153846154, 0.141025641025641, 0.1666666666666666, 0.2051282051282051, 0.2692307692307692, 0.358974358974359, 0.3974358974358974, 0.5256410256410257]}

调整分箱

绘制Bivar图,观察该特征分享后是否单调性,不满足单调性需要调整分箱。

# 绘制bivar图,调整分箱
# 根据节点设置分箱
dev_slt2 = cmb.transform(dev_slt)
val2 = cmb.transform(df_val[dev_slt.columns])
off2 = cmb.transform(df_off[dev_slt.columns])

# 观察分箱后的图像-act_info
bin_plot(dev_slt2, x='act_info', target='bad_ind')
bin_plot(val2, x='act_info', target='bad_ind')
bin_plot(off2, x='act_info', target='bad_ind')

开发样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
测试样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
验证样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
我们能看到前3箱出现上下波动,与整体的单调递减趋势不符,所以进行分箱合并。

# 没有呈现单调性,需要进行合并
bins['act_info']

[0.1153846153846154,
0.141025641025641,
0.1666666666666666,
0.2051282051282051,
0.2692307692307692,
0.358974358974359,
0.3974358974358974,
0.5256410256410257]

将其调整为3个分箱

adj_bins = {'act_info':[0.1666666666666666,0.358974358974359]}
cmb.set_rules(adj_bins)

dev_slt3 = cmb.transform(dev_slt)
val3 = cmb.transform(df_val[dev_slt.columns])
off3 = cmb.transform(df_off[dev_slt.columns])

# 观察分箱后的图像
bin_plot(dev_slt3, x='act_info', target='bad_ind')
bin_plot(val3, x='act_info', target='bad_ind')
bin_plot(off3, x='act_info', target='bad_ind')

开发样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
测试样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
验证样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

查看负样本占比关联图

# 绘制负样本占比关联图
data = pd.concat([dev_slt3, val3, off3], join='inner')
badrate_plot(data, x='samp_type', target='bad_ind', by='act_info')

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

其他特征分箱

person_info特征分箱

bins['person_info']

[-0.2610139784946237,
-0.1286774193548387,
-0.0537175627240143,
0.013863440860215,
0.0626602150537634,
0.078853046594982]

adj_bins = {'person_info':[-0.2610139784946237,-0.1286774193548387,-0.0537175627240143,0.078853046594982]}
cmb.set_rules(adj_bins)

dev_slt3 = cmb.transform(dev_slt)
val3 = cmb.transform(df_val[dev_slt.columns])
off3 = cmb.transform(df_off[dev_slt.columns])

data = pd.concat([dev_slt3, val3, off3], join='inner')
badrate_plot(data, x='samp_type', target='bad_ind', by='person_info')
# 观察分箱后的图像
bin_plot(dev_slt3, x='person_info', target='bad_ind')
bin_plot(val3, x='person_info', target='bad_ind')
bin_plot(off3, x='person_info', target='bad_ind')
bins['person_info']

负样本占比关联图
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
开发样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
测试样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
验证样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

credit_info特征

# credit_info
badrate_plot(data, x='samp_type', target='bad_ind', by='credit_info')

# 观察分箱后的图像
bin_plot(dev_slt3, x='credit_info', target='bad_ind')
bin_plot(val3, x='credit_info', target='bad_ind')
bin_plot(off3, x='credit_info', target='bad_ind')
bins['credit_info']

负样本占比
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
开发样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
测试样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
验证样本
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
其他特征分箱分为两个,所以不需要单独看。

4 WOE编码,并验证IV

# WOE编码,验证IV
woet = toad.transform.WOETransformer()
dev_woe = woet.fit_transform(dev_slt3, dev_slt3['bad_ind'], exclude=feature_drop)
val_woe = woet.transform(val3[dev_slt3.columns])
off_woe = woet.transform(off3[dev_slt3.columns])
data_woe = pd.concat([dev_woe, val_woe,off_woe])
# 计算PSI
psi_df = toad.metrics.PSI(dev_woe,val_woe).sort_values(0)
psi_df = psi_df.reset_index()
psi_df = psi_df.rename(columns={'index':'feature', 0:'psi'})
psi_df

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
一般删除psi大于0.1的特征,但我们这里调整为0.13。

psi_013 = list(psi_df[psi_df.psi<0.13].feature)
# psi_013.extend(feature_drop)
data_psi = data_woe[psi_013]
dev_woe_psi = dev_woe[psi_013]
val_woe_psi = val_woe[psi_013]
off_woe_psi = off_woe[psi_013]
print(data_psi.shape)

(95806, 11)

由于卡方分箱后部分变量的IV降低,且整体相关程度增大,需要再次筛选特征。

dev_woe_psi2,drop_lst = toad.selection.select(dev_woe_psi, 
                                              dev_woe_psi['bad_ind'], 
                                              empty=0.6, 
                                              iv=0.001, 
                                              corr=0.5, 
                                              return_drop=True, 
                                              exclude=feature_drop)
print('keep:',dev_woe_psi2.shape,';drop empty:',drop_lst['empty'].shape,';drop iv:',drop_lst['iv'].shape,';drop corr:',drop_lst['corr'].shape)

keep: (65304, 7) ;drop empty: (0,) ;drop iv: (4,) ;drop corr: (0,)

5 再次特征筛选

使用逐步回归进行特征筛选,这里为线性回归模型,并选择KS作为评价指标。

# 特征筛选,使用逐步回归法进行筛选
dev_woe_psi_stp = toad.selection.stepwise(dev_woe_psi2,
                                          dev_woe_psi2['bad_ind'],
                                          exclude=feature_drop,
                                          direction='both',
                                          criterion='ks',
                                          estimator='ols',
                                          intercept=False)
val_woe_psi_stp = val_woe_psi[dev_woe_psi_stp.columns]
off_woe_psi_stp = off_woe_psi[dev_woe_psi_stp.columns]
data_woe_psi_std = pd.concat([dev_woe_psi_stp, val_woe_psi_stp, off_woe_psi_stp])
print(data_woe_psi_std.shape)
print(data_woe_psi_std.columns)

(95806, 6)
Index([‘uid’, ‘samp_type’, ‘bad_ind’, ‘credit_info’, ‘act_info’,
‘person_info’],
dtype=‘object’)

6 模型训练

定义逻辑回归模型和XGBoost模型的函数

# 进行模型训练
def lr_model(x,y,valx,valy,offx,offy,c):
    model = LogisticRegression(C=c, class_weight='balanced')
    model.fit(x,y)
    
    # dev
    y_pred = model.predict_proba(x)[:,1]
    fpr_dev, tpr_dev, _ = roc_curve(y,y_pred)
    dev_ks = abs(fpr_dev-tpr_dev).max()
    print('dev_ks:',dev_ks)
    
    y_pred = model.predict_proba(valx)[:,1]
    fpr_val, tpr_val, _ = roc_curve(valy,y_pred)
    val_ks = abs(fpr_val-tpr_val).max()
    print('val_ks:',val_ks)
    
    y_pred = model.predict_proba(offx)[:,1]
    fpr_off, tpr_off, _ = roc_curve(offy,y_pred)
    off_ks = abs(fpr_off-tpr_off).max()
    print('off_ks:',off_ks)
    
    plt.plot(fpr_dev, tpr_dev, label='dev')
    plt.plot(fpr_val, tpr_val, label='val')
    plt.plot(fpr_off, tpr_off, label='off')
    plt.plot([0,1],[0,1],'k--')
    plt.xlabel('False positive rate')
    plt.ylabel('True positive rate')
    plt.title('lr model ROC Curve')
    plt.legend(loc='best')
    plt.show()
    
# xgb模型
def xgb_model(x,y,valx,valy,offx,offy):
    model = xgb.XGBClassifier(learning_rate=0.05,
                              n_estimators=400,
                              max_depth=2,
                             min_child_weight = 1,
                             subsample=1,
                             nthread=-1,
                             scale_pos_weight=1,
                             random_state=1,
                             n_jobs=-1,
                             reg_lambda=300)
    model.fit(x,y)
    
    # dev
    y_pred = model.predict_proba(x)[:,1]
    fpr_dev, tpr_dev, _ = roc_curve(y,y_pred)
    dev_ks = abs(fpr_dev-tpr_dev).max()
    print('dev_ks:',dev_ks)
    
    y_pred = model.predict_proba(valx)[:,1]
    fpr_val, tpr_val, _ = roc_curve(valy,y_pred)
    val_ks = abs(fpr_val-tpr_val).max()
    print('val_ks:',val_ks)
    
    y_pred = model.predict_proba(offx)[:,1]
    fpr_off, tpr_off, _ = roc_curve(offy,y_pred)
    off_ks = abs(fpr_off-tpr_off).max()
    print('off_ks:',off_ks)
    
    plt.plot(fpr_dev, tpr_dev, label='dev')
    plt.plot(fpr_val, tpr_val, label='val')
    plt.plot(fpr_off, tpr_off, label='off')
    plt.plot([0,1],[0,1],'k--')
    plt.xlabel('False positive rate')
    plt.ylabel('True positive rate')
    plt.title('xgb model ROC Curve')
    plt.legend(loc='best')
    plt.show()

定义模型函数的使用函数,在函数中分别进行正向调用和逆向调用,验证模型的效果上限。如逆向模型训练集KS值明显小于正向模型训练集KS值,说明当前时间外样本分布与开发样本差异较大,需要重新划分样本集。

start_train(data_woe_psi_std,target='bad_ind', exclude=feature_drop)

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

  • XGBoost的效果没有好于逻辑回归模型,因此特征不需要进行再组合;
  • 反向lr模型的结果没有显著好于正向调用的结果,因此该模型在当前特征空间下没有优化的空间;
  • lr正向训练和反向训练的ks值在5%以内,所以不需要调整时间稳定性较差的变量。
    计算训练集、测试集和验证集的ks、F1和auc值

7 计算指标评估模型,生成模型报告

 # 分别计算ks,F1和auc值
target = 'bad_ind'
lt = list(data_woe_psi_std.columns)
for i in feature_drop:
    lt.remove(i)
    
devv = data_woe_psi_std[data_woe_psi_std['samp_type']=='dev']
vall = data_woe_psi_std[data_woe_psi_std['samp_type']=='val']
offf = data_woe_psi_std[data_woe_psi_std['samp_type']=='off']
x,y=devv[lt], devv[target]
valx,valy = vall[lt],vall[target]
offx,offy = offf[lt], offf[target]
lr = LogisticRegression()
lr.fit(x,y)

prob_dev = lr.predict_proba(x)[:,1]
print('训练集')
print('F1:',F1(prob_dev,y))
print('KS:',KS(prob_dev,y))
print('AUC:',AUC(prob_dev,y))

prob_val = lr.predict_proba(valx)[:,1]
print('测试集')
print('F1:',F1(prob_val,valy))
print('KS:',KS(prob_val,valy))
print('AUC:',AUC(prob_val,valy))

prob_off = lr.predict_proba(offx)[:,1]
print('验证集')
print('F1:',F1(prob_off,offy))
print('KS:',KS(prob_off,offy))
print('AUC:',AUC(prob_off,offy))

# 验证集的模型PSI和特征PSI
print('模型PSI:', toad.metrics.PSI(prob_dev,prob_off))
print('特征PSI:\n', toad.metrics.PSI(x,offx).sort_values(0))

训练集
F1: 0.02962459026532253
KS: 0.40665138719594446
AUC: 0.7683462756870743
测试集
F1: 0.03395860284605433
KS: 0.3709553758048945
AUC: 0.723771920780572
验证集
F1: 0
KS: 0.38288372897789186
AUC: 0.7447410631197128
模型PSI: 0.3372146799079187
特征PSI:
credit_info 0.098585
act_info 0.124820
person_info 0.127210
dtype: float64

生成验证集的ks报告

toad.metrics.KS_bucket(prob_off, offy, bucket=15, method='quantile')

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

8 生成评分卡

# 用toad生成评分卡
card = ScoreCard(combiner=cmb,
                transer=woet, C=0.1,
                class_weight='balanced',
                base_score=600,
                base_odds=35,
                pdo=60,
                rate=2)
card.fit(x,y)
final_card = card.export(to_frame=True)
final_card

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
对训练集、测试集和验证集应用评分卡,预测用户的分数。这里要注意要传入原始数据,不要传入woe编码转化后和分箱后的数据。

# 评分卡进行预测
df_dev['score'] = card.predict(df_dev)
df_val['score'] = card.predict(df_val)
df_off['score'] = card.predict(df_off)
plt.hist(df_dev['score'], label = 'dev',color='blue', bins = 10)
plt.legend()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

plt.hist(df_val['score'], label = 'val',color='green', bins = 10)
plt.legend()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能

plt.hist(df_off['score'], label = 'off',color='orange', bins = 10)
plt.legend()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能
三组评分数据在一个图中

plt.hist(df_dev['score'], label = 'dev',color='blue', bins = 10)
plt.hist(df_off['score'], label = 'off',color='orange', bins = 10)
plt.hist(df_val['score'], label = 'val',color='green', bins = 10)
plt.legend()

使用toad库进行机器学习评分卡全流程,项目实战,机器学习,人工智能文章来源地址https://www.toymoban.com/news/detail-624843.html

到了这里,关于使用toad库进行机器学习评分卡全流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CRPS:贝叶斯机器学习模型的评分函数

    连续分级概率评分(Continuous Ranked Probability Score, CRPS)或“连续概率排位分数”是一个函数或统计量,可以将分布预测与真实值进行比较。 机器学习工作流程的一个重要部分是模型评估。这个过程本身可以被认为是常识:将数据分成训练集和测试集,在训练集上训练模型,并

    2023年04月15日
    浏览(38)
  • 如何使用Java进行机器学习?

    在Java中进行机器学习,可以使用各种开源机器学习库和框架来实现。以下是一些常用的Java机器学习库: Weka:Weka 是一个非常流行的机器学习库,提供了大量的算法和工具,以及用于数据预处理、特征选择和可视化的功能。 Deeplearning4j:Deeplearning4j 是一个用于深度学习的开源

    2024年02月10日
    浏览(39)
  • 机器学习任务中使用计算图构建和训练模型的流程

    The goal is to encourage the project team to think more long-term and not judge success solely based on tactical results. This requires a shift in mindset to prioritize strategic thinking and understanding the bigger picture. It involves reevaluating the current perspective and approach to ensure that decisions and actions align with long-term goals and obje

    2024年02月10日
    浏览(38)
  • 机器学习9:使用 TensorFlow 进行特征组合编程实践

    在【机器学习6】这篇文章中,笔者已经介绍过环境准备相关事项,本文对此不再赘述。本文将通过编程案例来探索特征组合(Feature Crosses)对模型训练的影响,加深对上一篇文章(机器学习8)的理解。 经度和纬度可以作为独立特征训练模型以预测当地房价。同时,我们也可

    2024年02月11日
    浏览(39)
  • Python小知识 - 如何使用Python进行机器学习

    如何使用Python进行机器学习 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 机器学习是人工智能的一个分支,是让计算机自动“学习”。学习的过程是从经验E中获得知识K。经验E可以是一个数据集,比如一个图像数据集。知识K可以是计算机自动从图像数

    2024年02月09日
    浏览(39)
  • WinUI(WASDK)使用HelixToolkit加载机器人3D模型并进行项目实践

    本人之前开发了一个叫电子脑壳的上位机应用,给稚晖君ElectronBot开源机器人提供一些功能,但是由于是结合硬件才能使用的软件,如果拥有硬件的人员太少,就会导致我的软件没什么人用,于是我就想着能不能将机器人硬件的模型加载到软件里,这样用户就可以不使用硬件

    2024年02月08日
    浏览(119)
  • 使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习

    随着技术进步,尤其是地理信息系统 (GIS) 工具的进步,可以更有效地对土地利用进行分类。分类的使用可用于识别植被覆盖变化、非法采矿区和植被抑制区域,这些只是土地利用分类的众多示例中的一部分。 分类的一大困难是确定要解决的问题的级别。我分类的目的是什么

    2023年04月25日
    浏览(49)
  • 机器学习16:使用 TensorFlow 进行神经网络编程练习

    在【机器学习15】中,笔者介绍了神经网络的基本原理。在本篇中,我们使用 TensorFlow 来训练、验证神经网络模型,并探索不同 “层数+节点数” 对模型预测效果的影响,以便读者对神经网络模型有一个更加直观的认识。 目录 1.导入依赖模块 2.加载数据集 3.表示数据

    2024年02月12日
    浏览(38)
  • R语言---使用runway进行机器学习模型性能的比较

    R语言—使用runway进行机器学习模型性能的比较

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包