对IMDB数据集 :
首先就是对序列进行补全,然后利用embedding(随机初始化词向量) 喂入网络,平均池化,16维的全连接和1维的输出层
import keras
imdb = keras.datasets.imdb
import tensorflow as tf
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
#序列预处理,post是在末尾填充0,长的截断,短的补0,截取前面的
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
value=0,
padding='post',
maxlen=256,
truncating='pre')
test_data = keras.preprocessing.sequence.pad_sequences(test_data,
value=0,
padding='post',
maxlen=256,
truncating='pre')
# (25000, 256)
print(train_data.shape)
#词汇表大小
vocab_size=10000
model=keras.Sequential()
#embedding层,词向量大小16
model.add(keras.layers.Embedding(vocab_size,16))
#平均池化
model.add(keras.layers.GlobalAveragePooling1D())
#全连接层
model.add(keras.layers.Dense(16,activation=tf.nn.relu))
model.add(keras.layers.Dense(1,activation=tf.nn.sigmoid))
model.summary()
#优化器,损失函数
model.compile(optimizer=tf.train.AdamOptimizer(),loss='binary_crossentropy',metrics=['accuracy'])
#feed data
history = model.fit(train_data,
train_labels,
epochs=40,
batch_size=1000,
validation_split=0.2,
verbose=1)
#评估
result=model.evaluate(test_data,test_labels)
print(result)
#创建准确率和损失随时间变化的图
history_dict = history.history
print(history_dict.keys())
import matplotlib.pyplot as plt
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1,len(acc)+1)
#loss
plt.plot(epochs,loss,'bo',label='Train loss')
plt.plot(epochs,val_loss,'b',label='validate loss')
plt.title('Train and validate loss')
plt.xlabel('epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
#acc
plt.plot(epochs,acc,label='train acc')
plt.plot(epochs,val_acc,label='train acc')
plt.legend()
plt.show()
对cnews:
处理过程,首先通过content构建词汇表(前5000),然后把content转成词汇表的id,并且对content进行序列标准化,长度为600,最后喂如text_cnn,对字进行embedding,训练得到结果。
参考:https://blog.csdn.net/u011439796/article/details/77692621
Roc曲线:参考:https://www.cnblogs.com/dlml/p/4403482.html
横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例
y轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率)
绘制ROC曲线就是通过划分不同的阀值,得出x,y的值,这样的曲线与右半部分围成的面积就是AUC,不会随着类别分布的改变而改变,但负例N增加了很多,而曲线却没变,这等于产生了大量FP。像信息检索中如果主要关心正例的预测准确性的话,这就不可接受了。
使用场景
ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
使用场景:参考 https://www.imooc.com/article/48072
如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。
如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。
最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。