电源评论分类:二分类问题

一、加载imdb数据并解码

from keras.datasets import imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words = 10000)
 #返回一个将单词映射为整数索引的字典
word_index = imdb.get_word_index()  
 #反向字典  将整数映射为单词的字典
 #字典item()方法返回键值对列表
 #dict()函数用于形成字典
reverse_word_index = dict(
        [(value, key) for (key, value) in word_index.items()])
 #str.join(seq)将str加入序列中进行分隔
decoded_review = ' '.join(
        [reverse_word_index.get(i-3, '?') for i in x_train[0]])

二、one-hot编码

#若包含某单词索引,将之对应位置1,不包含频率和顺序信息
def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences),dimension))
    for i, sequence in enumerate(sequences):
        results[i,sequence] = 1.     
    return results
    
x_train = vectorize_sequences(x_train)
x_test = vectorize_sequences(x_test)
y_train = np.asarray(y_train).astype('float32')
y_test = np.asarray(y_test).astype('float32')

三、搭建模型及训练

#搭建两层大小为16的全连接层,输出采样sigmoid,可解释为概率大小
model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(
        optimizer=optimizers.RMSprop(lr=0.001),
        loss='binary_crossentropy',
        metrics=['accuracy'])
 
#划分出验证集
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
history = model.fit(partial_x_train, partial_y_train, batch_size=512,epochs=20, validation_data=(x_val, y_val))

四、展示

'''
Sequential.fit()返回History object,History.history为一字典,包含训练过程中的所有数据
'''
import matplotlib.pyplot as plt
history_dict = history.history
loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
acc_values = history_dict['acc']
val_acc_values = history_dict['val_acc']

epochs = range(1, len(loss_values)+1)
plt.plot(epochs, loss_values, 'bo', label='Training loss') #bo表示蓝色圆点
plt.plot(epochs, val_loss_values, 'b', label='Validation loss') #bo表示蓝色圆点
plt.title('Training and Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()


epochs = range(1, len(acc_values)+1)
plt.figure()
plt.plot(epochs, acc_values, 'bo', label='Training accuracy') #bo表示蓝色圆点
plt.plot(epochs, val_acc_values, 'b', label='Validation accuracy') #bo表示蓝色圆点
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()

五、不同编码比较
1、one_hot编码
在大约第三轮的时候大到验证集精度最大
在这里插入图片描述
2、由于onehot不包括单词的频率信息,修改将单词频率信息包含在内并归一化
一些常用词汇出现较多可能有较大不好的影响

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences),dimension))
    for i, sequence in enumerate(sequences):
        for j in sequence:
            results[i,j] += 1.
    return results

x_train = vectorize_sequences(x_train)
x_test = vectorize_sequences(x_test)
max_train = max([max(seq) for seq in x_train])
max_test = max([max(seq) for seq in x_test])
max_num = max(max_train, max_test)
x_train /= max_num
x_test /= max_num

在这里插入图片描述
3、使用sklearn规范化

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences),dimension))
    for i, sequence in enumerate(sequences):
        for j in sequence:
            results[i,j] += 1.
    return results

x_train = vectorize_sequences(x_train)
x_test = vectorize_sequences(x_test)
#标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)

在这里插入图片描述
六、分析

1、带有 relu 激活的 Dense 层堆叠,可以解决很多种问题(包括情感分类),可能会经 常用到这种模型
2、对于二分类问题(两个输出类别),网络的最后一层应该是只有一个单元并使用 sigmoid 3、激活的 Dense 层,网络输出应该是
0~1 范围内的标量,表示概率值。 4、对于二分类问题的 sigmoid 标量输出,你应该使用 binary_crossentropy
损失函数 5、无论你的问题是什么,rmsprop 优化器通常都是足够好的选择。这一点你无须担心。
6、随着神经网络在训练数据上的表现越来越好,模型最终会过拟合,并在前所未见的数据
上得到越来越差的结果。一定要一直监控模型在训练集之外的数据上的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值