一、数据集
在机器学习和自然语言处理(NLP)领域中,数据通常被分成三个文件:train.tsv、dev.tsv和test.tsv,并放在一个名为data的目录下。这种划分有助于模型的训练和评估。
train.tsv:训练数据集
用于训练机器学习模型。这个文件包含大部分的数据,模型通过学习这些数据中的模式和关系来调整其参数。
dev.tsv:开发数据集(也称验证数据集)
用于模型的验证和调优。训练过程中,模型会在dev数据集上进行验证,以评估其在未见过的数据上的表现,并用于调整超参数和防止过拟合。
test.tsv:测试数据集
用于最终评估模型的性能。在模型训练和调优完成后,使用test数据集来评估模型的泛化能力,确保模型在实际应用中具有良好的表现。
二、评估指标
评估指标
在文本分类任务中,常用的评估指标包括:
损失(Loss):模型在验证集上的平均损失。
准确率(Accuracy):分类正确的样本数占总样本数的比例。
精确率(Precision):分类器预测为正类的样本中实际为正类的比例。
召回率(Recall):实际为正类的样本中被正确分类的比例。
F1分数(F1 Score):精确率和召回率的调和平均数。
import pandas as pd
from sklearn.model_selection import train_test_split
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
# 读取数据
data = pd.read_csv('/mnt/data/processed_example2.txt', delimiter='\t', header=None, names=['Sentence', 'Label'])
# 标签映射
label_map = {1: 0, 2: 1, 3: 2, 4: 3, 5: 4}
data['Label'] = data['Label'].map(label_map)
# 分割数据集
train_val_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
train_data, val_data = train_test_split(train_val_data, test_size=0.1, random_state=42)
# 使用BERT的Tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
def tokenize_data(data):
return tokenizer(data['Sentence'].tolist(), padding=True, truncation=True, return_tensors='pt')
train_encodings = tokenize_data(train_data)
val_encodings = tokenize_data(val_data)
test_encodings = tokenize_data(test_data)
train_labels = train_data['Label'].tolist()
val_labels = val_data['Label'].tolist()
test_labels = test_data['Label'].tolist()
class SentenceDataset(Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.labels)
train_dataset = SentenceDataset(train_encodings, train_labels)
val_dataset = SentenceDataset(val_encodings, val_labels)
test_dataset = SentenceDataset(test_encodings, test_labels)
# 定义模型
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=5)
# 计算指标的函数
def compute_metrics(pred):
labels = pred.label_ids
preds = pred.predictions.argmax(-1)
precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='weighted')
acc = accuracy_score(labels, preds)
return {
'accuracy': acc,
'f1': f1,
'precision': precision,
'recall': recall
}
# 定义训练参数
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
evaluation_strategy="epoch",
save_strategy="epoch"
)
# 定义Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
compute_metrics=compute_metrics
)
# 模型训练
trainer.train()
# 模型评估
results = trainer.evaluate(eval_dataset=test_dataset)
# 输出评估结果
print(results)