用于文本分类的神经网络中的 K-Fold
Posted
技术标签:
【中文标题】用于文本分类的神经网络中的 K-Fold【英文标题】:K-Fold in a neural network for text classification 【发布时间】:2019-10-30 12:50:36 【问题描述】:我目前正在尝试使用带有一些自己的输入数据的神经网络进行一些文本分类。
由于我的数据集非常有限,只有大约 85 个正分类文本和 85 个负分类文本,每个文件约 1500 个单词,我被告知要对我的神经网络使用交叉验证测试来绕过过度拟合。
我开始在 YT-Videos 和指南的帮助下构建神经网络,现在我的问题是如何进行交叉验证测试。
我当前的代码如下所示:
data = pd.read_excel('dataset3.xlsx' )
max_words = 1000
tokenize = text.Tokenizer(num_words=max_words, lower=True, char_level=False)
train_size = int(len(data) * .8)
train_posts = data['Content'][:train_size]
train_tags = data['Value'][:train_size]
test_posts = data['Content'][train_size:]
test_tags = data['Value'][train_size:]
tokenize.fit_on_texts(train_posts)
x_train = tokenize.texts_to_matrix(train_posts)
x_test = tokenize.texts_to_matrix(test_posts)
encoder = LabelEncoder()
encoder.fit(train_tags)
y_train = encoder.transform(train_tags)
y_test = encoder.transform(test_tags)
num_classes = np.max(y_train) + 1
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)
batch_size = 1
epochs = 20
model = Sequential()
model.add(Dense(750, input_shape=(max_words,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs= epochs,
verbose=1,
validation_split=0.2)
我玩过
KFold(n_splits=k, shuffle=True, random_state=1).split(x_train, y_train))
但我不知道如何在神经网络本身上使用它,希望你能帮助我解决我的问题。
感谢您的问候
杰森
【问题讨论】:
【参考方案1】:你想在验证或测试时做 K-Fold 吗?
K-Fold 非常简单(你可以用 Random 自己做)。它将您的输入列表拆分为 k 个子集,返回给您 2 个数组,第一个(较大)是 (k-1) 个子集中的项目索引,第二个(较小)是第 k 个子集的索引。然后你决定如何使用它。 所以 K-Flod 所做的是,帮助您在训练和测试(或验证)之间选择最佳组合。
代码将是这样的。
kfold = KFold(n_splits=k, shuffle=True, random_state=n) # Choose yours k and n
for arr1, arr2 in kfold.split(X, y):
x_train, y_train = X[arr1], y[arr1] #
x_k, y_k = X[arr2], y[arr2] # 'x_k' should be 'x_test' or 'x_valid' depending on your purpose
# train your model
所以如果你想在验证中做 K-Fold,下一个代码将是
model = YourModel()
model.fit(X_train, y_train, validation_data=(X_k, y_k), epochs=...)
或者在测试中做 K-Fold
model = YourModel()
model.fit(X_train, y_train, epochs=...) # train without validation
# model.fit(X_train, y_train, validation_split= ... ) # train with validation
model.evaluate(X_k)
你会注意到,当使用 K-Fold 时,你训练了 k 次模型。
【讨论】:
【参考方案2】:您可以像这样使用 scikit KFold.split
:
accuracy = []
kf = KFold(n_splits=k, shuffle=True, random_state=1)
for trainIndices, testIndices in kf.split(x_train, y_train):
#Start your model
model = Sequential()
...
history = model.fit(x[trainIndices], y[trainIndices],
batch_size=batch_size,
epochs= epochs,
verbose=1,
validation_split=0.2)
prediction = model.predict(x[testIndices])
accuracy.append(accuracy_score(y[trainIndices], prediction))
# Print the mean accuracy
print(sum(accuracy)/len(accuracy))
工作原理
如果您需要有关该技术本身的更多信息,请查看here。
关于 scikit-learn 实现,kf.split
产生 k
对训练索引和测试索引。 Yielding values 表示这个函数可以像列表一样被迭代。另外,记住这个函数给你索引,所以为了训练一个模型,你必须得到这样的值:x[trainIndices]
对于每个k
模型,您将计算此训练模型在测试分区上的准确度[*]。之后,您可以计算平均准确度以确定模型的整体准确度。
[*] 为此,我使用了来自 scikit learn 的 accuracy score,但这可以手动完成。
【讨论】:
以上是关于用于文本分类的神经网络中的 K-Fold的主要内容,如果未能解决你的问题,请参考以下文章