金融风控-->客户流失预警模型-->神经网络建模
来源:互联网 发布:qq显示网络状态准确吗 编辑:程序博客网 时间:2024/05/21 08:56
上一篇博文中,我们对金融数据建立了GBDT模型。这篇博文将利用深度学习框架pytorch对金融数据建立一个人工神经网络模型。
有关人工神经网络的详细介绍请看我的另外一篇博文人工神经网络。
人工神经网络数据预处理:
不能有缺失值
移除常量型特征(即这个特征的最大值和最小值相等)
不能接受非数值形式的输入,字符型变量需要编码:
- One hot编码
- Dummy编码
- 浓度编码
变量归一化/标准化
人工神经网络中的参数设置:
- 输入层节点个数
- 隐藏层层数
- 隐藏层节点个数
- 隐藏层联接状态
- 激活函数
- 损失函数
- 学习速率
- 迭代次数
模型的效果
AUC score,超过0.7为佳,越大说明效果越好
调参时,可以选择AUC最高的一组参数
下面是代码部分,这里我们只用一个隐藏层,只调了隐藏层神经元个数,dropOut这两个参数。其他参数调优类似。
#coding:utf-8import pandas as pdimport numpyimport torchfrom torch.autograd import Variableimport torch.nn.functional as Fimport torch.nn as nnfrom sklearn import metricsimport torch.utils.data as Datafrom sklearn.model_selection import train_test_splitimport operatormodelData = pd.read_csv('modelData.csv', header = 0)allFeatures = list(modelData.columns)#remove the class label and cust id from featuresallFeatures.remove('CUST_ID')allFeatures.remove('CHURN_CUST_IND')modelData2 = modelData.copy()#normalize the features using max-min to convert the values into [0,1] intervaldef MaxMinNorm(df,col): ma, mi = max(df[col]), min(df[col]) rangeVal = ma - mi if rangeVal == 0: print col df[col] = df[col].map(lambda x:(x-mi)*1.0/rangeVal)for numFeatures in allFeatures: MaxMinNorm(modelData2, numFeatures)#we need to remove columns of 'TELEBANK_ALL_TX_NUM', 'RATIO_21' since they are constantsallFeatures.remove('TELEBANK_ALL_TX_NUM')allFeatures.remove('RATIO_21')x_train, x_test, y_train, y_test = train_test_split(modelData2[allFeatures],modelData2['CHURN_CUST_IND'], test_size=0.4,random_state=9)train_x=x_train.valuestrain_y=y_train.valuestensor_x=torch.from_numpy(train_x)tensor_y=torch.from_numpy(train_y)torch_dataset=torch.utils.data.TensorDataset(data_tensor=tensor_x,target_tensor=tensor_y)Batch_size=1500train_loader=torch.utils.data.DataLoader( dataset=torch_dataset, batch_size=Batch_size, shuffle=True, num_workers=2,)x=Variable(torch.from_numpy(train_x)).type(torch.FloatTensor)y=Variable(torch.from_numpy(train_y)).type(torch.LongTensor)test_x=x_test.valuesV_test_x=Variable(torch.from_numpy(test_x)).type(torch.FloatTensor)test_y=y_test.valuesclass Net(torch.nn.Module): def __init__(self,n_feature,n_hidden,n_output,drop_out): super(Net,self).__init__() self.hidden=torch.nn.Linear(n_feature,n_hidden) torch.nn.Dropout(drop_out) self.predict=torch.nn.Linear(n_hidden,n_output) def forward(self, x): x=F.relu(self.hidden(x)) x=self.predict(x) return x## 只有一个隐藏层,这里挑选一个在auc上效果最好的隐藏层的神经元个数hidden_units_selection={}for hidden_units in range(10,101,10): net=Net(n_feature=174,n_hidden=800,n_output=2,drop_out=0.5) optimizer=torch.optim.Adam(net.parameters(),lr=0.01) ##loss_func=nn.CrossEntropyLoss(weight=torch.FloatTensor([1,35])) loss_func=nn.CrossEntropyLoss() for epoch in range(200): for step,(b_x,b_y) in enumerate(train_loader): batch_x=Variable(b_x).type(torch.FloatTensor) batch_y=Variable(b_y).type(torch.LongTensor) out=net(batch_x) loss=loss_func(out,batch_y) optimizer.zero_grad() loss.backward() optimizer.step() if epoch%5==0: ##F.softmax(out)得出二维的概率值,表示每个样本在0类,1类上概率值,是个Variabel类型 # 1表示在列这个维度上得出每行的最大值,返回最大值和在这个行上的位置index local pred = net(V_test_x) ## 将Variabel 类型转成numpy类型 clf_pred_proba=F.softmax(pred).data.numpy() ## 取每个样本为类别1的概率 pred_proba=[i[1] for i in clf_pred_proba] auc_score=metrics.roc_auc_score(test_y,pred_proba) print('Epoch: ', epoch, '| roc_auc_score: %.4f' % auc_score) pred = net(V_test_x) clf_pred_proba=F.softmax(pred).data.numpy() pred_proba=[i[1] for i in clf_pred_proba] auc_score=metrics.roc_auc_score(test_y,pred_proba) hidden_units_selection[hidden_units]=auc_scorebest_hidden_units=max(hidden_units_selection.iteritems(),key=operator.itemgetter(1))[0]## 只有一个隐藏层,这里挑选一个在auc上效果最好的dropOutdrop_out_selection={}for drop_out in numpy.linspace(0,0.99,100): net=Net(n_feature=174,n_hidden=best_hidden_units,n_output=2,drop_out=drop_out) optimizer=torch.optim.Adam(net.parameters(),lr=0.01) ##loss_func=nn.CrossEntropyLoss(weight=torch.FloatTensor([1,35])) loss_func=nn.CrossEntropyLoss() for epoch in range(200): for step,(b_x,b_y) in enumerate(train_loader): batch_x=Variable(b_x).type(torch.FloatTensor) batch_y=Variable(b_y).type(torch.LongTensor) out=net(batch_x) loss=loss_func(out,batch_y) optimizer.zero_grad() loss.backward() optimizer.step() if epoch%5==0: pred = net(V_test_x) clf_pred_proba=F.softmax(pred).data.numpy() pred_proba=[i[1] for i in clf_pred_proba] auc_score=metrics.roc_auc_score(test_y,pred_proba) print('Epoch: ', epoch, '| roc_auc_score: %.4f' % auc_score) pred = net(V_test_x) clf_pred_proba=F.softmax(pred).data.numpy() pred_proba=[i[1] for i in clf_pred_proba] auc_score=metrics.roc_auc_score(test_y,pred_proba) drop_out_selection[drop_out]=auc_scorebest_drop_out=max(drop_out_selection.iteritems(),key=operator.itemgetter(1))[0]
阅读全文
0 0
- 金融风控-->客户流失预警模型-->神经网络建模
- 金融风控-->客户流失预警模型-->GBDT建模
- 金融风控-->客户流失预警模型-->金融数据分析
- 金融风控-->客户流失预警模型-->特征工程
- 客户流失模型
- 客户流失预警(Predicting customer churn with scikit-learn)
- 金融风控-->申请评分卡模型-->logisticRegression建模
- 数据挖掘案例:建立客户流失模型
- Cox模型分析客户流失时间
- 数据挖掘案例:建立客户流失模型
- 决策树算法建立电信客户流失模型
- 商业银行建立客户流失预测模型的方法研究
- KNIMI数据挖掘建模与分析系列_004_利用KNIMI做客户流失预测
- 潜在客户流失排查
- 流失客户表
- 如何用Python和深度神经网络发现即将流失的客户?
- 流失预测模型
- 抽丝剥茧谈CRM:客户获取、客户转化、客户流失、客户流失挽回
- Java 动态代理2
- CentOS 7 使用阿里云的yum源
- jquery ui datetimepicker 弹出方向
- Spring AOP 注解实现
- csdn如何转载
- 金融风控-->客户流失预警模型-->神经网络建模
- Spring AOP XML配置实现
- Spring + jdbc +connection pool + transaction
- Python+Selenium--断言
- 水题 第四站 HDU A + B Problem II
- 索引类型
- HM模型学习(一)
- HBbase单机快速入门环境搭建
- Spring 事务传播属性