zoukankan      html  css  js  c++  java
  • keras做DNN

    输入的数据集是10000行,31645列,其中前31644是特征,最后一列是标签值。训练集和测试集格式是一样的。

    特征值都是0,1形式,表示有还是没有这个特征,标签值是0,1形式,2分类。

    import keras
    import tensorflow as tf
    from keras.models import Sequential
    from keras.layers import Dense, Activation
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Activation
    from keras.layers import Embedding
    from keras.layers import LSTM

    #*******************#########################**********************************************************
    #++++++++++++$$$$$***********************************************
    #*****************************************************************************************

    #带标签数据训练
    # Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit函数

    # for a single-input model with 2 classes (binary):
    #dese后面的数字表示输出的数据的维数,只有一个add,一个激活函数,认为网络只有一层,那么dense后面的数字必须是要输出的类别数,
    #如果中间有几层网络,那么每一个dense后面试输出为下一层的网络神经元个数,但是最后一个add的dense后面的数字必须是输出的类别数。

    model = Sequential()
    model.add(Dense(20, input_dim=31644, activation='sigmoid')) #把dense=1改为20
    model.add(Dropout(0.5))
    model.add(Dense(10,activation='relu')) #没有input 表示隐层神经元
    model.add(Dropout(0.5))
    model.add(Dense(1,activation='sigmoid')) #输出1维,表示是输出层神经元

    model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])

    # generate dummy data
    import numpy as np

    def meke_sample(p):
       data=[]
       label=[]
       f_tain=open("/Users/zhangb/Desktop/学习研究/测试样本/"+p,'r')
       for i in f_tain.readlines():
            lt=i.strip().split(',')
            data.append([int(x) for x in lt[0:-1]])
            label.append([int(lt[-1])])
        f_tain.close()
        data2=np.array(data)
        label2=np.array(label)
        return [data2,label2]

    train_sample=meke_sample("train")
    test_sample=meke_sample("test")

    train_data=train_sample[0]
    train_label=train_sample[1]

    test_data=test_sample[0]
    test_label=test_sample[1]


    #定义混淆矩阵,左边是预测值,上面是实际值 从左到右,从上到下 依次为a,b,c,d表示
    def confusion_mat(test_label,predicts):
          test_calss=[int(x) for x in (list(test_label))] #传入的是数组,转成数字列表
          pred_class=[int(x) for x in (list(predicts))]
          a,b,c,d=0,0,0,0
          for i in range(len(test_calss)):
              if pred_class[i]==1 and test_calss[i]==1 :
                     a +=1
              elif pred_class[i]==1 and test_calss[i]==0 :
                     b +=1
              elif pred_class[i]==0 and test_calss[i]==1 :
                      c +=1
              elif pred_class[i]==0 and test_calss[i]==0 :
                      d +=1
          precision_1=a/(a+b+0.0)
          precision_0=d/(c+d+0.0)
          recall_1=a/(a+c+0.0)
          recall_0=d/(d+b+0.0)
          precision=(a+d)/(a+b+c+d+0.0)
          f1=2*precision_1*recall_1/(precision_1+recall_1)
          f0=2*precision_0*recall_0/(precision_0+recall_0)
          return [[a,b],[c,d],[precision_1,precision_0,recall_1,recall_0,precision,f1,f0]]

    #
    #print label
    model.fit(train_data, train_label, nb_epoch=80, batch_size=32)
    score = model.evaluate(test_data, test_label, batch_size=32) #得到损失值和准确率
    print score
    pred=model.predict_classes(test_data) #得到预测值 是数组
    #print pred

    confusion=confusion_mat(test_label,pred)
    precision_1=confusion[2][0]
    precision_0=confusion[2][1]
    recall_1=confusion[2][2]
    recall_0=confusion[2][3]
    precision=confusion[2][4]
    f1=confusion[2][5]
    f0=confusion[2][6]
    print confusion[0]
    print confusion[1]
    print 'precision_1 :'+ str(precision_1) + ' precision_0:' +str(precision_0)
    print 'recall_1: '+str(recall_1)+' recall_0: '+ str(recall_0)
    print 'precision:' +str(precision)
    print 'f1: '+str(f1) + 'f0: '+str(f0)
    #print ret
    #print score

  • 相关阅读:
    查询中常用的扩展方法
    加载关联表的数据 显式加载
    加载关联表的数据 延迟加载
    加载关联表的数据 贪婪加载
    操作内存中的数据
    DBContext基础查询
    EF简单增删改查
    1- MySQL数据库基础快速入门
    1-3 Postman 注册账号与登录
    1-2 postman工具简介
  • 原文地址:https://www.cnblogs.com/zhangbojiangfeng/p/6362936.html
Copyright © 2011-2022 走看看