finsight-ai / quick_train.py
mustdo's picture
Fix label mapping, retrain model (99.26% accuracy), fix Confidence DNA display, add src/ config/ and training scripts
3aaddda
Raw
History Blame Contribute Delete
8.01 kB
# -*- coding: utf-8 -*-
"""
QUICK TRAINING - Just 2 epochs to fix basic predictions
"""
import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
# Check GPU
print("Checking GPU...")
gpus = tf.config.list_physical_devices('GPU')
if gpus:
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
print(f"Using GPU: {len(gpus)} device(s)")
else:
print("Using CPU")
print("\n[1/4] Creating diverse training dataset with SYNONYMS...")
# POSITIVE examples - diverse synonyms and sentence structures
positive = [
# Growth & Increase (synonyms)
"profit increased", "profit grew", "profit rose", "profit surged", "profit jumped",
"revenue increased", "revenue grew", "revenue climbed", "revenue soared", "revenue expanded",
"earnings increased", "earnings rose", "earnings improved", "earnings advanced", "earnings gained",
"sales went up", "sales grew", "sales increased", "sales rose", "sales climbed",
# Performance (variations)
"beat expectations", "exceeded expectations", "surpassed estimates", "outperformed forecasts",
"strong performance", "excellent results", "outstanding quarter", "impressive growth",
"record profits", "record earnings", "all-time high", "best quarter ever",
# Market Response
"stock surged", "stock rallied", "stock jumped", "stock soared", "stock climbed",
"share price increased", "shares rose", "stock gained ground", "price went up",
# Positive Operations
"expansion successful", "growth accelerated", "momentum building", "outlook positive",
"dividend raised", "dividend increased", "payout grew", "shareholder returns up",
"cash flow improved", "liquidity strong", "margins expanded", "margins improved",
"demand strong", "demand robust", "demand growing", "orders increasing",
# Sentiment & Outlook
"optimistic outlook", "positive guidance", "bullish forecast", "confident projections",
"rating upgraded", "analyst upgrade", "price target raised", "buy recommendation",
"investor confidence", "market optimism", "strong fundamentals", "healthy balance sheet",
# Competitive Advantage
"market share gained", "competitive edge", "industry leader", "outperforming peers",
"innovation success", "product launch successful", "new contract won", "strategic partnership"
] * 10 # 500+ examples
# NEGATIVE examples - diverse synonyms and sentence structures
negative = [
# Decline & Decrease (synonyms)
"profit declined", "profit fell", "profit dropped", "profit plunged", "profit decreased",
"revenue declined", "revenue fell", "revenue dropped", "revenue slumped", "revenue contracted",
"earnings declined", "earnings fell", "earnings dropped", "earnings disappointed", "earnings missed",
"sales went down", "sales fell", "sales dropped", "sales declined", "sales weakened",
# Performance (variations)
"missed expectations", "below estimates", "disappointed investors", "underperformed forecasts",
"weak performance", "poor results", "disappointing quarter", "struggles continue",
"losses reported", "operating loss", "net loss", "unprofitable quarter",
# Market Response
"stock plunged", "stock crashed", "stock dropped", "stock fell", "stock declined",
"share price decreased", "shares fell", "stock lost ground", "price went down",
# Negative Operations
"growth slowed", "growth stalled", "momentum fading", "outlook negative",
"dividend cut", "dividend reduced", "payout decreased", "dividend suspended",
"cash flow weak", "liquidity concerns", "margins compressed", "margins shrinking",
"demand falling", "demand weak", "demand declining", "orders decreasing",
# Sentiment & Outlook
"pessimistic outlook", "negative guidance", "bearish forecast", "concerning projections",
"rating downgraded", "analyst downgrade", "price target lowered", "sell recommendation",
"investor concern", "market pessimism", "weak fundamentals", "debt concerns",
# Competitive Challenges
"market share lost", "losing ground", "competition intensifying", "underperforming sector",
"product recall", "legal troubles", "regulatory issues", "management shakeup",
"layoffs announced", "restructuring needed", "cost cutting", "bankruptcy risk"
] * 10 # 500+ examples
# NEUTRAL examples - factual statements without sentiment
neutral = [
# Announcements
"results announced", "earnings released", "report published", "data disclosed",
"meeting scheduled", "conference planned", "presentation set", "call scheduled",
"announcement made", "statement released", "update provided", "filing submitted",
# Changes & Transitions
"CEO appointed", "board member joined", "executive hired", "leadership change",
"policy updated", "strategy revised", "process modified", "system upgraded",
# Status & Operations
"operations continue", "business as usual", "steady performance", "stable operations",
"unchanged revenue", "flat growth", "status quo maintained", "guidance maintained",
"trading halted", "trading resumed", "stock split announced", "merger proposed",
# Factual Information
"company based in", "founded in", "operates in", "headquartered in",
"market cap is", "employee count", "revenue reported", "quarter ended",
"fiscal year", "financial statement", "balance sheet", "income statement",
# Neutral Events
"partnership formed", "acquisition completed", "deal finalized", "agreement signed",
"investigation ongoing", "review in progress", "audit scheduled", "compliance check",
"dividend date set", "earnings date scheduled", "AGM planned", "vote pending"
] * 10 # 400+ examples
# Create balanced dataset
df = pd.DataFrame({
'text': positive + negative + neutral,
'label': [2]*len(positive) + [0]*len(negative) + [1]*len(neutral) # 0=Neg, 1=Neu, 2=Pos
})
print(f"Total: {len(df)} samples")
print(f" - Positive: {len(positive)} (includes 'growth', 'increased', 'surged', etc.)")
print(f" - Negative: {len(negative)} (includes 'decline', 'fell', 'dropped', etc.)")
print(f" - Neutral: {len(neutral)} (factual statements)")
print(f"[OK] Model will learn SYNONYMS and variations!")
# Split
train_texts, val_texts, train_labels, val_labels = train_test_split(
df['text'].tolist(), df['label'].tolist(),
test_size=0.2, random_state=42, stratify=df['label']
)
print(f"\n[2/4] Tokenizing...")
tokenizer = AutoTokenizer.from_pretrained("ProsusAI/finbert")
train_encodings = tokenizer(train_texts, truncation=True, padding="max_length", max_length=64, return_tensors="tf")
val_encodings = tokenizer(val_texts, truncation=True, padding="max_length", max_length=64, return_tensors="tf")
train_dataset = tf.data.Dataset.from_tensor_slices((dict(train_encodings), tf.constant(train_labels))).shuffle(500).batch(32)
val_dataset = tf.data.Dataset.from_tensor_slices((dict(val_encodings), tf.constant(val_labels))).batch(32)
print("\n[3/4] Training (4 epochs for better synonym learning)...")
tf.keras.backend.clear_session()
model = TFAutoModelForSequenceClassification.from_pretrained("ProsusAI/finbert", num_labels=3)
model.compile(
optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=["accuracy"]
)
history = model.fit(train_dataset, validation_data=val_dataset, epochs=4, verbose=1)
print("\n[4/4] Saving...")
os.makedirs("financial_sentiment_model", exist_ok=True)
model.save_pretrained("financial_sentiment_model")
tokenizer.save_pretrained("financial_sentiment_model")
import json
with open("financial_sentiment_model/label_map.json", "w") as f:
json.dump({"0": "Negative", "1": "Neutral", "2": "Positive"}, f)
print("\n" + "="*60)
print("DONE! Model saved to financial_sentiment_model/")
print("="*60)