《Python金融大数据风控建模实战》 第11章 模型在线监控
本章引言
第9章介绍了在模型开发阶段的评估指标。模型完成开发后,如果其性能满足基本要求,就可以在生产环境中上线使用。在这个阶段仍然需要对模型指标进行评估,其目的在于判断模型的有效性,通过指标的判断给模型提供更新机制,即模型要使用多久,以及当哪些指标发生恶化后需要终止使用并重新开发新模型。模型评估指标决定了模型上线使用的生命周期。
Python代码实现及注释
# 第11章:模型在线监控
import os
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import variable_bin_methods as varbin_meth
import variable_encode as var_encode
from sklearn.metrics import confusion_matrix,recall_score, auc, roc_curve,precision_score,accuracy_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
import warnings
warnings.filterwarnings("ignore") ##忽略警告
##数据读取
def data_read(data_path,file_name):
df = pd.read_csv( os.path.join(data_path, file_name), delim_whitespace = True, header = None )
##变量重命名
columns = ['status_account','duration','credit_history','purpose', 'amount',
'svaing_account', 'present_emp', 'income_rate', 'personal_status',
'other_debtors', 'residence_info', 'property', 'age',
'inst_plans', 'housing', 'num_credits',
'job', 'dependents', 'telephone', 'foreign_worker', 'target']
df.columns = columns
##将标签变量由状态1,2转为0,1;0表示好用户,1表示坏用户
df.target = df.target - 1
##数据分为data_train和 data_test两部分,训练集用于得到编码函数,验证集用已知的编码规则对验证集编码
data_train, data_test = train_test_split(df, test_size=0.2, random_state=0,stratify=df.target)
return data_train, data_test
##离散变量与连续变量区分
def category_continue_separation(df,feature_names):
categorical_var = []
numerical_var = []
if 'target' in feature_names:
feature_names.remove('target')
##先判断类型,如果是int或float就直接作为连续变量
numerical_var = list(df[feature_names].select_dtypes(include=['int','float','int32','float32','int64','float64']).columns.values)
categorical_var = [x for x in feature_names if x not in numerical_var]
return categorical_var,numerical_var
def score_params_cal(base_point, odds, PDO):
##给定预期分数,与翻倍分数,确定参数A,B
B = PDO/np.log(2)
A = base_point + B*np.log(odds)
return A, B
def myfunc(x):
return str(x[0])+'_'+str(x[1])
##生成评分卡
def create_score(dict_woe_map,dict_params,dict_cont_bin,dict_disc_bin):
##假设Odds在1:60时对应的参考分值为600分,分值调整刻度PDO为20,则计算得到分值转化的参数B = 28.85,A= 481.86。
params_A,params_B = score_params_cal(base_point=600, odds=1/60, PDO=20)
# 计算基础分
base_points = round(params_A - params_B * dict_params['intercept'])
df_score = pd.DataFrame()
dict_bin_score = {
}
for k in dict_params.keys():
# k='duration_BIN'
# k = 'foreign_worker_BIN'
if k !='intercept':
df_temp = pd.DataFrame([dict_woe_map[k.split(sep='_woe')[0]]]).T
df_temp.reset_index(inplace=True)
df_temp.columns = ['bin','woe_val']
##计算分值
df_temp['score'] = round(-params_B*df_temp.woe_val*dict_params[k])
dict_bin_score[k.split(sep