Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

SimonC03/QuotePredictor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

2 Commits

Repository files navigation

QuotePredictFull

Det här är mitt ML-projekt för att förutsäga om en offert blir vunnen eller förlorad baserat på historiska offerter.

Målet är att kunna:

  • ladda in gamla offerter och deras utfall
  • träna om modellen löpande när ny facit-data kommer in
  • skicka in en ny offert-PDF och få sannolikhet för vinst
  • förhandsgranska historiska offerter, deras key points och outcome

Hur projektet fungerar

Flödet är:

  1. Jag samlar historiska data (dummy-data eller riktiga data).
  2. Offerter sparas i SQLite (data/app.db) med features + utfall.
  3. Modellen tränas på alla rader som har känt utfall.
  4. Vid ny offert extraheras samma features och modellen räknar ut vinstsannolikhet.

Appen körs i Streamlit via app.py.

Keys / features som modellen tränas på

De viktigaste nycklarna är:

  • TotalPrice (numerisk)
  • DeliveryTime i dagar (numerisk)
  • Industry (kategori)
  • RiskClauses antal riskklausuler (numerisk)

Target-variabeln är:

  • Won_Quote (0 = förlorad, 1 = vunnen)

När jag laddar PDF:er extraheras dessa keys automatiskt via regelbaserad texttolkning i src/extractor.py.

Hur RiskClauses beräknas

RiskClauses beräknas från offertens textinnehåll (PDF -> text) i src/extractor.py.

Jag har en lista med riskmönster (RISK_PATTERNS) och räknar hur många av dessa som matchar i texten:

  • unlimited liability
  • penalty clause
  • liquidated damages
  • termination for convenience
  • exclusive jurisdiction
  • non-standard warranty
  • late delivery penalty

Beräkningen görs i funktionen extract_risk_clauses(text):

  • texten normaliseras till lowercase
  • varje regex-mönster i RISK_PATTERNS testas mot texten
  • summan av träffarna blir värdet för RiskClauses

Kategorisering i appen

I Browse quotes kan jag filtrera på:

  • source_type (t.ex. dummy_generated, historical, historical_csv, prediction)
  • Industry
  • Outcome (Won, Lost, Unknown)

Det gör att jag kan granska både träningsdata och prediktionsdata strukturerat.

Machine learning-modeller som används

I nuvarande version används:

  • LogisticRegression från scikit-learn (klassificering win/loss)

Runt modellen används även en preprocessing-pipeline:

  • numeriska features: SimpleImputer(strategy="median")
  • kategorisk feature (Industry): SimpleImputer(strategy="most_frequent") + OneHotEncoder(handle_unknown="ignore")
  • allting byggs med ColumnTransformer + Pipeline

Modellen sparas som data/models/quote_model.joblib.

Krav för träning

För att träning ska fungera behövs:

  • minst 10 labelade rader
  • båda klasserna måste finnas (Won_Quote=0 och Won_Quote=1)
  • minst 2 exempel per klass

Snabbstart

Kör från projektmappen:

python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python scripts/generate_dummy_data.py
streamlit run app.py

generate_dummy_data.py gör automatiskt detta:

  • skapar dummy-CSV
  • skapar dummy-PDF:er + manifest
  • laddar in data i DB
  • tränar modellen direkt

Så man behöver inte ladda upp filer manuellt för att komma igång.

Manuell import (om jag vill använda egna filer)

I appen under Import historical finns två vägar:

  • PDF + manifest (filename, Won_Quote)
  • Structured CSV (TotalPrice, DeliveryTime, Industry, RiskClauses, Won_Quote)

Efter import kan modellen tränas om direkt i appen.

About

AI-powered pipeline that extracts key features from quote PDFs and predicts business outcomes based on historical data.

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /