Ford Otosan staj projesi · Garanti taleplerini kaydedildikleri anda otomatik karara bağlayan, sızıntısız ve açıklanabilir bir makine öğrenmesi hattı.
Bir garanti talebi açıldığında sonucu bugün ortalama 16 gün sonra belli oluyor. WARRANTYAI bu kararı talep kaydedildiği anda üretir ve üç sınıftan birine atar: ONAY, MANUEL_ONAY, RED.
- Problem
- Sonuçlar
- Projenin temel ilkesi
- Tasarım kararları
- Kurulum
- Kullanım
- Çıktılar
- Veri şeması
- Bilinen sınırlar
- Yol haritası
| Talep hacmi | ~173 talep/gün, tamamı elle karara bağlanıyor |
| Karar süresi | medyan 16 gün (dt_completed_date − dt_registration_date) |
| Sonuç dağılımı | ONAY %73,2 · MANUEL_ONAY %12,1 · RED %14,8 |
Taleplerin büyük çoğunluğu sonunda zaten onaylanıyor; buna rağmen hepsi aynı manuel süreçten geçiyor. Amaç kararı hızlandırmak değil, otomatikleştirmek.
Aşağıdaki değerler sentetik veri üzerinde ölçülmüştür (bkz. Bilinen sınırlar).
| Metrik | Değer |
|---|---|
| ROC-AUC (ovr, macro) | 0,623 |
| Accuracy | 0,724 |
| Baseline ("hep ONAY") | 0,723 |
| RED kararı isabeti (precision) | %72,6 — taban oranın ~4,7 katı |
Accuracy'nin baseline'a eşit görünmesi bir eksiklik değil: model dürüst olasılık ürettiği ve ONAY sınıfı %73 çoğunlukta olduğu için argmax matematiksel olarak çoğunluğa meyleder. Bu yüzden karar argmax ile değil, kalibre olasılık üzerinde eşik ile verilir (bkz. Karar kuralı).
Bir özelliğin modele girmesi için tek kriter vardır: "Bu bilgi skorlama anında elimde var mı?"
Veri setindeki garanti kapsam bayrakları (ccd_bl_warranty, wd_bl_warranty) modele eklendiğinde skor uçuyordu. Ancak bu bayrak "bu iş garanti kapsamında mı?" sorusunun cevabı — yani kararın kendisi. Skorlama anında henüz mevcut değil.
Kontrollü deney (aynı model, aynı bölünme, 9 özellik):
ccd_bl_warranty = 0 (31.652 talep) -> RED %92,1
ccd_bl_warranty = 1 (167.206 talep) -> RED %0,1
DÜRÜST (9 özellik) ROC 0,604
SIZINTILI (+3 bayrak) ROC 0,828 +0,224
Tam hatta da aynı desen görüldü: dürüst 0,62 → bayraklı 0,85. 0,62 seçildi; 0,85 raporlamak yanıltıcı olurdu.
Ham veri satır seviyesinde (parça / işçilik). Karar ise talep seviyesinde veriliyor. 1.000.000 satır → 198.858 benzersiz talep. Aynı talebin satırlarının eğitim ve teste dağılması böylece engellenir.
Bayi geçmişi güçlü bir sinyal, ama "geçmişe bakmak" tek başına yetmiyor — o bilginin skorlama anında bilinebilir olması gerekiyor. Bu yüzden iki ayrı zaman ekseni kullanılır:
| Özellik tipi | Eksen | Gerekçe |
|---|---|---|
Adet / hacim (dealer_claim_count_30d) |
reg_date |
"kaç talep açıldı" kayıt anında bilinir |
Sonuç oranları (dealer_prior_red_rate) |
comp_date |
sonuç ancak karar tarihinde bilinir |
Naif kurguda 30 günlük pencerenin %58'i gelecekten geliyordu. Düzeltmenin maliyeti yalnızca %2,3 (payda 114,5 → 111,9): küme küçülmüyor, kayıyor.
Kural: geç kalmak güvenli, erken bilgi sızıntıdır.
Rastgele bölme geleceği görmek demektir. Eğitim/test ayrımı reg_date'in %80 kuantili ile yapılır (159.086 / 39.772), çapraz doğrulamada TimeSeriesSplit kullanılır.
class_weight="balanced" ağacın azınlık sınıfları öğrenmesini sağlar, ama olasılıkları bozar. CalibratedClassifierCV(method="sigmoid", cv=5) bu bozulmayı gerçek 73/12/15 dağılımına geri eşler. Model seçimi de teslim edilen çıktıyla uyumlu olsun diye scoring="neg_log_loss" ile yapılır.
risk = 1 − P(ONAY)
risk < eşik -> otomatik ONAY
risk >= eşik -> durdur
1 − P(ONAY), MANUEL ve RED olasılıklarını havuzlar; P(RED) tek başına bakıldığında kaçan talepleri yakalar. Eşik bir iş parametresidir — değiştiğinde model yeniden eğitilmez:
| Risk iştahı | Eşik | Durdurulan | İsabet | Yakalanan risk |
|---|---|---|---|---|
| Çok sıkı | 0,525 | 398 | %72,6 | %2,6 |
| Sıkı | 0,501 | 795 | %68,3 | %4,9 |
| Dengeli | 0,451 | 1.989 | %63,2 | %11,4 |
| Geniş | 0,395 | 3.977 | %56,2 | %20,3 |
SHAP ile her karar gerekçelendirilebilir; MLflow ile her deney (parametre, metrik, artifact) yeniden üretilebilir. SHAP aynı zamanda bir sızıntı dedektörü: beklenmedik bir kolon zirveye çıkıyorsa orada bir sorun vardır.
pip install pandas numpy scikit-learn lightgbm mlflow matplotlib scipy sentence-transformers
pip install shap # opsiyonel, yalnızca --shap için# Varsayılan çalıştırma (embedding + kalibrasyon açık)
python modelPipeline.py
# Gerçek veriye yönlendir
python modelPipeline.py --data /yol/gercek_veri.csv
# Metin özelliği kaynağını seç
python modelPipeline.py --text-mode tfidf # tfidf | embedding | both | none
# Arama bütçesini küçült (hızlı deneme)
python modelPipeline.py --n-iter 8
# SHAP analizi (yavaş)
python modelPipeline.py --shap
# Kalibrasyonu kapat (karşılaştırma amaçlı)
python modelPipeline.py --no-calibration| Argüman | Varsayılan | Açıklama |
|---|---|---|
--data |
ford_warranty_synthetic_1m_signal.csv |
Eğitim CSV yolu |
--text-mode |
embedding |
tfidf | embedding | both | none |
--n-iter |
30 |
RandomizedSearchCV deneme sayısı |
--no-calibration |
kapalı | Sigmoid kalibrasyonu devre dışı bırakır |
--shap |
kapalı | SHAP katkı analizi üretir |
Her çalıştırma Warranty_Ai deneyi altında MLflow'a kaydedilir.
mlflow ui --backend-store-uri sqlite:///mlflow.dbMetrikler: roc_auc_ovr_macro, pr_auc_macro, accuracy, baseline_acc_all_onay, precision_macro, recall_macro, brier_mean ve sınıf bazında precision_* / recall_* / f1_*.
Artifact'lar: confusion_matrix.png, classification_report.txt, feature_importance.csv, num_features.txt, cat_features.txt, text_features.txt — --shap ile ayrıca shap_summary_bar.png, shap_beeswarm_RED.png, shap_beeswarm_MANUEL.png, shap_importance.csv.
Hat şema-esnektir: başlık önce okunur, REQUIRED_COLS kontrol edilir, eksik opsiyonel kolonlar uyarıyla atlanır. Zorunlu kolonlar:
sq_claim_id talep kimliği (toplulaştırma anahtarı)
cd_claim_status_description hedef (ONAY / MANUEL_ONAY / RED)
cd_line_type satır tipi (3 = işçilik, 4 = parça)
rf_org_unit_id bayi
wo_open_date iş emri açılış tarihi
dt_registration_date talep kayıt tarihi — SKORLAMA ANI
dt_completed_date karar tarihi — sonuç oranlarının ekseni
cd_vehicle_group / cd_model / cd_model_year / cd_claim_type
sq_work_order_detail_id detay sayısı
wo_ch_line_desc arıza açıklaması (metin)
⚠️ cd_line_typeiçin 3 = işçilik, 4 = parça varsayılır. Kurumsal şemada kodlar farklıysa parça/işçilik türevi ~10 özellik sessizce sıfırlanır — hata vermez, yalnızca skor düşer. Gerçek veriye geçerken kod listesi doğrulanmalıdır.
| Bulgu | Sonuç |
|---|---|
| Veri sentetiktir | Tüm metrikler sentetik üretim üzerinde. Gerçek Ford performansı olarak yorumlanmamalıdır. |
| MANUEL_ONAY öğrenilemiyor | Her dilimde χ²/dof ≈ 1,0 — jeneratör artefaktı. Gerçek tetikleyici muhtemelen bir tutar eşiği; o kolon veri setinde yok. |
| 21 benzersiz metin | 1M satırda yalnızca 21 farklı açıklama var. Embedding katkısı +0,002 ROC ile sınırlı kaldı; yöntem doğru, veri çeşitliliği yetersiz. |
| ROC tavanı ~0,65 | Bayraksız ölçülen tavan. 0,623 ile tavana yakınız; daha fazlası ancak sızıntıyla mümkün. |
Bu nedenle yatırım skora değil mimariye yapıldı: sızıntı savunması, point-in-time doğruluğu, şema esnekliği, kalibrasyon. Sentetikte ölçülen her şey geçicidir; taşınan tek şey yapıdır.
Üretime geçiş
- Veri sözleşmesi ve gerçek veri pilotu
- Purged / embargoed CV ile zaman sızıntısının kapatılması
- Karar eşiğinin maliyet verisiyle kalibre edilip üretime alınması
- Model başarısının sürekli izlenmesi (drift)
Planlanan yetenekler
- Aktif öğrenme — verilen kararların gerçek sonuçları modele geri beslenir
- Serbest metin zenginleştirme — şikâyet ile talep edilen parça arasındaki tutarsızlık
- Tutar-ağırlıklı eşik —
P(riskli) × talep tutarıile beklenen kayba göre karar - Belirsizlik nicelemesi — konformal tahminle emin olunmayan talepler MANUEL_ONAY'a
- Ağ ve anomali tespiti — bayi–araç–parça ilişkilerinin graf olarak modellenmesi
- Karşı-olgusal açıklama — "şu koşul değişseydi ONAY olurdu"
Numan Arif Deniz · Ford Otosan Digital Products