测试模型
既然已经训练出来一个模型(公式)了 那么我要验证下这个公式的准确性 根据准确性来判断这个模型是否合理,若不合理 我调整训练参数再进行训练得到新的模型
y_pred = lgr.predict_proba(X_test)[:,1] 调用逻辑回归的预测的函数 将X_test测试数据作为参数 得到每个测试数据和对应的预测结果的概率 预测结果有0,1区分(具体0,1代表什么含义根据业务来定义 比如0表示未还款,1=表示已还款) 比如0.01539811 表示 这个人还款的概率为 0.01539811 设置一个阈值是0.22 那么 0.01539811<0.22 就认为0.01539811这个概率表示不还款 [:,1]表示筛选数据表的所有行 选择第二列数据 即获取预测结果为已还款的数据
这个是每条测试数据对应的还款的概率 假设设置一个阈值为0.22 即大于表示还款,小于表示不还款 那么第一个 0.0117612<0.22就表示0.0117612为不还款
上面显示进行训练数据的训练得到一个模型 然后让模型去预测测试数据得到一个预测结果 然后再拿着实际的数据和预测数据进行比对 画roc曲线、计算ks、计算auc面积等就是为了验证预测结果和实际结果的差别
from sklearn.metrics import roc_curve,auc # 计算ks和auc def ks_perf(actuals,predictions): fpr,tpr,threshold = roc_curve(actuals,predictions) auc_ = auc(fpr,tpr) ks_ = max(tpr-fpr) print(auc_,ks_) actuals是实际的是否还款即因变量数据 predictions 是模型预测的是否还款因变量数据
根据fpr和tpr可以计算auc面积( 横轴是fpr纵轴是tpr 曲线(roc曲线)和x轴之间的面积)
根据2个数据集可以画roc曲线 得到 fpr(真正例率tpr,假正例率fpr,阈值threshold) 横轴是阈值threshold 纵轴是fpr和tpr 同一个阈值 tpr rate - fpr rate 值即是ks曲线 Ks指标越大 模型的风险区分能力越强 ROC曲线上的每一个点代表一个阈值 ROC曲线坐标系(0,0) 阈值最大 (1,1)阈值最小 从这两张图也可以看得出来
调用这个ks_perf函数 传入测试数据集(实际数据)、模型预测结果集 计算auc和ks值
ROC的值越大越好 取值范围是0.5-1之间
Ks值 0.2-0.3基本可用 ,0.3以上可用
将预测结果放入数据表中
根据上一步的流程来判断模型预测的结果怎么样 看来模型预测效果还不错
那么就把这个预测结果放入数据表中
test['prob'] = y_pred # 获取指定列的数据 test_oos = test[['uid', 'prob', 'target']] # 生成excel文件 test_oos.to_excel('score_oos.xlsx', index = False) index=False 不生成表格每行数据最前面的序号列
计算f1
上面是根据测试数据集对应的自变量的还款概率多少来计算ks和auc 这里根据测试数据集对应的因变量 target(实际和预测)来计算f1 因为y_pred这一列数据为测试数据集根据模型预测产生的还款概率数据 那么设置一个阈值 比如0.22 大于该值表示还款 设置为1 小于该值表示不还款设置为0 那么根据y_pred就可以产生一个预测的traget
# 设置一个0.22阈值 来计算f1值 调整阈值大小 目的是为了得到一个最大的f1值 test_oss['target_new'] = test_oos['prob'].map(lambda x: 1 if x > 0.22 else 0) # 实际因变量和预测的因变量 f1_score(test_oss['target'],test_oss['target_new'])
对推断集进行预测
和上面的过程一致 不就细说了 # 获取推断数据集newuser中的所有的自变量特征数据 x_inference = newuser[var_all] # 调用逻辑回归的预测函数 获取还款概率 y_inference = lgr.predict_proba(x_inference)[:, 1] newuser['prob'] = y_inference result = newuser[['uid', 'prob']] # 设置一个阈值 将还款概率转换为0(不还款),1(还款)即二分类问题 result['pred_label'] = result['prob'].map(lambda x: 1 if x > 0.22 else 0) result = result[['uid', 'pred_label']] result.to_excel('newuser_prob.xlsx', index = False)