README / README.md
Roxsas's picture
Update README.md
5373195 verified
---
title: Clasificador de Noticias Falsas con XLM-RoBERTa
sdk: static
emoji: 馃搳
colorFrom: green
colorTo: red
---
## **Documentaci贸n del Proyecto: Clasificador de Noticias Falsas con XLM-RoBERTa*
*
### **Objetivo**
Este proyecto tiene como objetivo entrenar un modelo de **Clasificaci贸n de Texto** utilizando **XLM-RoBERTa**, un modelo preentrenado de **transformers** multiling眉es, para clasificar noticias como falsas (`label = 0`) o verdaderas (`label = 1`). El modelo se entrena utilizando un conjunto de datos etiquetado de noticias y se eval煤a en un conjunto de validaci贸n para determinar su capacidad para predecir correctamente las clases de las noticias.
### **Desglose del C贸digo**
#### **1. Cargar el Conjunto de Datos**
En primer lugar, se carga el conjunto de datos desde un archivo CSV. Este dataset contiene las noticias y sus respectivas etiquetas (falsas o verdaderas). El archivo CSV se lee usando **pandas**, una librer铆a de Python para manipular datos en formato de tabla (DataFrame).
```python
df = pd.read_csv(dataset_path, on_bad_lines='skip')
```
**Par谩metro `on_bad_lines='skip'`**: Este par谩metro se utiliza para evitar que el c贸digo se caiga si hay l铆neas mal formadas en el archivo CSV. Simplemente las omite.
#### **2. Divisi贸n del Conjunto de Datos**
El conjunto de datos se divide en dos subconjuntos: uno para entrenamiento y otro para validaci贸n. **`train_test_split`** de **scikit-learn** se utiliza para esta tarea.
- **`test_size=0.2`**: Indica que el 20% de los datos se usar谩n para validaci贸n, mientras que el 80% restante se destinar谩 al entrenamiento.
- **`stratify=df['label'].tolist()`**: Asegura que las proporciones de las clases (falsas y verdaderas) sean iguales en ambos subconjuntos (estratificaci贸n).
```python
train_texts, val_texts, train_labels, val_labels = train_test_split(
df['text'].tolist(),a
df['label'].tolist(),
test_size=0.2,
random_state=42,
stratify=df['label'].tolist()
)
```
#### **3. Tokenizaci贸n de los Textos**
El modelo **XLM-RoBERTa** requiere que los textos se conviertan en tokens, es decir, en una representaci贸n num茅rica que el modelo pueda procesar. Utilizamos el tokenizador de **Hugging Face's Transformers**.
```python
train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=256)
val_encodings = tokenizer(val_texts, truncation=True, padding=True, max_length=256)
```
- **`truncation=True`**: Si un texto es m谩s largo que el m谩ximo de 256 tokens, se trunca.
- **`padding=True`**: Si un texto es m谩s corto, se rellena con un token especial para asegurarse de que todos los textos tengan la misma longitud.
- **`max_length=256`**: Limita la longitud de los textos a 256 tokens.
#### **4. Creaci贸n de un Dataset Personalizado**
Para que el modelo pueda trabajar con el conjunto de datos, se crea una clase personalizada `FakeNewsDataset` que hereda de `torch.utils.data.Dataset`. Esta clase estructura los datos para que el modelo pueda acceder a ellos durante el entrenamiento y la evaluaci贸n.
```python
class FakeNewsDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __len__(self):
return len(self.labels)
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item['label'] = torch.tensor(self.labels[idx])
return item
```
- **`__len__()`**: Devuelve la longitud del conjunto de datos (n煤mero de muestras).
- **`__getitem__()`**: Devuelve un diccionario con los datos de una muestra. Las claves son los nombres de las columnas de los tensores (`input_ids`, `attention_mask`), y se agrega tambi茅n la etiqueta (`label`).
#### **5. Modelo Personalizado: `AdvancedXLMRClassifier`**
El modelo **XLM-RoBERTa** es un modelo preentrenado de **transformers**, por lo que no es necesario entrenarlo desde cero. Sin embargo, creamos una clase personalizada que extiende el modelo base de **XLM-RoBERTa** para a帽adir una capa de clasificaci贸n adicional.
##### **Congelaci贸n de Capas**
Se congelan las primeras capas del modelo base para evitar que sus par谩metros se actualicen durante el entrenamiento. Esto es 煤til para aprovechar las representaciones preentrenadas del modelo sin tener que ajustarlas completamente.
```python
for param in self.xlm_roberta.roberta.embeddings.parameters():
param.requires_grad = False
for param in self.xlm_roberta.roberta.encoder.layer[:5].parameters():
param.requires_grad = False
```
- **`self.xlm_roberta.roberta.embeddings.parameters()`**: Congela los par谩metros de la capa de embeddings (representaciones de palabras).
- **`self.xlm_roberta.roberta.encoder.layer[:5].parameters()`**: Congela las primeras 5 capas del encoder.
##### **Arquitectura de Clasificaci贸n**
Despu茅s de la capa de **XLM-RoBERTa**, a帽adimos una red neuronal adicional (MLP) con varias capas **`Linear`**, **`BatchNorm1d`**, **`ReLU`** y **`Dropout`** para mejorar el rendimiento del modelo.
```python
self.classifier = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(self.xlm_roberta.config.hidden_size, 512),
nn.BatchNorm1d(512),
nn.ReLU(),
nn.Dropout(0.4),
nn.Linear(512, 256),
nn.BatchNorm1d(256),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, num_labels)
)
```
- **`Dropout`**: Regularizaci贸n para prevenir el sobreajuste, que apaga aleatoriamente ciertas neuronas durante el entrenamiento.
- **`Linear`**: Capa totalmente conectada que reduce la dimensi贸n del espacio de caracter铆sticas.
- **`BatchNorm1d`**: Normalizaci贸n de las activaciones para estabilizar el entrenamiento.
- **`ReLU`**: Funci贸n de activaci贸n no lineal para introducir no linealidad.
##### **M茅todo Forward**
El m茅todo **`forward`** es el que define c贸mo pasan los datos a trav茅s del modelo. Primero, obtiene las salidas de **XLM-RoBERTa**, luego toma el **[CLS] token** (el token que representa la secuencia completa) y lo pasa a trav茅s de las capas adicionales de la red neuronal.
```python
outputs = self.xlm_roberta.roberta(input_ids=input_ids, attention_mask=attention_mask, return_dict=True)
pooled_output = outputs.last_hidden_state[:, 0, :]
logits = self.classifier(pooled_output)
```
- **`last_hidden_state[:, 0, :]`**: Selecciona el **[CLS] token** de la secuencia (el primer token) como representaci贸n de toda la secuencia.
- **`self.classifier(pooled_output)`**: Pasa el token **[CLS]** por la red de clasificaci贸n.
#### **6. C谩lculo de M茅tricas Personalizadas**
Se define la funci贸n **`compute_metrics`** para evaluar el rendimiento del modelo usando m茅tricas como **precisi贸n**, **recall**, **F1 score** y **accuracy**. Adem谩s, se experimenta con diferentes umbrales de decisi贸n para las predicciones (0.4, 0.45, 0.5).
```python
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = torch.softmax(torch.tensor(logits), dim=-1)
thresholds = [0.4, 0.45, 0.5]
best_f1 = 0
best_threshold = 0.45
best_metrics = {}
for threshold in thresholds:
binary_predictions = (predictions[:, 1] > threshold).int()
precision, recall, f1, _ = precision_recall_fscore_support(labels, binary_predictions, average='binary')
if f1 > best_f1:
best_f1 = f1
best_threshold = threshold
best_metrics = {
"accuracy": accuracy_score(labels, binary_predictions),
"f1": f1,
"precision": precision,
"recall": recall
}
return best_metrics
```
#### **7. Entrenamiento del Modelo**
El **`Trainer`** es el encargado de gestionar el ciclo completo de entrenamiento y evaluaci贸n. Se le pasa el modelo, los datos, y los par谩metros de entrenamiento. Tambi茅n se configura el **early stopping** para detener el entrenamiento si la m茅trica de evaluaci贸n no mejora despu茅s de un n煤mero definido de 茅pocas.
```python
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
data_collator=data_collator,
compute_metrics=compute
_metrics,
callbacks=[early_stopping]
)
trainer.train()
```
**`early_stopping`** es una funci贸n de callback que detiene el entrenamiento si la m茅trica **F1** no mejora despu茅s de 3 茅pocas consecutivas.
#### **8. Guardado del Modelo**
Una vez entrenado el modelo, se guarda tanto el modelo como el tokenizador para su reutilizaci贸n posterior:
```python
model.save_pretrained('./results')
tokenizer.save_pretrained('./results')
```
#### **9. Evaluaci贸n Final**
Se eval煤a el modelo en el conjunto de validaci贸n usando la funci贸n **`evaluate`** del **Trainer**, que devuelve las m茅tricas de rendimiento.
```python
results = trainer.evaluate()
print("Resultados de evaluaci贸n:", results)
```
---
### **Conclusi贸n**
Este c贸digo utiliza t茅cnicas avanzadas como **fine-tuning** de un modelo preentrenado de **XLM-RoBERTa**, congelaci贸n de capas, **early stopping**, y c谩lculo de m茅tricas personalizadas para clasificar noticias como verdaderas o falsas. El modelo es afinado para este conjunto de datos espec铆fico, y su rendimiento se eval煤a con precisi贸n, recall, **F1 score** y **accuracy**.
Este enfoque proporciona una soluci贸n eficiente y efectiva para el problema de clasificaci贸n de texto en problemas de desinformaci贸n, utilizando modelos de lenguaje de 煤ltima generaci贸n.