AI_RISK_ANALYST / app.py
gaur3009's picture
Create app.py
ff484e8 verified
raw
history blame
5 kB
import gradio as gr
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
import torch
from torch import nn
from torch.autograd import Variable
# GAN-based anomaly detection for financial analysis
class GANRiskAnalyzer:
def __init__(self, input_dim, hidden_dim, output_dim):
self.generator = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, output_dim),
nn.Tanh()
)
self.discriminator = nn.Sequential(
nn.Linear(output_dim, hidden_dim),
nn.LeakyReLU(0.2),
nn.Linear(hidden_dim, 1),
nn.Sigmoid()
)
self.loss = nn.BCELoss()
self.generator_optimizer = torch.optim.Adam(self.generator.parameters(), lr=0.0002)
self.discriminator_optimizer = torch.optim.Adam(self.discriminator.parameters(), lr=0.0002)
def train(self, data, epochs=100):
real_labels = Variable(torch.ones(data.size(0), 1))
fake_labels = Variable(torch.zeros(data.size(0), 1))
for epoch in range(epochs):
# Train Discriminator
self.discriminator_optimizer.zero_grad()
real_data = Variable(data)
real_output = self.discriminator(real_data)
real_loss = self.loss(real_output, real_labels)
z = Variable(torch.randn(data.size(0), data.size(1)))
fake_data = self.generator(z)
fake_output = self.discriminator(fake_data.detach())
fake_loss = self.loss(fake_output, fake_labels)
d_loss = real_loss + fake_loss
d_loss.backward()
self.discriminator_optimizer.step()
# Train Generator
self.generator_optimizer.zero_grad()
fake_output = self.discriminator(fake_data)
g_loss = self.loss(fake_output, real_labels)
g_loss.backward()
self.generator_optimizer.step()
def generate(self, n_samples, input_dim):
z = Variable(torch.randn(n_samples, input_dim))
generated_data = self.generator(z)
return generated_data.detach().numpy()
# Risk Analysis
def analyze_financial_data(file):
# Load CSV data
data = pd.read_csv(file)
# Check required columns
required_columns = ["Revenue", "Profit", "Loss", "Expenses", "Risk_Level"]
if not all(column in data.columns for column in required_columns):
return "The uploaded CSV must include these columns: Revenue, Profit, Loss, Expenses, Risk_Level."
# Data Preprocessing
X = data[["Revenue", "Profit", "Loss", "Expenses"]]
y = data["Risk_Level"]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Dimensionality Reduction
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# Train-Test Split
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42)
# Gradient Boosting Classifier
model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=5)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred, output_dict=True)
# GAN-based Anomaly Detection
gan = GANRiskAnalyzer(input_dim=X_pca.shape[1], hidden_dim=128, output_dim=X_pca.shape[1])
gan.train(torch.tensor(X_pca, dtype=torch.float32), epochs=200)
anomalies = gan.generate(n_samples=5, input_dim=X_pca.shape[1])
# Analysis Insights
total_revenue = data["Revenue"].sum()
total_profit = data["Profit"].sum()
total_loss = data["Loss"].sum()
insights = {
"Accuracy": f"{accuracy * 100:.2f}%",
"Classification Report": report,
"Generated Anomalies (GAN)": anomalies.tolist(),
"Financial Summary": {
"Total Revenue": f"${total_revenue:,.2f}",
"Total Profit": f"${total_profit:,.2f}",
"Total Loss": f"${total_loss:,.2f}",
"Net Balance": f"${(total_revenue - total_loss):,.2f}"
}
}
return insights
with gr.Blocks(theme=gr.themes.Monochrome()) as interface:
gr.Markdown("# **AI Risk Analyst Agent**")
gr.Markdown(
"Analyze your financial risks and identify anomalies using advanced AI models. Upload financial data in CSV format to get started."
)
with gr.Row():
with gr.Column():
data_file = gr.File(label="Upload Financial Data (CSV)")
submit_button = gr.Button("Analyze")
with gr.Column():
output = gr.JSON(label="Risk Analysis Insights")
submit_button.click(analyze_financial_data, inputs=[data_file], outputs=output)
interface.launch()