【深度学习基础】数据集&评估指标

一、数据集

在机器学习和自然语言处理(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)

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值