输入的数据集是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