train_2.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import sys
  2. import os
  3. sys.path.append(os.path.abspath("../.."))
  4. import pandas as pd
  5. import re
  6. import psycopg2
  7. from keras.callbacks import ModelCheckpoint
  8. from keras import layers,models,optimizers,losses
  9. from BiddingKG.dl.common.Utils import *
  10. from BiddingKG.dl.common.models import *
  11. from sklearn.metrics import classification_report
  12. from sklearn.utils import shuffle,class_weight
  13. import matplotlib.pyplot as plt
  14. input_shape = (2,30,60)
  15. output_shape = [4]
  16. def getModel():
  17. '''
  18. @summary: 时间分类模型
  19. '''
  20. L_input = layers.Input(shape=input_shape[1:], dtype='float32')
  21. R_input = layers.Input(shape=input_shape[1:], dtype='float32')
  22. L_lstm = layers.Bidirectional(layers.LSTM(32,return_sequences=True,dropout=0.1))(L_input)
  23. # L_lstm = layers.LSTM(32,return_sequences=True,dropout=0.2)(L_input)
  24. avg_l = layers.GlobalAveragePooling1D()(L_lstm)
  25. R_lstm = layers.Bidirectional(layers.LSTM(32,return_sequences=True,dropout=0.1))(R_input)
  26. # R_lstm = layers.LSTM(32, return_sequences=True, dropout=0.2)(R_input)
  27. avg_r = layers.GlobalAveragePooling1D()(R_lstm)
  28. concat = layers.merge([avg_l, avg_r], mode='concat')
  29. # concat = layers.merge([L_lstm, R_lstm], mode='concat')
  30. # lstm = layers.LSTM(24,return_sequences=False,dropout=0.2)(concat)
  31. output = layers.Dense(output_shape[0],activation="softmax")(concat)
  32. # L_lstm = layers.LSTM(32,return_sequences=True,dropout=0.2)(L_input)
  33. # avg = layers.GlobalAveragePooling1D()(L_GRU)
  34. # output = layers.Dense(output_shape[0],activation="softmax")(avg)
  35. model = models.Model(inputs=[L_input,R_input], outputs=output)
  36. # model = models.Model(inputs=L_input, outputs=output)
  37. learn_rate = 0.0005
  38. model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  39. loss=losses.binary_crossentropy,
  40. metrics=[precision,recall,f1_score])
  41. model.summary()
  42. return model
  43. def getModel_center():
  44. '''
  45. @summary: 时间分类模型
  46. '''
  47. L_input = layers.Input(shape=input_shape[1:], dtype='float32')
  48. R_input = layers.Input(shape=input_shape[1:], dtype='float32')
  49. center_shape = (25, 60)
  50. C_input = layers.Input(shape=center_shape, dtype='float32')
  51. L_lstm = layers.Bidirectional(layers.LSTM(32,return_sequences=True,dropout=0.2))(L_input)
  52. avg_l = layers.GlobalAveragePooling1D()(L_lstm)
  53. C_lstm = layers.LSTM(32,return_sequences=True,dropout=0.2)(C_input)
  54. avg_c = layers.GlobalAveragePooling1D()(C_lstm)
  55. R_lstm = layers.Bidirectional(layers.LSTM(32,return_sequences=True,dropout=0.2))(R_input)
  56. avg_r = layers.GlobalAveragePooling1D()(R_lstm)
  57. concat = layers.merge([avg_l, avg_c, avg_r], mode='concat')
  58. output = layers.Dense(output_shape[0],activation="softmax")(concat)
  59. model = models.Model(inputs=[L_input,C_input,R_input], outputs=output)
  60. learn_rate = 0.0005
  61. model.compile(optimizer=optimizers.Adam(lr=learn_rate),
  62. loss=losses.binary_crossentropy,
  63. metrics=[precision,recall,f1_score])
  64. model.summary()
  65. return model
  66. def training():
  67. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30.csv", index_col=0)
  68. test_data = data_load.sample(frac=0.25, random_state=7)
  69. train_data = data_load.drop(test_data.index, axis=0)
  70. train_data =train_data.reset_index(drop=True)
  71. train_x = []
  72. train_y = []
  73. for left, right, label in zip(train_data['context_left'], train_data['context_right'], train_data['re_label']):
  74. y = np.zeros(output_shape)
  75. y[label] = 1
  76. left = ''.join(str(left))
  77. right = ''.join(str(right))
  78. context = [left, right]
  79. x = embedding_word(context, shape=input_shape)
  80. train_x.append(x)
  81. train_y.append(y)
  82. test_x = []
  83. test_y = []
  84. for left, right, label in zip(test_data['context_left'], test_data['context_right'], test_data['re_label']):
  85. y = np.zeros(output_shape)
  86. y[label] = 1
  87. left = ''.join(str(left))
  88. right = ''.join(str(right))
  89. context = [left, right]
  90. x = embedding_word(context, shape=input_shape)
  91. test_x.append(x)
  92. test_y.append(y)
  93. train_y, test_y = (np.array(train_y), np.array(test_y))
  94. train_x, test_x = (np.array(train_x), np.array(test_x))
  95. train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  96. model = getModel()
  97. epochs = 100
  98. batch_size = 256
  99. checkpoint = ModelCheckpoint("model_label_time_classify.model.hdf5", monitor="val_loss", verbose=1,
  100. save_best_only=True, mode='min')
  101. # cw = class_weight.compute_class_weight('auto',np.unique(np.argmax(train_y,axis=1)),np.argmax(train_y,axis=1))
  102. # cw = dict(enumerate(cw))
  103. history = model.fit(
  104. x=[train_x[0], train_x[1]],
  105. y=train_y,
  106. validation_data=([test_x[0], test_x[1]], test_y),
  107. epochs=epochs,
  108. batch_size=batch_size,
  109. shuffle=True,
  110. callbacks=[checkpoint],
  111. class_weight='auto'
  112. )
  113. plot_loss(history=history)
  114. load_model = models.load_model("model_label_time_classify.model.hdf5",
  115. custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  116. y_pre = load_model.predict([test_x[0], test_x[1]])
  117. # y_pre = load_model.predict(test_x[0])
  118. # 各类别预测评估
  119. res1 = classification_report(np.argmax(test_y, axis=1), np.argmax(y_pre, axis=1))
  120. print(res1)
  121. y_pre2 = load_model.predict([train_x[0], train_x[1]])
  122. # y_pre2 = load_model.predict(train_x[0])
  123. res2 = classification_report(np.argmax(train_y, axis=1), np.argmax(y_pre2, axis=1))
  124. print(res2)
  125. def training_center():
  126. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata.csv", index_col=0)
  127. test_data = data_load.sample(frac=0.25, random_state=7)
  128. train_data = data_load.drop(test_data.index, axis=0)
  129. train_data =train_data.reset_index(drop=True)
  130. train_x = []
  131. train_y = []
  132. for left, center, right, label in zip(train_data['context_left'], train_data['entity_time'], train_data['context_right'], train_data['re_label']):
  133. y = np.zeros(output_shape)
  134. y[label] = 1
  135. left = ''.join(str(left))
  136. right = ''.join(str(right))
  137. center = ''.join(str(center))
  138. context = [left,center, right]
  139. x = embedding_word(context, shape=(3,25,60))
  140. train_x.append(x)
  141. train_y.append(y)
  142. test_x = []
  143. test_y = []
  144. for left, center, right, label in zip(test_data['context_left'], train_data['entity_time'], test_data['context_right'], test_data['re_label']):
  145. y = np.zeros(output_shape)
  146. y[label] = 1
  147. left = ''.join(str(left))
  148. right = ''.join(str(right))
  149. center = ''.join(str(center))
  150. context = [left, center, right]
  151. x = embedding_word(context, shape=(3,25,60))
  152. test_x.append(x)
  153. test_y.append(y)
  154. train_y, test_y = (np.array(train_y), np.array(test_y))
  155. train_x, test_x = (np.array(train_x), np.array(test_x))
  156. train_x, test_x = (np.transpose(train_x, (1, 0, 2, 3)), np.transpose(test_x, (1, 0, 2, 3)))
  157. model = getModel_center()
  158. epochs = 70
  159. batch_size = 256
  160. checkpoint = ModelCheckpoint("model_label_time_classify.model.hdf5", monitor="val_loss", verbose=1,
  161. save_best_only=True, mode='min')
  162. # cw = class_weight.compute_class_weight('auto',np.unique(np.argmax(train_y,axis=1)),np.argmax(train_y,axis=1))
  163. # cw = dict(enumerate(cw))
  164. history = model.fit(
  165. x=[train_x[0], train_x[1], train_x[2]],
  166. y=train_y,
  167. validation_data=([test_x[0], test_x[1], test_x[2]], test_y),
  168. # validation_data=(test_x[0],test_y),
  169. epochs=epochs,
  170. batch_size=batch_size,
  171. shuffle=True,
  172. callbacks=[checkpoint],
  173. class_weight='auto'
  174. )
  175. plot_loss(history = history)
  176. load_model = models.load_model("model_label_time_classify.model.hdf5",
  177. custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  178. y_pre = load_model.predict([test_x[0], test_x[1], test_x[2]])
  179. # y_pre = load_model.predict(test_x[0])
  180. # 各类别预测评估
  181. res1 = classification_report(np.argmax(test_y, axis=1), np.argmax(y_pre, axis=1))
  182. print(res1)
  183. y_pre2 = load_model.predict([train_x[0], train_x[1], train_x[2]])
  184. # y_pre2 = load_model.predict(train_x[0])
  185. res2 = classification_report(np.argmax(train_y, axis=1), np.argmax(y_pre2, axis=1))
  186. print(res2)
  187. def predict():
  188. model1 = models.load_model("model_label_time_classify.model.hdf5",custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  189. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata_30.csv", index_col=0)
  190. test_x = []
  191. test_y = []
  192. for left, right, label in zip(data_load['context_left'], data_load['context_right'], data_load['re_label']):
  193. y = np.zeros(output_shape)
  194. y[label] = 1
  195. left = ''.join(str(left))
  196. right = ''.join(str(right))
  197. context = [left, right]
  198. x = embedding_word(context, shape=input_shape)
  199. test_x.append(x)
  200. test_y.append(y)
  201. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  202. pre_y = model1.predict([test_x[0],test_x[1]])
  203. data_load['pre'] = [np.argmax(item) for item in pre_y]
  204. error_data = data_load[data_load['re_label']!=data_load['pre']]
  205. # print(error_data.info())
  206. error_data.to_csv("C:\\Users\\admin\\Desktop\\test\\error4-0.2-0.6_30.csv")
  207. def predict_center():
  208. model1 = models.load_model("model_label_time_classify.model.hdf5",custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  209. data_load = pd.read_csv("C:\\Users\\admin\\Desktop\\newdata.csv", index_col=0)
  210. test_x = []
  211. test_y = []
  212. for left, center, right, label in zip(data_load['context_left'],data_load['entity_time'], data_load['context_right'], data_load['re_label']):
  213. y = np.zeros(output_shape)
  214. y[label] = 1
  215. left = ''.join(str(left))
  216. right = ''.join(str(right))
  217. center = ''.join(str(center))
  218. context = [left, center, right]
  219. x = embedding_word(context, shape=(3, 25, 60))
  220. test_x.append(x)
  221. test_y.append(y)
  222. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  223. pre_y = model1.predict([test_x[0],test_x[1],test_x[2]])
  224. data_load['pre'] = [np.argmax(item) for item in pre_y]
  225. error_data = data_load[data_load['re_label']!=data_load['pre']]
  226. # print(error_data.info())
  227. error_data.to_csv("C:\\Users\\admin\\Desktop\\test\\error_center.csv")
  228. def plot_loss(history):
  229. plt.plot(history.history['loss'])
  230. plt.plot(history.history['val_loss'])
  231. plt.title('Model loss')
  232. plt.ylabel('Loss')
  233. plt.xlabel('Epoch')
  234. plt.legend(['Train', 'Test'], loc='upper left')
  235. plt.show()
  236. if __name__ == '__main__':
  237. # getModel()
  238. # getModel_center()
  239. # training()
  240. # training_center()
  241. # predict()
  242. # predict_center()
  243. model1 = models.load_model("model_label_time_classify.model.hdf5",
  244. custom_objects={'precision': precision, 'recall': recall, 'f1_score': f1_score})
  245. test_x = []
  246. test_y = []
  247. left = '8675.20元人民币,(3)服务期限:'
  248. right = '(4)质量:符合竞争性磋商文件规定的质'
  249. context = [left, right]
  250. x = embedding_word(context, shape=input_shape)
  251. test_x.append(x)
  252. test_x = np.transpose(np.array(test_x), (1, 0, 2, 3))
  253. pre_y = model1.predict([test_x[0],test_x[1]])
  254. rs = [np.argmax(item) for item in pre_y]
  255. print(pre_y, rs)
  256. pass