• 银行分控模型的建立


    银行分控模型的建立

    一、Logistic回归模型:

    (一)Logistic回归建模步骤

    1. 根据分析目的设置指标变量(因变量和自变量),根据收集到的数据进行筛选

    2. 用ln(p/1-p)和自变量x1...xp列出线性回归方程,估计出模型中的回归系数

    3. 进行模型检验。模型有效性检验的函数有很多,比如正确率、混淆矩阵、ROC曲线、KS值

    4. 模型应用。

    (二)对某银行在降低贷款拖欠率的数据进行建模

    代码:

    #银行分控模型的建立
    # 逻辑回归 自动建模
    import pandas as pd  
    # 参数初始化
    filename=r'data\bankloan.xls' 
    data=pd.read_excel(filename)
    x=data.iloc[:,:8].values  #将数据的0-8列生成数组形式,用于后期进行训练模型(数据仅有8列)
    y=data.iloc[:,8].values #将数据的第8列生成数组形式,用于后期进行训练模型
    from sklearn.linear_model import LogisticRegression as LR #导入逻辑回归模型
    print(u'通过逻辑回归模型筛选特征结束。')
    data2=data.drop(u'违约',1)
    lr=LR() # 建立逻辑回归模型
    lr.fit(x,y) # 用筛选后的特征数据来训练模型
    print(u'逻辑回归模型训练结束')
    print(u'模型的平均正确率:%s'%lr.score(x,y))  # 给出模型的平均正确率为80.6%

    运行结果:

     逻辑回归本质上还是一种线性模型。筛选出来的特征并不一定就跟结果没有关系,只是它们之间有可能是非线性关系。在真实应用中,还是要根据问题的实际背景对筛选结果进行分析。对于非线性关系的特征筛选方法有决策树、神经网络等

    二、神经网络建模

    人工神经网络(Artificial Neural Networks, ANN),是模拟生物神经网络进行信息处 理的一种数学模型。它以对大脑的生理研究成果为基础,其目的在于模拟大脑的某些机理与 机制,实现一些特定的功能。

    人工神经网络的学习也称为训练,指的是神经网络在受到外部环境的刺激下调整神经网 络的参数,使神经网络以一种新的方式对外部环境作出反应的一个过程。在分类与预测中, 人工神将网络主要使用有指导的学习方式,即根据给定的训练样本,调整人工神经网络的参 数以使网络输出接近于已知的样本类标记或其他形式的因变量。

    代码:

    #神经网络预测
    import pandas as pd  
    import numpy as np
    # 参数初始化
    filename=r'data\bankloan.xls' 
    data=pd.read_excel(filename)
    x=data.iloc[:,:8].values
    y=data.iloc[:,8].values # 获取二分类数据
    from keras.models import Sequential
    from keras.layers.core import Dense, Activation
    
    model = Sequential()  # 建立模型
    model.add(Dense(input_dim = 8, units = 10))
    model.add(Activation('relu'))  # 用relu函数作为激活函数,能够大幅提供准确度
    model.add(Dense(input_dim = 18, units = 1))
    model.add(Activation('sigmoid'))  # 由于是0-1输出,用sigmoid函数作为激活函数
    model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
    # 编译模型。由于我们做的是二元分类,所以我们指定损失函数为binary_crossentropy,以及模式为binary
    # 另外常见的损失函数还有mean_squared_error、categorical_crossentropy等,请阅读帮助文件。
    # 求解方法我们指定用adam,还有sgd、rmsprop等可选
    
    model.fit(x, y, epochs = 1000, batch_size = 10)  # 训练模型,学习一千次
    
    predict_x=model.predict(x)
    classes_x=np.argmax(predict_x,axis=1)
    
    score  = model.evaluate(x,y,batch_size=10)  # 模型评估
    print(score)
    
    from cm_plot import * #导入自行编写的混淆矩阵可视化函数
    cm_plot(y,classes_x).show() #显示混淆矩阵可视化结果

    运行结果:

     

     三、聚类分析算法

     聚类分析仅根据样本数据本身将样本分组。其目标是实现组内的对象相互之间是相似的 (相关的),而不同组中的对象是不同的(不相关的)。组内的相似性越大,组间差别越大,聚类效果就越好。

    (一)聚类结果可视化的工具——TSNE

    TSNE 是 Laurens van der Maaten 和 Geoffrey Hintton 在 2008 年提出的,它的定位是高维 数据的可视化。我们总喜欢能够直观地展示研究结果,聚类也不例外。然而,通常来说输入 的特征数是高维的(大于3维),一般难以直接以原特征对聚类结果进行展示。而TSNE提供 了一种有效的数据降维方式,让我们可以在2维或者3维的空间中展示聚类结果。

    代码:

    #用TSNE进行数据降维并展示聚类结果
    import pandas as pd
    
    #参数初始化
    inputfile = r'data\bankloan.xls' #销量及其他属性数据
    outputfile = 'data_type.xls' #保存结果的文件名
    k = 3 #聚类的类别
    iteration = 500 #聚类最大循环次数
    data = pd.read_excel(inputfile, index_col = '年龄') #读取数据
    data_zs = 1.0*(data - data.mean())/data.std() #数据标准化
    
    
    if __name__ == '__main__':
        from sklearn.cluster import KMeans
        model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类,并发数4
        model.fit(data_zs) #开始聚类
    
        #简单打印结果
        r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目
        r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心
        r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
        r.columns = list(data.columns) + [u'类别数目'] #重命名表头
        print(r)
    
        #详细输出原始数据及其类别
        r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别
        r.columns = list(data.columns) + [u'聚类类别'] #重命名表头
        r.to_excel(outputfile) #保存结果
    
        # 用TSNE进行数据降维并展示聚类结果
        from sklearn.manifold import TSNE
    
        tsne = TSNE()
        tsne.fit_transform(data_zs) #进行数据降维
        tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #转换数据格式
    
        import matplotlib.pyplot as plt
        plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
    
        #不同类别用不同颜色和样式绘图
        d = tsne[r[u'聚类类别'] == 0]
        plt.plot(d[0], d[1], 'r.')
        d = tsne[r[u'聚类类别'] == 1]
        plt.plot(d[0], d[1], 'go')
        d = tsne[r[u'聚类类别'] == 2]
        plt.plot(d[0], d[1], 'b*')
        plt.show()

    运行结果:

  • 相关阅读:
    day05
    day04
    day03
    day02
    一个球从100m高度自由下落,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第10次落地时,共经过多少米,第10次反弹多高
    有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13,... 求出这个数列的前20项之和
    输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为153=1^3+5^3+3^3
    求和k(1到100)+k*k(1到50)+1/k(1到10)
    求Sn=a+aa+aaa+...+aa..a(n个a)之值,其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222(n=5),n由键盘输入
    求1!+2!+3!+4!+...+20!
  • 原文地址:https://www.cnblogs.com/nicaihui/p/16063974.html
Copyright © 2020-2023  润新知