我正在研究DistillBert项目的二进制分类。我尝试使用垃圾短信数据集运行以下代码(您也可以使用IMDB数据集,它也会出现同样的问题),我尝试找出召回率、精度和AUC得分。但是,我得到了一个值错误。
这里我使用了BinaryCrossentropy
损失函数和Adam
优化器。
数据集:这里使用的数据集是垃圾短信数据集,它的二进制标签为0表示标准短信,1表示垃圾短信。使用IMDB数据集可以重现相同的错误。
错误:
ValueError: Shapes (426530, 2) and (1930, 2) are incompatible
我在运行包含以下代码的选项卡时遇到此错误:
m = tf.keras.metrics.Recall()
m.update_state(y_test_encoded, y_pred)
m.result().numpy()
此处y_pred是预测标签,y_test_encoded是单热点编码的地面实况标签。此处用于预测的test_dataset
是使用from_tensor_slices转换为TensorFlow数据集的标记化测试数据。我假设问题是由于预测标签和地面实况标签的形状不同。
编码:
import pandas as pd
import tensorflow as tf
import transformers
from transformers import DistilBertTokenizer
from transformers import TFAutoModelForSequenceClassification
pd.set_option('display.max_colwidth', None)
MODEL_NAME = 'distilbert-base-uncased'
BATCH_SIZE = 8
N_EPOCHS = 3
train = pd.read_csv("train_set.csv", error_bad_lines=False)
test = pd.read_csv("test_set.csv", error_bad_lines=False)
X_train = train.text
X_test = test.text
y_train = train.label
y_test = test.label
#One-hot encoding of labels
y_train_encoded = tf.one_hot(y_train.values, 2)
y_test_encoded = tf.one_hot(y_test.values, 2)
tokenizer = DistilBertTokenizer.from_pretrained(MODEL_NAME)
train_encodings = tokenizer(list(X_train.values),
truncation=True,
padding=True)
test_encodings = tokenizer(list(X_test.values),
truncation=True,
padding=True)
train_dataset =
tf.data.Dataset.from_tensor_slices((dict(train_encodings),list(y_train_encoded)))
test_dataset =
tf.data.Dataset.from_tensor_slices((dict(test_encodings),list(y_test_encoded)))
test_dataset2 = test_dataset.shuffle(buffer_size=1024).take(1000).batch(16)
model = TFAutoModelForSequenceClassification.from_pretrained(MODEL_NAME)
optimizerr = tf.keras.optimizers.Adam(learning_rate=5e-5)
losss = tf.keras.losses.BinaryCrossentropy((from_logits=True)
model.compile(optimizer=optimizerr,
loss=losss,
metrics=['accuracy'])
print("Evaluate Base model on test data")
results = model.evaluate(test_dataset2)
print("test loss, test acc:", results)
model.fit(train_dataset.shuffle(len(X_train)).batch(BATCH_SIZE),
epochs=N_EPOCHS,
batch_size=BATCH_SIZE)
predictions = model.predict(test_dataset)
y_pred = tf.round(tf.nn.sigmoid(predictions.logits))
m = tf.keras.metrics.Recall()
m.update_state(y_test_encoded, rounded_predictions)
m.result().numpy()
# This is where I getting the above-mentioned error.
如何修复错误并获得召回率、精确度和AUC评分?
1条答案
按热度按时间xam8gpfp1#
OP是在测试集上进行预测,但将预测与原始的较大数据集进行比较。
变更:
要在
.predict()
上包含数据集中的标签,请执行以下操作: