Showing posts with label Transformers. Show all posts
Showing posts with label Transformers. Show all posts

Friday, July 21, 2023

Anomaly Detection with Transformers: Identifying Outliers in Time Series Data

 Anomaly detection with Transformers involves using transformer-based models, such as BERT or GPT, to identify outliers or anomalies in time series data. One popular approach is to use the transformer model to learn the patterns in the time series data and then use a thresholding method to identify data points that deviate significantly from these patterns.


In this example, we'll use the PyTorch library along with the Transformers library to create a simple anomaly detection model using BERT. We'll use a publicly available time series dataset from the Numenta Anomaly Benchmark (NAB) for demonstration purposes.


Make sure you have the necessary libraries installed:



pip install torch transformers numpy pandas matplotlib

Here's the Python code for the anomaly detection example:



import torch

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from transformers import BertTokenizer, BertForSequenceClassification


# Load the NAB dataset (or any other time series dataset)

# Replace 'nyc_taxi.csv' with your dataset filename or URL

data = pd.read_csv('https://raw.githubusercontent.com/numenta/NAB/master/data/realKnownCause/nyc_taxi.csv')

time_series = data['value'].values


# Normalize the time series data

mean, std = time_series.mean(), time_series.std()

time_series = (time_series - mean) / std


# Define the window size for each input sequence

window_size = 10


# Prepare the input sequences and labels

sequences = []

labels = []

for i in range(len(time_series) - window_size):

    seq = time_series[i:i+window_size]

    sequences.append(seq)

    labels.append(1 if time_series[i+window_size] > 3 * std else 0)  # Threshold-based anomaly labeling


# Convert sequences and labels to tensors

sequences = torch.tensor(sequences)

labels = torch.tensor(labels)


# Load the BERT tokenizer and model

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

model = BertForSequenceClassification.from_pretrained('bert-base-uncased')


# Tokenize the sequences and pad them to the same length

inputs = tokenizer.batch_encode_plus(

    sequences.tolist(),

    add_special_tokens=True,

    padding=True,

    truncation=True,

    max_length=window_size,

    return_tensors='pt'

)


# Perform the anomaly detection with BERT

outputs = model(**inputs, labels=labels.unsqueeze(1))

loss = outputs.loss

logits = outputs.logits

probabilities = torch.sigmoid(logits).squeeze().detach().numpy()


# Plot the original time series and the anomaly scores

plt.figure(figsize=(12, 6))

plt.plot(data['timestamp'], time_series, label='Original Time Series')

plt.plot(data['timestamp'][window_size:], probabilities, label='Anomaly Scores', color='red')

plt.xlabel('Timestamp')

plt.ylabel('Value')

plt.legend()

plt.title('Anomaly Detection with Transformers')

plt.show()

This code loads the NYC taxi dataset from the Numenta Anomaly Benchmark (NAB), normalizes the data, and creates sequences of fixed window sizes. The model then learns to classify each sequence as an anomaly or not, using threshold-based labeling. The anomaly scores are plotted on top of the original time series data.


Note that this is a simplified example, and more sophisticated anomaly detection models and techniques can be used in practice. Additionally, fine-tuning the model on a specific anomaly dataset may improve its performance. However, this example should give you a starting point for anomaly detection with Transformers on time series data.

Transformers for Time Series Forecasting: Predicting Stock Prices with AI Example

 Transformers have shown promising results in various natural language processing (NLP) tasks, but they can also be adapted for time series forecasting. Let's take a look at an example of using a transformer model for predicting stock prices using Python and the PyTorch library. In this example, we'll use the 'transformers' library, which contains pre-trained transformer models.


First, make sure you have the required libraries installed:

pip install torch transformers numpy pandas

Now, let's proceed with the code example:

import numpy as np import pandas as pd from transformers import BertTokenizer, BertForSequenceClassification from torch.utils.data import DataLoader, TensorDataset import torch # Load the stock price data (for illustration purposes, you should have your own dataset) # The dataset should have two columns: 'Date' and 'Price'. data = pd.read_csv('stock_price_data.csv') data['Date'] = pd.to_datetime(data['Date']) data.sort_values('Date', inplace=True) data.reset_index(drop=True, inplace=True) # Normalize the stock prices data['Price'] = (data['Price'] - data['Price'].min()) / (data['Price'].max() - data['Price'].min()) # Prepare the data for training window_size = 10 # Number of past prices to consider for each prediction X, y = [], [] for i in range(len(data) - window_size): X.append(data['Price'][i:i + window_size].values) y.append(data['Price'][i + window_size]) X, y = np.array(X), np.array(y) # Convert the data to PyTorch tensors X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) # Define the transformer model model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=1) # Define the tokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # Tokenize the inputs input_ids = [] attention_masks = [] for seq in X: encoded_dict = tokenizer.encode_plus( seq.tolist(), add_special_tokens=True, max_length=window_size, padding='max_length', return_attention_mask=True, return_tensors='pt', ) input_ids.append(encoded_dict['input_ids']) attention_masks.append(encoded_dict['attention_mask']) input_ids = torch.cat(input_ids, dim=0) attention_masks = torch.cat(attention_masks, dim=0) # Create the DataLoader dataset = TensorDataset(input_ids, attention_masks, y) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) # Define the loss function and optimizer loss_function = torch.nn.MSELoss() optimizer = torch.optim.AdamW(model.parameters(), lr=1e-5) # Training loop num_epochs = 10 for epoch in range(num_epochs): total_loss = 0 for batch in dataloader: model.zero_grad() inputs = {'input_ids': batch[0], 'attention_mask': batch[1]} outputs = model(**inputs) predicted_prices = outputs.logits.squeeze(1) loss = loss_function(predicted_prices, batch[2]) total_loss += loss.item() loss.backward() optimizer.step() print(f'Epoch {epoch + 1}/{num_epochs}, Loss: {total_loss:.4f}') # Make predictions on future data num_future_points = 5 future_data = data['Price'][-window_size:].values for _ in range(num_future_points): inputs = torch.tensor(future_data[-window_size:], dtype=torch.float32).unsqueeze(0) inputs = inputs.unsqueeze(0) with torch.no_grad(): outputs = model(inputs) predicted_price = outputs.logits.item() future_data = np.append(future_data, predicted_price) # De-normalize the data future_data = future_data * (data['Price'].max() - data['Price'].min()) + data['Price'].min() print("Predicted stock prices for the next", num_future_points, "days:") print(future_data[-num_future_points:])



The key part where transformers make a difference in this example is during tokenization and sequence processing. In this case, we are using the BertTokenizer to convert the historical stock prices into tokenized sequences suitable for feeding into the BertForSequenceClassification model.

Transformers, like BERT, are designed to handle sequential data with dependencies between the elements. By using transformers, we are allowing the model to capture long-range dependencies and patterns within the stock price time series. The model can learn to consider not only the immediate past prices but also the relationships between various historical prices in the window_size to make better predictions.

Using traditional methods like ARIMA or even feedforward neural networks might not be as effective in capturing such long-range dependencies, especially when dealing with large time series data. Transformers' self-attention mechanism allows them to attend to relevant parts of the input sequence and learn meaningful representations, which can be crucial for accurate time series forecasting.


ASP.NET Core

 Certainly! Here are 10 advanced .NET Core interview questions covering various topics: 1. **ASP.NET Core Middleware Pipeline**: Explain the...