TensorFlow建立深度神经网络解决二分类问题(注释非常详细,通过实例学框架)

2023-10-31

(作者:陈玓玏)
分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助http://www.captainbed.net/luanpeng

一、 实现功能

从CSV文件中读取数据,然后构建深度神经网络,各层神经元个数分别为3/5/2/4/1,因为是二分类问题,所以输出层只需要一个神经元。前四层,包括输入层的激活函数都是Relu,还定义了Elu函数,是Relu函数的改进版,输出层使用的是sigmoid激活函数。损失函数定义为交叉熵损失函数,优化方法采用的梯度下降法。最后对结果进行评估,虽然神经网络中通常是使用准确度来评估,但是我还是比较喜欢用KS,因为风控中用得多的是KS,所以我在最后把最后一轮求得的所有参数都写入CSV文件了,通过CSV文件再把参数读出来,重新计算预测值,求得KS。

这一系列的过程其实就是在定义数据和计算图,因为TensorFlow会将所有的步骤事先生成计算图graph,可以理解为流水线,然后在session中根据定义好的流水线逐步进行计算。特征x和样本真实值y通过占位符事先定义,能够更灵活地接收各维度数据的输入,所有的权重和偏置等需要求解的参数通过TensorFlow的variable定义,全部变量和网络定义好之后,通过session启动训练,并输出结果。

基本上要说的都在注释里,直接看注释就可以了,边跑代码边看效果最好~

二、 完整代码(方法一)

-*- coding: utf-8 -*-
"""   
Created on Fri Dec 21 09:10:26 2018

@author: chendile
"""
import numpy as np
import pandas as pd
from sklearn import metrics
import risk_model_function as md
import matplotlib.pyplot as plt
# 定义数据
# 定义计算图与变量
# 定义会话
# 进行计算

#===========================定义激活函数===================================
#定义relu激活函数
def relu(x):
    if x>0:
        y = x
    else:
        y = 0
    return y

#定义sigmoid激活函数
def sigmoid(x):
    return 1/(1+np.exp(-x))

#定义elu激活函数,这是relu函数的改进版,不会出现dropout,因为神经元少的时候使用relu可能会造成整层神经网络都是死神经元的情况
def elu(x):
    if x>=0:
        y = x
    else:
        y = np.exp(x)-1
    return y
#===========================tensorflow读取csv文件====================================
def read_csv_dnn_notcontrib():
    import tensorflow as tf
    import pandas as pd
#    import tensorflow as tf

    #这里两句是加载手写体案例minist的数据集,dnn也可以用来识别手写体,只需要把图像数据展开入模即可
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("D:/Users/chendile/AppData/Local/Temp/pip-uninstall-ktrcfkmd/users/chendile/appdata/local/continuum/anaconda3/lib/site-packages/tensorflow/examples/tutorials/mnist/MNIST_data/",one_hot=True)
    #print(pd.DataFrame(mnist))
    #这里是通过TensorFlow的string_input_producer读取CSV文件
    filename_queue = tf.train.string_input_producer(["D:/CDL_code/sample_y60all_data_sf_xs_app_20180816_filter_drophead.csv"],num_epochs=10)
    reader = tf.TextLineReader()
    key, value = reader.read(filename_queue)
    #print(value)
    
    # Default values, in case of empty columns. Also specifies the type of the
    # decoded result.
    col = []
    #定义数据的默认值,如果数据为空,则会填充为这个默认值,默认值写为整数则会认为这一列类型为整数,定义为float则默认这一列为float,所以要格外注意小数点
    record_defaults = [[1.00]]*2187
    
    #解码csv文件的值为适合TensorFlow处理的格式,并将空值填充为默认值
    col = tf.decode_csv(value, record_defaults = record_defaults)
    #print(col)
    
    #csv中x和y是在一起的,但是在放入模型前需要分别取出它们,我这里的最后一列是y,所以定义如下
    features = tf.stack(col[0:-1])
    label = tf.stack(col[-1])
    '''
    这一段没有用到
    init_op = tf.global_variables_initializer()
    local_init_op = tf.local_variables_initializer()  # local variables like epoch_num, batch_size 可以不初始化local
    
    with tf.Session() as sess:
        sess.run(init_op)
        sess.run(local_init_op)
    
        # Start populating the filename queue.
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(coord=coord)
    
        for i in range(5):
            # Retrieve a single instance:
            example, label = sess.run([features, label])
            print(example)
            print(label)
    
        coord.request_stop()
        coord.join(threads)
    '''
    #初始化所有的变量,包括全局变量和局部变量,使用这个每次TensorFlow都会提示被弃用了,所以也可以考虑别的方法来初始化变量,但是必须初始化,以下展示了两种初始化方法
    init_op = tf.global_variables_initializer()
    local_init_op = tf.local_variables_initializer()  # local variables like epoch_num, batch_size 可以不初始化local
    #tf.local_variables_initializer().run()
    init_op = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer())
    #深度学习通常都是采用mini-batch方法来训练,也就是一次训练不会用到全部样本,而是随机抽取一定数量的样本,这里我定义的是一次用256个样本
    example_batch, label_batch = tf.train.shuffle_batch([features,label], batch_size=256, capacity=200, min_after_dequeue=100, num_threads=3)  
    
    
    #============================开始定义神经网络的结构=======================
    # 1.定义数据。在神经网络里我们需要定义的数据就是输入训练/测试数据,而变量用来存储网络模型里的各种参数。
    #定义的是输入输出层,输入层有2186个节点,输出层有1个节点,因为现在是二分类问题,如果是手写体识别数字那输出层就应该要10个节点
    #placeholder是一个占位符,这里的x希望输入任意数量的2186维的向量,暂时没有具体的数据
    x = tf.placeholder( tf.float32, [None, 2186] )
    y_ = tf.placeholder( tf.float32, [None, 1] )
    
    # 2.定义TensorFlow的计算图和变量。对于神经网络来说,主要是三个步骤:定义网络模型,定义损失函数、定义优化方法。
    #求得的权重矩阵和偏置向量会存储在这两个Variable中,变量在计算过程中会产生实际的值,可以在session中获取实际的值。
    #初始化方法有很多种,神经网络是不适合用全0初始化的,常用的有这么几种:截尾正态分布:truncated_normal,正态分布:random_normal,均匀分布:random_uniform,吴恩达老师还建议过根据上一层的神经元个数来初始化这一层的权重
    #各种参数初始化的方法可以参见这篇文章:https://blog.csdn.net/dcrmg/article/details/80034075
    W_1 = tf.Variable( tf.random_normal([2186,3], mean=0.01,stddev=0.3) )  #w为2186*3的矩阵,输入层为2186个特征
    b_1 = tf.Variable( tf.random_normal([3], mean=0.01,stddev=0.3) )   #定义并初始化偏置项,第一层3个神经元,因此有3个偏置项
    # 激活函数定义,建立模型,这里的深度神经网络和卷积神经网络都来自tf.nn,当前使用的激活函数是elu,tf.matmul是x*W,即求得两个矩阵相乘的结果,如果是tf.multiply即点乘
    y_1 = tf.nn.elu( tf.matmul(x,W_1) + b_1)
    #placeholder定义一个dropout的概率
    #keep_prob = tf.placeholder("float")
    #y_1 = tf.nn.dropout(y_1, keep_prob)
    print("完成输入层定义")
#    '''
   #定义第二层神经元的计算图
    W_2 = tf.Variable( tf.random_normal([3,5], mean=0.01,stddev=0.3) )  #w为3*5的矩阵,因为上一层有3个神经元,这一层有5个
    b_2 = tf.Variable( tf.random_normal([5], mean=0.01,stddev=0.3) )   
    y_2 = tf.nn.elu( tf.matmul(y_1,W_2) + b_2 )
    #placeholder定义一个dropout的概率
    #keep_prob = tf.placeholder("float")
    #y_2 = tf.nn.dropout(y_2, keep_prob)
    print("完成第2层定义")
#    '''
   #定义第三层神经元的计算图
    W_3 = tf.Variable( tf.random_normal([5,2], mean=0.01,stddev=0.3) )  #w为5*2的矩阵
    b_3 = tf.Variable( tf.random_normal([2], mean=0.01,stddev=0.3) )   
    y_3 = tf.nn.elu( tf.matmul(y_2,W_3) + b_3 )
    #placeholder定义一个dropout的概率
    #keep_prob = tf.placeholder("float")
    #y_3 = tf.nn.dropout(y_3, keep_prob)
    print("完成第3层定义")
    #定义第四层神经元的计算图
    W_4 = tf.Variable( tf.random_normal([2,4], mean=0.01,stddev=0.3) )  #w为2*4的矩阵
    b_4 = tf.Variable( tf.random_normal([4], mean=0.01,stddev=0.3) )   
    y_4 = tf.nn.elu( tf.matmul(y_3,W_4) + b_4 )
    #placeholder定义一个dropout的概率
    #keep_prob = tf.placeholder("float")
    #y_4 = tf.nn.dropout(y_4, keep_prob)
    print("完成第4层定义")
    #定义第5层神经元的计算图
    W_5 = tf.Variable( tf.random_normal([4,1],mean=0.01,stddev=0.3) )  #w为4*1的矩阵
    b_5 = tf.Variable( tf.random_normal([1], mean=0.01,stddev=0.3) )   
    y = tf.nn.sigmoid( tf.matmul(y_4,W_5) + b_5 )
    print("完成输出层定义")
    
    # 损失函数定义(交叉熵代价函数),这里是对所有样本的交叉熵的平均
    #各种损失函数定义:https://blog.csdn.net/yanshuai_tek/article/details/78649632
    #为什么使用交叉熵损失函数的理由:https://blog.csdn.net/weixin_39750084/article/details/86029543
    cross_entropy = tf.reduce_mean( -tf.reduce_sum(y_*tf.log(y+pow(10,-9))+(1-y_)*(1-tf.log(1-y+pow(10,-9))), reduction_indices=[1] ) )  # reduce_sum内第一个参数为交叉熵公式
    
    # 训练/优化方法定义。神经网络常采用SGD(Stochastic Gradient Descent)进行网络的优化训练。tensorflow会自动根据前面定义的计算图先进行前向传播得到预测值,再根据预测值与真实值的求得的损失函数及计算图进行后向传播,依据梯度下降法更新参数。
    # tf.subtract计算两个张量相减,当然两个张量必须形状一样。 即 yhat - target。
#    yerror = tf.subtract(y, y_)
    # 计算L2损失,也就是方差。
#    cross_entropy = tf.nn.l2_loss(yerror)
    #这里的几个列表是为了存储损失函数和参数,方便观察神经网络损失函数的下降情况及权重变化情况,后面会做可视化操作
    loss_arr = []
    w1_arr = []
    w2_arr = []
    w3_arr = []
    #这里0.1是学习率,有多种优化方法可以选择,如Adam、Adadelta等
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)
#    train_step = tf.train.AdamOptimizer(0.02).minimize(cross_entropy)
#    train_step = tf.train.AdadeltaOptimizer(1).minimize(cross_entropy)

    #===============================开始实际的神经网络训练过程======================
    # 3.定义会话,并通过global_variables_initializer初始化所有变量
    #启动会话,并通过sess.ruan(init_op)等方法初始化全局变量和局部变量,前面虽然定义了init_op,但没有实际执行初始化操作,一切操作都是在session才会真实执行的
    sess = tf.InteractiveSession()
    sess.run(init_op)
    sess.run(local_init_op)
    tf.global_variables_initializer().run()
    
    # 运行Graph,开始计算过程
    coord = tf.train.Coordinator()  #创建一个协调器,管理线程  
    threads = tf.train.start_queue_runners(coord=coord)  
    #打印一个batch的x和y看看,这里只会打印shape,因为tensor是TensorFlow中的数据结构,它print时只打印shape信息
    print(example_batch, label_batch)
    #训练200次
    for i in range(200):
#         print(example_batch, label_batch)
         e_val,l_val = sess.run([example_batch, label_batch])
         
         #只有sess.run这种方法能够打印输出variable,这在TensorFlow中叫feed,也就是在会话中给模型喂真实数据,模型才能输出数据
#         print('---',sess.run(W_1))
#         print('++++',sess.run(W_4))
#         print('---',sess.run(W_5))
#         print('---',sess.run(cross_entropy))
         #train_step.run需要的是特征和label都必须是一个样本一行,而这里的l_val是所有样本的label都在一个向量中,所以会有维度问题,需要转换一下,转换后的结果为y_true
         y_true = []
         for l in l_val:
             y_true.append([l])
#         print(y_true)
         train_step.run( {x:e_val, y_:y_true} )
         #记录本轮的损失函数值,这里的feed_dict就是你喂给模型的数据
         loss_arr.append(sess.run(cross_entropy,feed_dict={x:e_val, y_:y_true}))
         #记录权重,观察权重变量,其实用tensorboard更方便,之后会再写一篇这个的使用
         w1_arr.append(sess.run(W_1)[0,0])
         w2_arr.append(sess.run(W_2)[0,0])
         w3_arr.append(sess.run(W_3)[0,0])
         print('---------',i)
         print('w1',sess.run(W_1))
         print('w2',sess.run(W_2))
         print('w3',sess.run(W_3))
         print('本一轮训练的y预测值:',sess.run(y,feed_dict={x:e_val}))
         #自己写的一个early stopping,不是很好用,而且模型偏差大时更不建议使用
         if abs(sess.run(cross_entropy,feed_dict={x:e_val, y_:y_true}))<1:
             break
    print('最后一轮训练的样本特征:',e_val)
    print('最后一轮训练的y预测值:',sess.run(y,feed_dict={x:e_val}))
    print('最后一轮训练的y真实值:',l_val)
    #画出损失函数及权重的变化图
    plt.plot(range(len(loss_arr)),loss_arr)
    plt.plot(range(len(w1_arr)),w1_arr,'o-')
    plt.plot(range(len(w2_arr)),w2_arr,'*-')
    plt.plot(range(len(w3_arr)),w3_arr,'--')
    

#         train_step.run( {x:example_batch, y_:label_batch} )
#        print (e_val,l_val)  
    #训练结束后停止线程调度
    coord.request_stop()  
    coord.join(threads)
#    print(e_val,l_val) 
    
    
        
    
    #===================================评估模型,给出准确度和ks====================
    #correct_prediction会给出真实值和样本值经过阈值处理后相等的个数,比如阈值为0.5,那么大于0.5的就会被认为是1,小于0.5的就会是原值,真实值也做同样的处理,然后判断有多少值是相等的,其比例即为准确率
    correct_prediction = tf.equal( tf.argmax(y_true,1), tf.argmax(y_,1) )
    print(correct_prediction)
        #tf.equal( tf.argmax(y,1), tf.argmax(y_,1) )判断预测值和真实值是否相等,返回的是布尔型向量
        #布尔型数据构成的向量通过cast转换为浮点型,并求平均,以得到准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32) )
    #    print(accuracy)
    print(accuracy.eval({x:e_val, y_:y_true} ))
    
    #把最后一轮训练的参数保存下来,方便计算模型ks
    pd.DataFrame(sess.run(W_1)).to_csv('D:/CDL_code/模型探索/dnn/w1.csv',index=False)
    pd.DataFrame(sess.run(W_2)).to_csv('D:/CDL_code/模型探索/dnn/w2.csv',index=False)
    pd.DataFrame(sess.run(W_3)).to_csv('D:/CDL_code/模型探索/dnn/w3.csv',index=False)
    pd.DataFrame(sess.run(W_4)).to_csv('D:/CDL_code/模型探索/dnn/w4.csv',index=False)
    pd.DataFrame(sess.run(W_5)).to_csv('D:/CDL_code/模型探索/dnn/w5.csv',index=False)
    pd.DataFrame(sess.run(b_1)).to_csv('D:/CDL_code/模型探索/dnn/b1.csv',index=False)
    pd.DataFrame(sess.run(b_2)).to_csv('D:/CDL_code/模型探索/dnn/b2.csv',index=False)
    pd.DataFrame(sess.run(b_3)).to_csv('D:/CDL_code/模型探索/dnn/b3.csv',index=False)
    pd.DataFrame(sess.run(b_4)).to_csv('D:/CDL_code/模型探索/dnn/b4.csv',index=False)
    pd.DataFrame(sess.run(b_5)).to_csv('D:/CDL_code/模型探索/dnn/b5.csv',index=False)
    
    return e_val,y_true

''' 
本来想用这一段来用已输出的参数跑模型的,但现在看来是不行了,所以只能尝试把参数保存下来,然后再跑新的全量数据   
#    print('---',sess.run(W_1))
#    print('++++',sess.run(W_4))
#    print('---',sess.run(W_5))
    sess = tf.InteractiveSession()
    sess.run(init_op)
    sess.run(local_init_op)
    tf.global_variables_initializer().run()
    example_batch, label_batch = tf.train.shuffle_batch([features,label], batch_size=100, capacity=200, min_after_dequeue=100, num_threads=3)
    print(example_batch, label_batch)
    for i in range(1):
        print(i)
        e_val,l_val = sess.run([example_batch, label_batch])
        print(e_val,l_val)
#        y_1 = tf.nn.relu( tf.matmul(e_val,W_1) + b_1 )
#        y_4 = tf.nn.relu( tf.matmul(y_1,W_4) + b_4 )
#        y = tf.nn.sigmoid( tf.matmul(y_4,W_5) + b_5 )
#    sess.run(y)
#    print(sess.run(y))
'''

#计算模型的ks,这里的ks计算方法是自己不是用的TensorFlow封装的方法,所以需要先把权重读出来,然后把前向传播的过程写出来,再计算ks
def read_para_ks(e_val,y_true):
    w1 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/w1.csv')))
    w2 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/w2.csv')))
    w3 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/w3.csv')))
    w4 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/w4.csv')))
    w5 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/w5.csv')))
    b1 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/b1.csv')))
#    print(len(w1[0]),len(b1))
    b2 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/b2.csv')))
    b3 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/b3.csv')))
    b4 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/b4.csv')))
    b5 = np.mat(pd.read_csv(open('D:/CDL_code/模型探索/dnn/b5.csv')))
    
    #不需要看ks和roc结果的时候,可以不用下面的代码了
    #如果是要检查前向传播过程写得是否正确,我们需要使用最后一个batch的数据来验证,因此这里需要先判断是否有读取最后一个batch的数据,如果不需要检查正确性了,直接跑全量数据,那就直接读取csv文件中的数据即可
    if len(e_val)>0:
        x = e_val
    else:
        df = pd.read_csv('D:/CDL_code/sample_y60all_data_sf_xs_app_20180816_filter_drophead.csv')
        x = np.mat(df.iloc[:,0:-1])
        
    if len(y_true)>0:
        y_ = y_true
    else:
        y_ = np.mat(df.iloc[:,-1]).tolist()[0]
#    print(np.mat(df.iloc[:,-1]))
#    '''
   #开始前向传播过程,我写得有些繁琐
   #第一层
    y1 = x*w1
#    print(y1.shape[0]-1,y1.shape[1])
    for i in range(y1.shape[0]):
#        print(i,b1[i,0])
        for j in range(y1.shape[1]):
#            pass
            y1[i,j] = elu(y1[i,j]+b1[j,0])
    print('y1:',y1)
    #第2层
    y2 = y1*w2
#    print(y1.shape[0]-1,y1.shape[1])
    for i in range(y2.shape[0]):
#        print(i,b1[i,0])
        for j in range(y2.shape[1]):
#            pass
            y2[i,j] = elu(y2[i,j]+b2[j,0])
    print('y2:',y2)
    #第3层
    y3 = y2*w3
#    print(y1.shape[0]-1,y1.shape[1])
    for i in range(y3.shape[0]):
#        print(i,b1[i,0])
        for j in range(y3.shape[1]):
#            pass
            y3[i,j] = elu(y3[i,j]+b3[j,0])
    print('y3:',y3)
    #第四层
    y4 = y3*w4
#    print(y1.shape[0]-1,y1.shape[1])
    for i in range(y4.shape[0]):
#        print(i,b1[i,0])
        for j in range(y4.shape[1]):
#            pass
            y4[i,j] = elu(y4[i,j]+b4[j,0])
    print('y4:',y4)
    #输出层
    y5 = y4*w5
#    print(y1.shape[0]-1,y1.shape[1])
    for i in range(y5.shape[0]):
#        print(i,b1[i,0])
        for j in range(y5.shape[1]):
#            pass
            y5[i,j] = sigmoid(y5[i,j]+b5[j,0])
#            y5[i,j] = leaky_relu(0.2,y5[i,j]+b5[j,0])
   
#    print(np.mat(df.iloc[:,-1]).T.tolist())
#    print(len(np.mat(df.iloc[:,-1]).T.tolist()[0]),len(y3.T.tolist()[0]))
    print('最后一轮训练的y我计算的预测值:',y5)
    print('最后一轮训练的y我计算的真实值:',y_[0:3])
    pd.DataFrame(y5,columns=['y_pred']).join(pd.DataFrame(y_,columns=['y_true'])).to_csv('D:/CDL_code/模型探索/dnn/y_pred.csv')
    #调用sklearn中的接口查看roc值,这里的ks值是调用的自己写的接口画的,ks实现很简单,这里就不放出代码了,但记得自己要把自己写的ks计算函数引入进来,否则当然是要报错的
#    t_fpr, t_tpr, _ = metrics.roc_curve(np.mat(df.iloc[:,-1]).tolist()[0], y4.T.tolist()[0])
#    md.roc_curve([(np.mat(df.iloc[:,-1]).tolist()[0], y4.T.tolist()[0],'train'),])
    t_fpr, t_tpr, _ = metrics.roc_curve(y_, y5.T.tolist()[0])
    md.roc_curve([(y_, y5.T.tolist()[0],'train'),])
    md.ks_plot('train',t_tpr,t_fpr)
#    '''
#    print(np.mat(df.iloc[:,-1]).tolist()[0])
                    
    
 #这里算主函数?哈哈
def dnn():
    e_val,y_true = read_csv_dnn_notcontrib()
    e_val,y_true = [],[]
    read_para_ks(e_val,y_true)
    
#执行函数
dnn()

三、读取csv并建立深度神经网络方法二

最开始看到这个用tf.contrib方法实现读取csv文件并训练神经网络的方法时,真的是很激动了,马上用自己的数据实现了一下,但是觉得有几个缺点吧:
1) 这个方法必须先手动把训练集和测试集分开,没有方法一方便;
2) tf.contrib官网上的说法是后续可能就不维护了,所以还是熟练一下tf.nn模块比较好;
3) 使用这种方法的网络定义过程要简单很多,也没有占位符、变量这些不是那么好理解的数据结构概念,但是也缺失了灵活性,比如不能每层定义不同的激活函数,使用方法一就不会有这个问题了。

总之呢,刚开始学或者只是想简单跑一下神经网络,用方法二即可,但要是想深入学习一下,还是方法一更靠谱些。

#========================================读取csv文件并建模=================================
def read_csv_dnn():
    import tensorflow as tf
    import numpy as np
    import pandas as pd
    from sklearn import metrics
    import risk_model_function as md
    
    # 数据集名称,数据集要放在你的工作目录下,训练集和测试集分开读取
    IRIS_TRAINING = 'D:/CDL_code/sample_y60_irt_data_sf_xs_app_20180816_train.csv'
    IRIS_TEST = 'D:/CDL_code/sample_y60_irt_data_sf_xs_app_20180816_test.csv'
#    print(pd.read_csv(IRIS_TRAINING))
    
    # 数据集读取,训练集和测试集
    training_set = tf.contrib.learn.datasets.base.load_csv_without_header(
        filename=IRIS_TRAINING,
        target_dtype=np.int,
        features_dtype=np.float32)
    
    test_set = tf.contrib.learn.datasets.base.load_csv_without_header(
        filename=IRIS_TEST,
        target_dtype=np.int,
        features_dtype=np.float32)
    
    # 特征
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=714)]
    
    # 构建DNN网络,3层,每层分别为10,20,10个节点
    classifier = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
                                                hidden_units=[200, 500, 300],
#                                                n_classes=2,
#                                                activation_fn=[tf.nn.relu,tf.nn.relu,tf.nn.sigmoid])
                                                activation_fn=tf.nn.sigmoid)
                                                #model_dir="/tmp/iris_model")
    
    # 拟合模型,迭代200步
    classifier.fit(x=training_set.data,
                   y=training_set.target,
                   steps=200)
    
    #DNNRegressor没有精度,只有DNNClassifier才有
    # 计算精度
#    accuracy_score = classifier.evaluate(x=test_set.data,y=test_set.target)["accuracy"]
    accuracy_score = classifier.evaluate(x=test_set.data,y=test_set.target)
    print(accuracy_score)
#    print('Accuracy: {0:f}'.format(accuracy_score))
    
    # 预测新样本的类别
#    new_samples = np.array([[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=float)
    new_samples = training_set.data
    y = list(classifier.predict(new_samples, as_iterable=True))
    
    #计算二分类训练集的roc和ks,
    t_fpr, t_tpr, _ = metrics.roc_curve(training_set.target, y)
    md.roc_curve([(training_set.target, y,'train'),])
    md.ks_plot('train',t_tpr,t_fpr)
    #计算测试集的roc和ks
    new_samples = test_set.data
    y = list(classifier.predict(new_samples, as_iterable=True))
    t_fpr, t_tpr, _ = metrics.roc_curve(test_set.target, y)
    md.roc_curve([(test_set.target, y,'train'),])
    md.ks_plot('train',t_tpr,t_fpr)
#    print(len(test_set.target))
#    print(len(y))
#    print('Predictions: {}'.format(str(y)))

read_csv_dnn()

四、参考资料

1、 https://blog.csdn.net/xxzhangx/article/details/54667234 ;
2、 https://blog.csdn.net/xxzhangx/article/details/54667234
3、 https://blog.csdn.net/zhangchao19890805/article/details/81332240
4、 https://www.jianshu.com/p/c4158fb99959

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow建立深度神经网络解决二分类问题(注释非常详细,通过实例学框架) 的相关文章

  • 为神经网络打乱两个 numpy 数组

    我有两个 numpy 数组用于输入数据 X 和输出数据 y X np array 2 3 sample 1 x 16 4 dtype float sample 2 x y np array 1 0 sample 1 y 0 1 dtype
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • Django 查询:“datetime + delta”作为表达式

    好吧 我的问题如下 假设我有下一个模型 这是一个简单的情况 class Period models Model name CharField field specs here start date DateTimeField field s
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 如何在 numpy 数组中查找并保存重复的行?

    我有一个数组 例如 Array 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 我想要输出以下内容的东西 Repeated 1 1 1 2 2 2 保留重复行的数量也可以 例如 Repeated 1 1
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 打印一份拥有多个家庭的人员名单,每个家庭都有多个电话号码

    我有一类 Person 它可以有多个 Home 每个 Home 都有一个或多个电话号码 我已经定义了类 但现在我正在尝试创建一个视图 其中列出每个人的所有家庭以及每个家庭地址的所有电话号码 类似于 john smith 123 fake s
  • 一个类似 dict 的 Python 类

    我想编写一个自定义类 其行为类似于dict 所以 我继承自dict 不过 我的问题是 我是否需要创建一个私有的dict我的成员 init 方法 我不明白这个有什么意义 因为我已经有了dict如果我只是继承自的行为dict 谁能指出为什么大多
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 目录 'app/static' 不存在

    当我运行 server py 文件时出现错误 File C Users nawin AppData Local Programs Python Python38 lib site packages starlette staticfiles
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 通过新数据更新绘图,而不是在 Jupyter 笔记本中制作新绘图

    我有一些问题 希望你能帮我解决 我需要使用下拉小部件创建交互式绘图 我可以在其中选择并绘制感兴趣的数据 我通过以下方式做到这一点 import plotly graph objects as go import ipywidgets as
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示

随机推荐

  • 32通过tcp发送数组_西门子S71500与S7300PN的TCP通信(图文)

    加微信号 15021230050 邀请您加入 信控电气 微信群 点击文章最下方 阅读原文 加入超级工控技术群 免费学习PLC编程技术 包吃住还有工资 西门子S7 1500与S7 300PN的TCP通信 1 概述 2 自动化解决方案 2 1网
  • 摆动排序leetcode324

    给你一个整数数组 nums 将它重新排列成 nums 0 lt nums 1 gt nums 2 lt nums 3 的顺序 你可以假设所有输入数组都可以得到满足题目要求的结果 示例 1 输入 nums 1 5 1 1 6 4 输出 1 6
  • 【单片机】STM32F030硬件SPI的坑

    使用的是STM32F030F4P6 这是一个小封装的单片机 但是五脏俱全 很多功能 就是引脚不多 使用到SPI的时候感觉应该和以前用过的STM32F103系列是一样的 寄存器的结构几乎是完全一样的 寄存器操作的程序甚至都能兼容 但是在使用的
  • Flutter1.0实践要点(Dart语法回顾)

    Flutter1 0实践要点 Flutter 文档 Flutter widgets文档 实践要点 dart文件命名使用小写加下滑线 dart类命名使用驼峰 Dart语法 绝对定位widget Stack Positioned url包裹wi
  • A Survey of Learning on Small Data(二)

    本文是 A Survey of Learning on Small Data 的翻译 原文链接 小数据学习综述 4 几何角度 4 1 Frechet均值 4 2 欧几里得均值 4 3 非欧均值 4 3 1 Poincare质心 4 3 2
  • 面试常问:Hive分区与分桶的区别

    分区表与分桶表的区别 创建表时可以同时为表创建一个或者多个分区 我们在加载数据时为期指定具体的 分区 查询数据时可以指定具体的分区从而提高效率 分区表是把分区当成目录的 分区实际上是将表文件分成多个有标记的小文件以方便查询 分区表 在Hiv
  • Ubuntu下安装AndroidStudio

    前言 接触Ubuntu系统有一段时间了 对Ubuntu下软件的操作有了一定的了解 本文结合所学的知识 在Ubuntu系统下安装android开发工具 Android Studio 步骤 第一步 安装JDK 打开终端 使用快捷键 CTR AL
  • Result of ‘Stream.peek()‘ is ignored

    firstPublish getFunds stream filter firstFund gt adviceCodeSet contains firstFund getCode peek firstFund gt firstFund se
  • 不要再焦虑了:BATJ大厂给程序员们价值百万的职业规划(18-35岁,35岁以后)

    顺坡下山 另辟蹊径 虽然你感觉互联网程序员好像已经人满为患了 但中国很多其他行业还根本招不到什么像样的程序员的 只是现在制造业国企程序员待遇太低 一般也就万把块 比制造业其他工种稍微高一点 但比互联网低很多 只要肯降薪去这些国企央企 也算一
  • 浅论静态测试的价值

    曾经看过一篇介绍某静态测试工具的文章 说该工具可以发现所有的代码错误 我觉得很好奇 问 如果我写了一个加法函数 把加号写成减号 如int add int a int b return a b 可以找出来吗 答 这是代码功能错误 当然不能找出
  • Qt每日小结——QListWidget使用总结

    最近需要使用QListWidget完成一个样本输入显示及交互的功能 需要实现的功能基本是这样的 点击添加样本 将txt文件名输入到左侧的列表中 单击 shift ctrl多选item后点击移除样本 将样本从列表中移除 点击清空列表 则将列表
  • "Access denied for user 'root@localhost' 试一下你的mysql是不是用任何密码都可以登录,如果是的话这里...

    https blog csdn net light breeze article details 82070222 花了三小时 竟然是因为这个 转载于 https www cnblogs com MarsMercury p 11586010
  • List接口简介

    List接口简介 List是Collection的子接口 其最大的特点是允许保存有重复元素的数据 该接口的定义如下 public interface List
  • kafka如何动态消费新增topic主题

    一 解决痛点 使用spring kafka客户端 每次新增topic主题 都需要硬编码客户端并重新发布服务 操作麻烦耗时长 kafkaListener虽可以支持通配符消费topic 缺点是并发数需要手动改并且重启服务 对于业务逻辑相似场景
  • 蓝桥杯算法训练VIP-阿尔法乘积

    题目 题目链接 题解 实现题 按着题目描述实现就行了 很坑的一点是题目规定数据量6e6 但是给的样例是十位数 离谱 开个longlong 代码 include
  • Python爬虫及网络编程相关面试题整理

    1 你用过的爬虫框架或者模块有哪些 谈谈他们的区别或者优缺点 Python自带 urllib urllib2 第 三 方 requests 框 架 Scrapy urllib和urllib2模块都做与请求URL相关的操作 但他们提供不同的功
  • TortoiseGit工具使用

    TortoiseGit clone commit push pull 3 1 克隆项目 打开资源管理器 我的电脑 计算机 进入规划好的某个目录中 然后在空白处点击鼠标右键 选择 TortoiseGit gt 克隆 Clone 弹出克隆项目对
  • Qt5.12.0 请求 https 资源提示 TLS 初始化失败

    qt network ssl QSslSocket connectToHostEncrypted TLS initialization failed 1 首选需要找到缺失的 libea32 dll 和 ssleay32 dll 两个库 注
  • 基于python的入侵检测系统毕设_入侵检测系统(IDS)的基础

    点击上方蓝色字体即可关注噢 0x01 介绍 入侵检测包含一系列旨在检测 和报告 恶意系统和网络活动或记录入侵证据的安全技术 要了解入侵检测 必须完全了解什么是入侵 就本文而言 我们将入侵定义为一台 或多台 计算机或网络上的任何未经授权的系统
  • TensorFlow建立深度神经网络解决二分类问题(注释非常详细,通过实例学框架)

    作者 陈玓玏 分享一个朋友的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 大家可以看看是否对自己有帮助http www captainbed net luanpeng 一 实现功能 从CSV文件中读取数据 然后构建深度神经网络 各层