信贷决策问题 —— 基于国赛-19C的数据挖掘练习

 引言

        信贷决策问题,即银行通过对企业的账本进行分析,给企业划定模糊的信誉等级,进而决定是否为企业进行放贷,和放贷的金额。

          19年国赛C题所给企业数据量庞大,在数据分析时,单纯采用Excel会比较繁琐 ,因此我想到了通过Python的Numpy和Pandas两个第三方库进行数据处理,然后通过Scikt-learn(机器学习)第三方库对数据进行分析。

  Step1: 数据处理和指标制定

        对于数据的处理,主要是统计一些将要用到的指标:各个企业的进项总量,销项总量,净利润,废票数量,企业生存年限等。单纯针对账目难以分析,因此先制定指标,这些指标本质而言就是特定数据的统计量,通过分析统计量以达到分析账本的目的。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

## 数据初始化
# 企业信息
data_1 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\附件1.xlsx','企业信息')
# 进项发票信息
data_2 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\附件1.xlsx','进项发票信息')
# 销项发票信息
data_3 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\附件1.xlsx','销项发票信息')
# 企业评级数据
rate = [] # 用于记录评级数据
for i in range(123):
    if data_1.iloc[i,2] == 'A':
        rate.append(4)
    elif data_1.iloc[i,2] == 'B':
        rate.append(3)
    elif data_1.iloc[i,2] == 'C':
        rate.append(2)
    elif data_1.iloc[i,2] == 'D':
        rate.append(1)
rate = pd.DataFrame(rate)
rate.to_excel('rate.xlsx')
# 有效发票和作废发票
data_2valid = data_2.loc[data_2['发票状态'] == '有效发票',:]
data_2invalid = data_2.loc[data_2['发票状态'] == '作废发票',:]
data_3valid = data_3.loc[data_3['发票状态'] == '有效发票',:]
data_3invalid = data_3.loc[data_3['发票状态'] == '作废发票',:]
# 有效票各企业价税合计总值统计
data2_total = [] # 记录各企业进项发票的价税合计的总值
data3_total = [] # 记录各企业销项发票的价税合计的总值 
for i in range(1,124):
    data = data_2valid.loc[data_2valid['企业代号'] == 'E'+str(i),['价税合计']]
    sum_per = sum(data.iloc[:,[0]].values)
    data2_total.append(sum_per)
for j in range(1,124):
    data = data_3valid.loc[data_3valid['企业代号'] == 'E'+str(j),['价税合计']]
    sum_per = sum(data.iloc[:,[0]].values)
    data3_total.append(sum_per)
data3_total[107] = np.array([0])
data2_total = pd.DataFrame(data2_total)
data3_total = pd.DataFrame(data3_total)
data2_total.to_excel('data1.xlsx') # 写入各企业进项总数据
data3_total.to_excel('data2.xlsx') # 写入各企业销项总数据
data2_total_mat = np.mat(data2_total.values)
data3_total_mat = np.mat(data3_total.values)
data4_valid = (data3_total_mat - data2_total_mat) / data3_total_mat
data4_valid = pd.DataFrame(data4_valid)
data5_valid = data2_total_mat - data3_total_mat
data5_valid = pd.DataFrame(data5_valid)
data5_valid.to_excel('data4.xlsx') # 周转资金数据
data4_valid.to_excel('data3.xlsx') # 写入各企业进销项差额总数据
# 废票数据处理
data2_waste_total = []
data3_waste_total = []
for i in range(1,124):
    data = data_2invalid.loc[data_2invalid['企业代号'] == 'E'+str(i),['价税合计']]
    sum_per = sum(data.iloc[:,[0]].values)
    data2_waste_total.append(sum_per)
for j in range(1,124):
    data = data_3invalid.loc[data_3invalid['企业代号'] == 'E'+str(j),['价税合计']]
    sum_per = sum(data.iloc[:,[0]].values)
    data3_waste_total.append(sum_per)
for k in range(1,123):
    if type(data2_waste_total[k]) == int:
        data2_waste_total[k] = np.array([0])        
data3_waste_total[107] = np.array([0])
data2_waste_total = pd.DataFrame(data2_waste_total)
data3_waste_total = pd.DataFrame(data3_waste_total)  
data2_waste_total_mat = np.mat(data2_waste_total.values)
data3_waste_total_mat = np.mat(data3_waste_total.values)
data6_mat = data2_waste_total_mat + data3_waste_total_mat
data6 = pd.DataFrame(data6_mat)
data6.to_excel('waste.xlsx') 

Step2: 基于熵权法的TOPSIS对各企业进行赋分

        将指标整合成一张Excel表格,并对负向指标进行正向化处理,直接输入程序作为TOPSIS分析的原始数据。本题基于熵权法确定各指标的权重,熵权法本质是分析数据的熵变,熵变越大的数据权重越大,我感觉在信贷问题分析中是贴合实际的。

from sklearn.impute import SimpleImputer
# 导入数据
data = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\TOPSISdata.xlsx')
label_need = data.keys()[1:] # 得到数据的变量名
data1 = data[label_need].values # 得到数据矩阵
[m,n] = data1.shape # 计算行数和列数
# 数据标准化
data2 = data1.astype('float')
for j in range(0,n):
    data2[:,j] = data1[:,j]/np.sqrt(sum(np.square(data1[:,j])))
data2[:,[5]] = data1[:,[5]]
for i in range(123):
    for k in range(6):
        if data2[i,k] < 0:
            if max((data1[:,[k]]))- min(data1[:,[k]]):
                data2[i,k] = 0.01
            else:
                data2[i,k] = (data1[i,k]-min(data1[:,[k]]))/(max((data1[:,[k]]))- min(data1[:,[k]]))
imp = SimpleImputer(missing_values=np.nan,strategy='mean') # 处理nan值
imp.fit(data2)
data2 = imp.transform(data2)
# 熵权法计算权重
p = data2
for j in range(0,n):
    p[:,j] = data2[:,j]/sum(data2[:,j])
E = data2[0,:]
for j in range(0,n):
    E[j] = -1/np.log(m)*sum(p[:,j]*np.log(p[:,j]+1e-5)) # 求信息熵
w = (1-E)/sum(1-E)
# 得到加权后的数据
R = data2*w
# 得到最大值最小值距离
r_max = np.max(R, axis=0)  #每个指标的最大值
r_min = np.min(R,axis=0)   #每个指标的最小值
d_z = np.sqrt(np.sum(np.square((R -np.tile(r_max,(m,1)))),axis=1))  #d+向量
d_f = np.sqrt(np.sum(np.square((R -np.tile(r_min,(m,1)))),axis=1))  #d-向量  
# 得到评分
s = d_f/(d_z+d_f)
Score = 100*s/max(s)
score = pd.DataFrame(Score)
score.to_excel('score_problem.xlsx')
# 绘制得分图像
x = range(1,124)
plt.plot(x,Score)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.title('得分曲线')
plt.xlabel('企业代号')
plt.ylabel('得分')

Step3: 基于线性回归和随机搜索法的利率确定

        基于TOPSIS得分分配贷款,计算公式为贷款总量乘以TOPSIS归一化得分,难点在于确定利率。题目给出了利率与客户流失率的数据表,银行的目的在于利息最大化。给出一个利息的计算公式:贷款额度*利率*(1-客户流失率)。因此,需要求得每家企业利息的最大值。利率与客户流失率的关系可根据数据通过一元线性回归拟合确定,不是难点。难点在于利息最优解的确定。公式为一个关于r的一元函数,不难计算最值,但是计算123家企业的利息,工作量还是很大的。因此可以借助Python,采用随机搜索法确定利息的最大值,输出利率,储存在Excel表格中。

# 随机搜索法求解利息最大时的利率
P = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\贷款额度.xlsx',header = None).values
def scope(k):
    s = 0 # while循环计数工具
    N = 1000 # while循环终止计数条件
    i = 1 # 索引计数工具
    fx = [] # 用于存储搜索过的函数值
    min_fx = [] # 用于储存fx的最小值
    r = np.random.random()
    while s<N:
        r0 = 0.11*np.random.random()+0.04  # 生成0.04-0.15之间的随机数
        obj = P[k,1]*r*(1-c_x*r-c_b)
        fx.append(obj[0,0]) 
        min_fx.append(min(fx))
        s = s+1
        if i == 1:
            r = r0
        else:
            if min_fx[i-1]<min_fx[i-2]:
                r = r0   # 更新最优的r
                s = 0
            else:
                s = s+1
        i = i+1
    #fx_min = min_fx[-1]
    return r
r_store = [] # 用于存储各企业的利率
fxmin_store = [] # 存储利息最小值
for k in range(123):
    r = scope(k)
    r_store.append(r)
r_store = pd.DataFrame(r_store)
r_store.to_excel('利率表.xlsx')

Step4: 逻辑回归与BPAdaboost网络确定信誉等级

        第二问有302家企业的信誉等级需要预测,首先通过逻辑回归粗预测是否放贷,接着通过预测准确率更高的Adaboost对企业的信誉等级进行预测,指标采用第一问所确定的指标,训练样本为第一问中的123家企业的数据。

rate = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\rate.xlsx').iloc[:,[1]]
total_in = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data1.xlsx').iloc[:,[1]]
total_out = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data2.xlsx').iloc[:,[1]]
total_dis = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data4.xlsx').iloc[:,[1]]
total = np.hstack((rate,total_in,total_out,total_dis))
LR_test_code = [10,20,30,50,70,90,100,110,120,122] # 测试集代号
LR_train_code = [] # 训练集代号
for i in range(123):
    if i in LR_test_code:
        continue
    else:
        LR_train_code.append(i)
x = total[LR_train_code,[1,2,3]]
y = total[LR_train_code,[0]]
x1 = total[LR_test_code,[1,2,3]]
y1 = total[LR_test_code,[0]]
from sklearn.linear_model import LogisticRegression as LR
lr = LR()
lr.fit(x,y)
r = lr.score(x,y)
R = lr.predict(x1)
R = pd.DataFrame(R)
R = R.iloc[:,[0]]

# BPAdaboost神经网络预测
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

rate = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\rate.xlsx').iloc[:,[1]]
total_in = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data1.xlsx').iloc[:,[1]]
total_out = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data2.xlsx').iloc[:,[1]]
total_dis = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data4.xlsx').iloc[:,[1]]
total_waste = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\waste.xlsx').iloc[:,[1]]
total = np.hstack((rate,total_in,total_out,total_dis,total_waste))
LR_test_code = [10,20,30,50,70,90,100,110,120,122] # 测试集代号
LR_train_code = [] # 训练集代号
for i in range(123):
    if i in LR_test_code:
        continue
    else:
        LR_train_code.append(i)
x = total[LR_train_code,1:]
y = total[LR_train_code,[0]]
x1 = total[LR_test_code,1:]
y1 = total[LR_test_code,[0]]
AB = AdaBoostClassifier(n_estimators=1000)
AB.fit(x,y)
predict_results = AB.predict(x1)
print(accuracy_score(predict_results, y1))
conf_mat = confusion_matrix(y1, predict_results)
print(conf_mat)
print(classification_report(y1, predict_results))
# 预测
total_in2 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data11.xlsx').iloc[:,[1]]
total_out2 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data22.xlsx').iloc[:,[1]]
total_dis2 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\data33.xlsx').iloc[:,[1]]
total_waste2 = pd.read_excel(r'C:\Users\Dave Young\Desktop\C\waste_problem2.xlsx').iloc[:,[1]]
x2 = np.hstack((total_in2,total_out2,total_dis2,total_waste2))
predict_result_total = AB.predict(x2)
wanted = pd.DataFrame(predict_result_total)
wanted.to_excel('预测结果.xlsx')

Step5: 传染病模型确定受疫情影响的企业比例

        第三问,需要考虑疫情等外界因素影响调整贷款政策,这一问大部分工作量需要人为操作。但是依然可以通过程序仿真模拟会受到影响的企业比例,从而更好地确定需要调整贷款额度或利率的企业。我采用的是传染病模型,将疫情的影响抽象为感染率和康复率,将外界因素影响简化。当传染病模型中的感染者和易感者比例不在变化时,此时的感染者比例就是我想要的易受疫情影响的企业的比例。此处再做一个假设,是否受到影响可以由TOPSIS评分高低直接判定。因此,从下往上,取相应比例的企业。这类企业便是需要调整贷款和利率的对象。要么,降低贷款额度;要么,提高这部分企业的利率。

# 通过传染病模型模拟一段时间后动态平衡时收到疫情影响的企业比例
N = 24  # 总人数
T = 70 # 模拟70天的变化情况
s = np.zeros([T]) # 易感者者的比例随天数的变化矩阵
i = np.zeros([T]) # 感染者的比例随天数的变化矩阵
lamda = 0.8 # 感染率
gamma = 0.2 # 治疗率
i[0] = 4.0 / N # 初始化感染者比例,初始化4家收到疫情影响的企业
s[0] = 1-i[0] # 初始化易感者比例,剩下的所有企业都是易受影响的企业
for t in range(T-1):
    i[t+1] = i[t] + i[t] * (1- i[t])* lamda - i[t] * gamma
    s[t+1] = 1 - i[t+1]        
# 绘图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(8,4))
ax.plot(i, c='r')
ax.plot(s, c='b')
ax.set_xlabel('天数',fontsize=10)
ax.set_ylabel('受疫情比例', fontsize=10)
ax.grid(1)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: resnet50-19c8e357是一个神经网络模型,它是ResNet-50的一个特定版本。离线指的是该模型在无需连接互联网的情况下使用。 离线使用意味着我们可以将该模型下载到本地设备,并在没有网络连接的情况下使用它。这对于一些应用场景是非常方便的,特别是当我们需要对大量数据进行快速的神经网络处理时。例如,在移动设备上使用离线模型进行图像分类、目标检测或者人脸识别等任务,可以减少对网络带宽和延迟的依赖。 通过将ResNet50-19c8e357离线,我们可以将模型及其相关参数保存在本地,并直接从本地加载模型,而无需每次都下载模型。这样做的好处是可以节省时间和资源,并提高应用的响应速度。 离线模型的使用步骤通常是将模型下载到本地存储设备,然后在需要使用模型的应用程序中加载模型。在加载模型后,我们可以通过输入数据,如图像或文本,来调用模型进行推断。该模型将根据其之前在训练集中学习到的模式和特征来预测或分析输入数据。 总结而言,resnet50-19c8e357离线指的是该模型不需要互联网连接即可在本地设备上使用。这种离线使用的优点包括方便、节省时间和资源,并提高应用程序的响应速度。 ### 回答2: resnet50-19c8e357 离线指的是 ResNet50 模型的一个特定版本在离线环境中被使用。ResNet50 是一个深度学习模型,用于图像分类和目标识别任务。它是由微软研究院提出的,并在2015年的 ILSVRC (ImageNet Large Scale Visual Recognition Challenge)竞赛中获得了第一名。 19c8e357 是 resnet50 模型的一个特定版本的标识符,用于区分不同的模型版本。每个模型版本可能有稍微不同的架构或参数设置。 当说 resnet50-19c8e357 离线时,意味着该特定版本的 ResNet50 模型不需要联网或从互联网下载模型权重文件来运行。相反,模型的权重参数已经存储在本地设备上并可以直接加载进行使用。这对于一些应用场景来说是非常有用的,因为离线模型可以在没有网络连接或者计算资源受限的情况下进行预测。 离线模型对于一些实时要求较高的应用也很重要,例如移动设备上的实时物体识别。通过将模型存储在本地设备上,可以有效减少网络延迟,并且可以在设备上快速进行推断。另外,离线模型还可以提供更高的隐私保护,因为数据不需要通过网络上传到云端进行计算。 总而言之,resnet50-19c8e357 离线表示一个 ResNet50 模型的特定版本,在无需联网的情况下,直接从本地设备上加载模型权重进行图像分类和目标识别任务。这种离线模型对于资源受限或实时性要求高的应用非常有用。 ### 回答3: resnet50-19c8e357离线是指resnet50-19c8e357模型可以在离线环境下使用,即不需要连接到互联网也可以使用该模型。离线使用模型的好处是可以在没有网络连接的情况下进行推理和预测,增加了模型的灵活性和适用性。 通常,在使用离线模型之前,我们需要确保已经成功下载和保存了resnet50-19c8e357模型的文件。离线使用模型时,我们可以加载模型文件并将其应用于需要进行预测或分类的图像。 离线使用resnet50-19c8e357模型可以在图像识别、目标检测等任务中发挥作用。我们可以将输入图像传递给模型进行处理,并得到模型对于图像的预测结果。通过使用离线模型,我们可以在没有网络连接的情况下对图像进行处理,提高了模型的灵活性和可用性。 然而,离线使用模型也有一些限制。由于模型需要在设备上加载和执行,因此模型的大小和计算复杂度可能会受到限制。较大的模型可能需要更多的存储空间和计算资源来进行推理。此外,在离线环境中使用模型时,我们需要确保设备有足够的内存和处理能力来加载和执行模型。 总而言之,resnet50-19c8e357离线是指可以在没有网络连接的情况下使用resnet50-19c8e357模型进行图像处理和预测。离线使用模型提供了更大的灵活性和适用性,但也需要考虑设备的存储和计算资源的限制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kummunist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值