python--银行反欺诈模型--建立模型和模型检验

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split,KFold,cross_val_predict
loans=pd.read_csv("cleaned_loans2007.csv")
lr=LogisticRegression()
cols=loans.columns
train_cols=cols.drop("loan_status")#除掉label的剩下的特征
features=loans[train_cols]
target=loans["loan_status"]
kf=KFold(features.shape[0],random_state=1)#KFold就是将数据折成几折的
predictions=cross_val_predict(lr,features,target,cv=kf)#这个函数就是带入模型,类别和特征,还有将数据折成几折
predictions=pd.Series(predictions)
predictions
#算出混淆矩阵
fp_filter=(predictions==1)&(loans["loan_status"]==0)
fp=len(predictions[fp_filter])
fn_filter=(predictions==0)&(loans["loan_status"]==1)
fn=len(predictions[fn_filter])
tp_filter=(predictions==1)&(loans["loan_status"]==1)
tp=len(predictions[tp_filter])
tn_filter=(predictions==0)&(loans["loan_status"]==0)
tn=len(predictions[tn_filter])
tpr=tp/float(tp+fp)
fpr=fp/float(fp+tn)
print(tpr)
print(fpr)
#发现两个概率都很高,由于类别中1的样本比较多,0的样本较少,样本分配不均衡,所以要分配权重

lr=LogisticRegression(class_weight="balance")#通过参数调整权重,1和0的样本数量差不多
kf=KFold(features.shape[0],random_state=1)
predictions=cross_val_predict(lr,features,target,cv=kf)
predictions=pd.Series(predictions)
predictions
#算出混淆矩阵
fp_filter=(predictions==1)&(loans["loan_status"]==0)
fp=len(predictions[fp_filter])
fn_filter=(predictions==0)&(loans["loan_status"]==1)
fn=len(predictions[fn_filter])
tp_filter=(predictions==1)&(loans["loan_status"]==1)
tp=len(predictions[tp_filter])
tn_filter=(predictions==0)&(loans["loan_status"]==0)
tn=len(predictions[tn_filter])
#比率
tpr=tp/float(tp+fp)
fpr=fp/float(fp+tn)
#发现tpr的值仍然不高,但是也得到了较好的改善

#由于模型的权重参数是可调的,我们将0这类和1这类的样本权重调为10:1,通过字典的方式
a={01011}
lr=LogisticRegression(class_weight=a)#通过参数调整权重,1和0的样本数量差不多
kf=KFold(features.shape[0],random_state=1)
predictions=cross_val_predict(lr,features,target,cv=kf)
predictions=pd.Series(predictions)
predictions
#算出混淆矩阵
fp_filter=(predictions==1)&(loans["loan_status"]==0)
fp=len(predictions[fp_filter])
fn_filter=(predictions==0)&(loans["loan_status"]==1)
fn=len(predictions[fn_filter])
tp_filter=(predictions==1)&(loans["loan_status"]==1)
tp=len(predictions[tp_filter])
tn_filter=(predictions==0)&(loans["loan_status"]==0)
tn=len(predictions[tn_filter])
#比率
tpr=tp/float(tp+fp)
fpr=fp/float(fp+tn)
#发现权重项对结果的影响很大,但是结果仍然不理想

#也可以用随机森林的模型尝试
from sklearn.linear_model import RandomForestClassifier
from sklearn.model_selection import KFold,cross_val_predict
penalties={01011}
rf=RandomForestClassifier(class_weight=penalties,random_state=1)#通过参数调整权重,1和0的样本数量差不多
kf=KFold(features.shape[0],random_state=1)
predictions=cross_val_predict(lr,features,target,cv=kf)
predictions=pd.Series(predictions)
predictions
#算出混淆矩阵
fp_filter=(predictions==1)&(loans["loan_status"]==0)
fp=len(predictions[fp_filter])
fn_filter=(predictions==0)&(loans["loan_status"]==1)
fn=len(predictions[fn_filter])
tp_filter=(predictions==1)&(loans["loan_status"]==1)
tp=len(predictions[tp_filter])
tn_filter=(predictions==0)&(loans["loan_status"]==0)
tn=len(predictions[tn_filter])
#比率
tpr=tp/float(tp+fp)
fpr=fp/float(fp+tn)
#多使用其他的模型或者调整参数来让结果变得满意

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值