File size: 2,741 Bytes
702bd2c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
import pandas as pd
from fastapi.middleware.cors import CORSMiddleware

# 1. Uygulamayı Başlat
app = FastAPI(title="Credit Risk API", description="Kredi Risk Tahmin Modeli Servisi")

# 2. CORS Ayarları (Frontend'in bu API'ye erişebilmesi için gerekli)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Güvenlik için gerçek projede sadece frontend URL'ini yazın
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 3. Eğitilmiş Modeli Yükle
try:
    model = joblib.load('credit_risk_model.pkl')
    print("Model başarıyla yüklendi.")
except Exception as e:
    print(f"Model yüklenirken hata oluştu: {e}")
    # Hata durumunda boş bir model değişkeni (Uygulama çökmesin diye)
    model = None

# 4. Veri Modeli (Frontend'den beklenen veri formatı)
# Buradaki isimler CSV'deki kolon isimleriyle birebir aynı olmalı.
class LoanApplication(BaseModel):
    person_age: int
    person_income: float
    person_home_ownership: str  # Örn: RENT, OWN, MORTGAGE
    person_emp_length: float
    loan_intent: str            # Örn: EDUCATION, MEDICAL, VENTURE
    loan_grade: str             # Örn: A, B, C, D
    loan_amnt: float
    loan_int_rate: float
    loan_percent_income: float
    cb_person_default_on_file: str # Y veya N
    cb_person_cred_hist_length: int

# 5. Ana Sayfa (Health Check)
@app.get("/")
def read_root():
    return {"message": "Credit Risk API Çalışıyor! /docs adresine giderek test edebilirsin."}

# 6. Tahmin Endpoint'i
@app.post("/predict")
def predict_risk(data: LoanApplication):
    if not model:
        raise HTTPException(status_code=500, detail="Model yüklenemedi, sunucu hatası.")

    # Gelen veriyi (JSON) Pandas DataFrame'e çevir
    # Çünkü modelimiz (Pipeline) DataFrame bekliyor.
    input_df = pd.DataFrame([data.dict()])

    try:
        # Tahmin Yap
        prediction = model.predict(input_df)[0]        # 0 veya 1 döner
        probability = model.predict_proba(input_df)[0][1] # 1 olma (Batık) ihtimali

        # Sonucu Hazırla
        result = {
            "prediction": int(prediction),
            "risk_score": round(float(probability), 4),
            "risk_status": "Yüksek Risk (Red)" if prediction == 1 else "Düşük Risk (Onay)",
            "risk_percentage": f"%{round(probability * 100, 2)}"
        }
        return result

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Tahmin sırasında hata: {str(e)}")

# Bu dosya 'python main.py' ile çalıştırılırsa uvicorn'u tetikle
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)