MAKİNE ÖĞRENMESİ İLE KARAR DESTEK SİSTEMİ (Tarımsal Kredi Kullanımı Üzerine)

Özkan ÇELİKTEN
Deep Learning Türkiye
13 min readJul 15, 2019

ÖZET

Günümüz teknolojileri ile depolanan büyük verileri incelemek, analiz edip bilgi çıkarmak karmaşık hale gelmiş ve yeni yöntemlerin gelişmesi ihtiyacını ortaya çıkarmıştır. Bu amaçla birçok disiplini kullanarak ortaya çıkan makine öğrenmesi, günümüzde mevcut problemleri çözmek, kritik kararları almak veya geleceğe yönelik tahminler yapmak için kullanılmaktadır.

Çalışmamızda, Tarım Sektöründe kredi politikaları oluşturabilmek için karar ağacı uygulaması geliştirilmiştir. Oracle Data Miner ile geliştirilen makine öğrenmesi uygulamasında, denetimli sınıflandırma yöntemi kullanılmıştır. En iyilenmiş modelin uygulanması ile kredi almak için gelen çiftçilerin durumlarını değerlendiren karar-tahmin mekanizması oluşturulmuştur.

1. GİRİŞ

Makine öğrenmesi uygulamaları ile doğru veriyi seçer ve doğru tekniklerle işleyerek hazır hale getirirsek doğru kararlar alabilecek otomatize bir sistemden bahsedebiliriz. Tahmin edici modeller, henüz sonuçları ya da aralarındaki ilişkiler bilinmeyen veri setleri için, daha önceden analiz edilmiş ve sonuçları bilinen verilerden yola çıkarak bilgi tahminine yaramaktadır. Buradaki temel amaç, var olan verilerden yararlanarak, gelecek verilerin özellik ve birbiri ile ilişkilerini tahmin ederek mevcut durum analizi yapmaktır. Sınıflandırma yöntemi ile, var olan verilerle test ve eğitim sınıfları oluşturup, yeni gelecek verilerin ait olması gereken sınıfların belirlenmesi ile de karar-destek sistemi kurulması sağlanabilmektedir.

2. MAKİNE ÖĞRENMESİ UYGULAMA ADIMLARI

Makine Öğrenmesi Uygulama Adımları

Uygulama adımları şekil ile gösterilen makine öğrenmesi, hangi yöntem ve algoritma kullanılırsa kullanılsın, problemin tanımlanması ve probleme yönelik tüm verilerin farklı kaynaklardan toplanması süreci ile başlar. Toplanan verilerin işlenmesi ve akabinde temizlenerek modele girebilecek halde analiz edilmesi ile devam eder. Akabinde bilgi keşfi için, modelin kurulması, en iyilenmiş ve doğruluk oranı yüksek model için ise modelin değerlendirilerek tekrar güncellenmesi gerekmektedir.

2.1. Problemin Tanımlanması

Kredi Kuruluşlarının Tarımsal Krediler ile ilgili hangi sorularına cevap bulabiliriz.

· Hangi özelliklere sahip bir çiftçi, aldığı krediyi zamanında (vadesini geçirmeden) öder?

· Hangi çiftçiye, kredi limiti ne kadar belirlenmelidir?

· Hangi özelliklerdeki çiftçilere ne kadar güvenebiliriz?

· Hangi tür borçlular borçlarına daha sadıktır?

Bu soruları artırabiliriz. O zaman bizim asıl problemimizi ‘borcunu kim, hangi olasılıkla öder ya da ödemez?’ olarak özetleyebiliriz. Bu sorunun cevabına göre firma tüm kredi politikalarını belirleyebilir. Mesela; kime ne kadar kredi verecek, bu kredilerinin geri dönüşleri hangi olasılıkla gerçekleşecek, kredi vermedeki en önemli risk faktörü ne olacak sorularına firma yanıt bulabilir.

2.2. Verilerin Hazırlanması

Sahada, farklı iş süreçleri ile çiftçilerden alınmış ve farklı kaynaklarda duran verileri tek bir kaynakta toplamak için Oracle veri tabanında aşağıdaki komutları kullanabiliriz. (Not: veriler değiştirilmek, otomatik rastgele üretilmek ve anonimleştirmek suretiyle alınmıştır.)

# create directory XYZ as ‘c:\dumpdir’;
# grant read on directory XYZ to public;
# grant write on directory XYZ to public;
# expdp system/xxxxxx@DB1 directory=EXPORT DUMPFILE=bitirme_schema1.dmp logfile= bitirme_schema1_exp.log TABLES= SCHEMA1.TABLE1, SCHEMA1. TABLE2, SCHEMA1. TABLE3
# impdp system/oracle@LOCAL directory= XYZ TABLES= TABLE1, TABLE2, TABLE3 remap_schema=schema1: schema2 dumpfile=bitirme_schema1.dmp logfile=bitirme_schema1_imp.log transform= segment_attributes:y exclude= GRANT exclude= CONSTRAINT exclude= INDEX exclude= STATISTICS
#diğer tablolarda belirli kurallarla istenilen oltp veritabanına alınmıştır.

Exportlar ve local veritabanına yapılan import sonucu toplam 4 tabloda 12.261.223 kayıt veri aktarılmıştır.

Değer Biçme ve Seçim: Peki hangi verileri daha değerli, en azından işimize yarayabileceğini düşündüğümüz, problemimize uygun verileri seçmemiz gerekmektedir. Hedefimizin çiftçi ve onun borçları olduğunu hatırlamak hangi verileri seçeceğimize yardımcı olacaktır. Aşağıda 4 tablonun ve o tabloların kurulan ilişkileri ile elde etmeyi planladığımız master tablomuzun bir tasarımını görelim.

Girdi ve Oluşması İstenen Çıktı (ODM_ORTAK) Tabloları

Veri Birleştirme: Sınıflandırma tekniklerinde verilerin kategorik olması gerekmektedir. Özellikle parasal miktarların (sürekli değerlerin) çok fazla çeşitlilik göstermesinden kaynaklı düğüm sayısı binleri bulan sonuçlarla (sınıflarla) karşılaşmamız olası olacaktır. ID görevi görmeyecek sayı kolonlarını daha sonraki adımlarda olabildiğince yok etmemiz, kategorik hale çevirmemiz gerekeceğinden bunların da tabloda yer aldığını varsaydığımız olası tablomuz yukarıdaki gibi düşünülmektedir. 4 tablonun ilişkileri tam olarak kurulduktan sonra master tabloyu yaratmak için gerekli SQL ve PL/SQL kodu hazırlanıp veri_hazırlama_1 adında prosedür şekline getirilmiştir. Prosedür sonrası ODM_ORTAK_1 tablosu oluşacaktır.

Dinamik veri hazırlama işlemimizde aslında bu aşamada başlamıştır.

Veri İşleme:

Öncelikle, hangi verinin işimize yaramayacağını, modelimizin güvenilirliğini düşürüp doğru çıktı üretmesini engelleyeceğini ya da performansımızı etkileyecek hangi verilerden kurtulmamız gerektiğini belirlemeliyiz. Bunun için hangi verilere hangi işlemleri uygulayacağımızı görmemiz gerekir. Bu ya SQL sorgulama sonucu dönen cevaplara bakılarak string olarak ya da bir makine öğrenmesi aracı kullanarak (çalışmamızda eski adıyla Oracle Data Miner) grafiksel olarak görülebilir.

Aşağıdaki SQL’lerle veriler analiz edilmektedir. Python yerine SQL kullanılmıştır.

# select count(*) as KAYIT_SAYISI, UST_KURUM_NO from ODM_ORTAK_1 group by UST_KURUM_NO order by 1 desc;
# select count(*) as KAYIT_SAYISI, IL_ADI from ODM_ORTAK_1 group by IL_ADI order by 1 desc;
# select count(*) as KAYIT_SAYISI, COGRAFI_BOLGE from ODM_ORTAK_1 group by COGRAFI_BOLGE order by 1 desc;
# select round(min(TEMINAT),2) as MIN_TEMINAT, round(avg(TEMINAT),2) as AVG_TEMINAT, round(max(TEMINAT),2) as MAX_TEMINAT from ODM_ORTAK_1;
# select TEMINAT from ODM_ORTAK_1 where TEMINAT is not null order by TEMINAT desc;
# select round(min(vadesi_gecen_borc),2) as MIN_VADESI_GECEN_BORC, round(avg(vadesi_gecen_borc),2) as AVG_VADESI_GECEN_BORC, round(max(vadesi_gecen_borc),2) as MAX_VADESI_GECEN_BORC from ODM_ORTAK_1;
# select vadesi_gecen_borc from ODM_ORTAK_1 where vadesi_gecen_borc is not null order by vadesi_gecen_borc desc;
# select round(min(toplam_borc),2) as MIN_TOPLAM_BORC, round(avg(toplam_borc),2) as AVG_TOPLAM_BORC, round(max(toplam_borc),2) as MAX_TOPLAM_BORC from ODM_ORTAK_1;
# select toplam_borc from ODM_ORTAK_1 where toplam_borc is not null order by toplam_borc desc;
# select round(min(yillik_min_gelir),2) as MIN_YILLIK_GELIR, round(avg(yillik_min_gelir),2) as AVG_YILLIK_GELIR, round(max(yillik_min_gelir),2) as MAX_YILLIK_GELIR from ODM_ORTAK_1;
# select yillik_min_gelir from ODM_ORTAK_1 where yillik_min_gelir is not null order by yillik_min_gelir desc;
# select count(*) as KAYIT_SAYISI, YIL from ODM_ORTAK_1 group by YIL order by 1 desc;
# select count(*) as KAYIT_SAYISI, BAK_YUK_OLDUGU_KISI_SAYISI from ODM_ORTAK_1 group by BAK_YUK_OLDUGU_KISI_SAYISI order by 1 desc;
# select bak_yuk_oldugu_kisi_sayisi from ODM_ORTAK_1 where bak_yuk_oldugu_kisi_sayisi is not null order by bak_yuk_oldugu_kisi_sayisi desc;
# select count(*) as KAYIT_SAYISI, CINSIYET from ODM_ORTAK_1 group by CINSIYET order by 1 desc;
# select count(*) as KAYIT_SAYISI, ASKERLIK_DURUMU from ODM_ORTAK_1 group by ASKERLIK_DURUMU order by 1 desc;
# select count(*) as KAYIT_SAYISI, OGRENIM_DURUMU from ODM_ORTAK_1 group by OGRENIM_DURUMU order by 1 desc;
# select count(*) as KAYIT_SAYISI, MEDENI_DURUMU from ODM_ORTAK_1 group by MEDENI_DURUMU order by 1 desc;

Yukarıdaki SQL’lerle temizlenmesi gereken veriler görülebileceği gibi, Oracle Data Miner içerisinden Data — Transform — Missing Value menüsünden grafik olarak da aynı şekilde görülebilir.

‘Öğrenim Durumu’ Veri Seti İçin Kayıp Değerler Histogramı
‘Bakmakla Yükümlü Kişi Sayısı Durumu’ Veri Seti İçin Kayıp Değerler Histogramı

Şimdi hangi kolonun ne şekilde işleneceğine karar vermeliyiz. Şöyle ki; aşağıdaki SQL’lerden en iyi model için ‘0’ cevabının dönmesini bekleriz. Bu sorgular, olması gereken değerler dışında kalan verileri yansıtmaktadır. Örneğin, 7 coğrafi bölge dışında yaşayan ya da yıllık geliri negatif olan çiftçi kayıtlarının olmamasını bekleriz.

# select count(*) from ODM_ORTAK_1 where ORTAK_ID is null;
# select count(*) from ODM_ORTAK_1 where KURUM_ID is null;
# select count(*) from ODM_ORTAK_1 where UST_KURUM_NO is null;
# select count(*) from ODM_ORTAK_1 where IL_ADI is null;
# select count(*) from ODM_ORTAK_1 where COGRAFI_BOLGE is null or (COGRAFI_BOLGE not in (‘I’,’K’,’M’,’D’,’A’,’E’,’G’));
# select count(*) from ODM_ORTAK_1 where TEMINAT is null or TEMINAT <=0;
# select count(*) from ODM_ORTAK_1 where VADESI_GECEN_BORC is null;
# select count(*) from ODM_ORTAK_1 where VADESI_GECEN_BORC<0;
# select count(*) from ODM_ORTAK_1 where TOPLAM_BORC is null;
# select count(*) from ODM_ORTAK_1 where TOPLAM_BORC<0;
# select count(*) from ODM_ORTAK_1 where YILLIK_MIN_GELIR<0;
# select count(*) from ODM_ORTAK_1 where YILLIK_MIN_GELIR is null;
# select count(*) from ODM_ORTAK_1 where YIL is null;
# select count(*) from ODM_ORTAK_1 where YIL=2007;
# select count(*) from ODM_ORTA_1 where BAK_YUK_OLDUGU_KISI_SAYISI is null;
# select count(*) from ODM_ORTAK_1 where CINSIYET is null or (CINSIYET<>’E’ and CINSIYET<>’K’);
# select count(*) from ODM_ORTAK_1 where ASKERLIK_DURUMU is null or (ASKERLIK_DURUMU<>’Y’ and ASKERLIK_DURUMU<>’M’);
# select count(*) from ODM_ORTAK_1 where OGRENIM_DURUMU is null or (OGRENIM_DURUMU not in (‘U’,’I’,’Y’,’T’,’O’,’R’,’L’));
# select count(*) from ODM_ORTAK_1 where MEDENI_DURUMU is null or MEDENI_DURUMU not in (‘E’,’B’,’O’);

Sayısal kolonlar için ortalama, standart sapma, minimum ve maksimum değerleri ile eksik değerleri (missing values) program ile görmemiz ve iyileştirmemiz de mümkündür.

Sayısal Kolonların Sayısal Verileri
Kolonların Kayıp Değerleri ile Örnekleme Küme Sayıları

Gürültülü, boş, eksik, artık ve tutarsız verilerden kurtulmamız gerekmektedir. Fakat bunlar her kolonda değişiklik göstermek de dinamik olmaktadır. Bunları otomatik olarak yapabilecek bir prosedür yazılmıştır. Prosedür sonrası ODM_ORTAK_1 tablosu ODM_ORTAK_2 adıyla yeni bir tabloya dönüşecektir. Oracle Data Miner da ise Data — Transform — Recode menüsü altından yapılabilir.

Prosedür ya da programın recode özelliği ile yapılan veri temizleme işlemine örnek verecek olursak:

PL/SQL bloku içerisinde yazılacak olan aşağıdaki SQL ile çiftçinin bakmakla yükümlü olduğu kişi sayısı boşsa tüm tablonun ortalamasıyla doldurulur. Fakat ortalamanın doğru çıkması için önce ayrık uç değer silinir.

# V_SQL := ‘delete from ODM_ORTAK where BAK_YUK_OLDUGU_KISI_SAYISI =(select max(BAK_YUK_OLDUGU_KISI_SAYISI) from ODM_ORTAK)’;
execute immediate V_SQL;
commit;
select ROUND(AVG(BAK_YUK_OLDUGU_KISI_SAYISI)) into ORT_BYKS from ODM_ORTAK;
for REC in C12 LOOP
update ODM_ORTAK set BAK_YUK_OLDUGU_KISI_SAYISI=ORT_BYKS where id=REC.id;
commit;
end LOOP;
DBMS_OUTPUT.PUT_LINE(‘BAK_YUK_OLDUGU_KISI_SAYISI ISLENEN KAYIT SAYISI: ‘ || CNT12 || ‘ ‘|| sysdate ||’’);

Veri Setlerini Değişen Durumlara Karşı Tekrar Kodlama (Kayıp ve Uç Verilerin İşlenmesi

Kullanacağımız makine öğrenmesi yöntemi sınıflandırma olduğu için girdi verilerimizin kategorik olması gerekmektedir. Kurulacak modelin başarısı için, özellikle parasal değerlerin ifade edildiği veri setlerinde sürekli kolonların transformasyonu işlemleri yapılmalıdır. Yani, çiftçinin “vadesi geçen borç” bilgisi sürekli bir değişken (sayısal bir değer) olarak gösterilmek yerine, onun için oluşturduğumuz “vadesi geçen borç aralığı” kolonuna string ifadelerle aralık şeklinde yazılarak kategorik bir veriye çevrilmelidir. Bunun SQL örneğini incelersek;

# UPDATE ODM_ORTAK SET VADESI_GECEN_BORC_ARALIGI =
(SELECT CASE
WHEN 0<VADESI_GECEN_BORC AND VADESI_GECEN_BORC<1000 THEN ‘B1’
WHEN 1000<=VADESI_GECEN_BORC AND VADESI_GECEN_BORC<1500 THEN ‘B2’
WHEN 1500<=VADESI_GECEN_BORC AND VADESI_GECEN_BORC<2000 THEN ‘B3’
WHEN 2000<=VADESI_GECEN_BORC AND VADESI_GECEN_BORC<3000 THEN ‘B4’
WHEN 3000<=VADESI_GECEN_BORC AND VADESI_GECEN_BORC<5000 THEN ‘B5’
WHEN 5000<=VADESI_GECEN_BORC AND VADESI_GECEN_BORC<10000 THEN ‘B6’
WHEN VADESI_GECEN_BORC>=10000 THEN ‘B7’
WHEN VADESI_GECEN_BORC=0 THEN ‘B0’
END AS VADESI_GECEN_BORC FROM ODM_ORTAK A
WHERE ODM_ORTAK.ID=A.ID);

Bu işlemi Oracle Data Miner aracılığı ile de arayüzden yapabiliriz.

Veri Setlerini Değişen Durumlara Karşı Tekrar Kodlama (Sürekli Kolonların Transformasyonu)

Yalnızca yıllık minimum gelir değil, teminat, vadesi geçen borç ve toplam borç kolonlarımızı da aralık değeriyle kategorize etmek faydalı olabilir. Bunun için veri_hazırlama_3 prosedürü hazırlanmıştır. Bu prosedürün çalışması sonucu ODM_ORTAK_2 tablomuzdan ODM_ORTAK_3 tablosu oluşmakta ve artık makine öğrenmesi için girdi olacak temiz veriyi elde etmiş olacağız.

Oluşturduğumuz üç prosedürü aşağıdaki komut ile çalıştırdığımızda ürettiği logu incelersek 1.731.536 kayıt, 1.717.048 işlem sonrası 1.103.043’a düşmüş ve tablonun oluşturulmasından, aralık kolonlarının eklenip doldurulmasına ve tüm kayıtların işlenmesine kadar geçen tüm süre yarım saatten azdır.

# set SERVEROUTPUT on size 999999;
# EXEC VERI_HAZIRLAMA_1;
# EXEC VERI_HAZIRLAMA_2;
# EXEC VERI_HAZIRLAMA_3;
anonymous block completed
TABLO YARATILDI. ID(pk) ve ARALIK KOLONLARI EKLENDI
anonymous block completed
*TOPLAM KAYIT SAYISI: 1731536
**TOPLAM ISLENEN KAYIT SAYISI: 1717048
***ISLEME SONRASI TOPLAM KAYIT SAYISI: 1103043
****KATAGORIZE EDILEN KOLON SAYISI: 4 , KAYIT SAYISI: 4412172

Veri İşlemenin Sonrasında Kayıp Verilerin Oranları

Artık verilerimiz Data Miner aracılığı ile makine öğrenmesi sınıflandırma tekniğini uygulamaya hazırız. Ancak; problemimiz doğrultusunda bizim için girdi ve çıktı olacak verilerin neler olduğunu tekrar inceleyelim.

Modele Girdi ve Çıktı Olabilecek Değişkenler

2.3. Modelin Kurulması, Değerlendirilmesi ve Güncellenmesi

Karar ağacımıza girdi olacak verilerimizin tamamını modelde girdi olarak göstermek, ters etki eden kolonlarda modelin güvenilirliğini düşüreceğinden, hangi girdinin çıktımız üzerinde daha etkili olacağını belirlersek, tahminin modelden gerçek modele o kadar hızlı ulaşırız. Modelimizi Oracle Data Miner ile adım adım kuralım.

ADIM 1: Build faaliyeti olarak Classsification ve algoritma olarak da Decision Tree seçiyoruz.

Makine Öğrenmesi Yönteminin Seçilmesi

ADIM 2: Karar Ağacımıza girdi olacak tablo, birincil anahtar ve kolonları seçilir. Ayrıca çıktı (target) olarak da vadesi_geçen_borç_aralığı işaretlenir.

Tablo, Birincil Anahtar, Girdi ve Çıktı Değişkenlerinin Seçilmesi

ADIM 3: Hedef değerimizin ne olduğu (hangi vadesi geçen borç hedefimizdir?) bu alanda seçilir. Bizim için B0 yani vadesi geçen borcu olmama durumu işaretlenir.

Hedef Değişken İçin Olması İstenen Durumun Seçilmesi

ADIM 4: Gelişmiş ayarlar altından; örnekleme kümesinde ya da tüm veri tabanında işlem yapılacağı, öğrenme ve test verilerinin ne kadar olacağı, hangi algoritma ile karar ağacımızın ağaç özelikleri (dal, derinlik, ayırma vb.) ve çıktı sonrası test verisi uygulansın istenirse yapılacak analizler ile o analizlerin özeliklerinin seçimi gibi ayarlar yapılabilir.

Model İçin Örnek, Öğrenme ve Test Verilerinin Ayarlanması

ADIM 5: Uygulama dediğimizde modelimiz oluşturulmuş olacaktır. Öğrenme verimizin aşağıdaki sonucunu karar ağacı şeklinde görebiliriz. (Model oluşturma işlemi yalnız görsel değil, Oracle’ın DBMS_DATA_MINING paketinden CREATE_MODEL komutu ile de SQL yazılarak yapılabilmektedir.)

Modelin Çalıştırılması
Oluşan Karar Ağacı ve Kuralları

Test verimizin uygulanması sonucu modelimizin %22'lik bir güvenilirliğe sahip olduğunu görüyoruz.

Modelin İlk Güvenilirliği

ADIM 6: Daha başarılı model için örnekleme, öğrenme ve test verilerimizin ayarları ile girdi değişkenlerimizi sürekli değiştirip yeni çıktıları karşılaştırıyoruz. Sürekli model kurarken yardımcı olması anlamında Oracle Data Miner’ın Explain Analizinden faydalanılabilir. Bu analiz ile “hangi girdimizin vadesi geçen borç aralığı kolonu üzerindeki etki oranları ne kadar” sorusunun cevabı grafiksel olarak alınabilmektedir. Aşağıda çıktı sonucunu incelersek, modelimize toplam borç, yıllık minimum gelir, teminat, il, üst kurum kolonları ile oluşturmamız gerektiğini önem dereceleri puanlamasından görebilmekteyiz.

Explain Analiz

En iyilenmiş modelimizin girdileri bakmakla yükümlü olduğu kişi sayısı, il, teminat, toplam borç, üst kurum no ve yılık minimum gelir kolonları olup, 200.000 örnekleme alınarak ve %90 öğrenme, %10 test verilerine ayırmak suretiyle, modelimizin güvenilirliği şöyle olmaktadır.

En İyilenmiş Modelin Güvenilirliği

ROC, LIFT Analizi ve Risk Matrisleri gibi çeşitli yöntemler de, kullanıcı modelinin test edilmesi, değerlendirilmesi konusunda kullanılır.

Risk Matrisinde tahmin edilen sınıf değeri kolonda gösterilirken, gerçek değer satırda gösterilir demiştik. Matrisin köşegeni doğru tahmin edilen sınıf sayısını göstermektedir.

En İyilenmiş Modelin Risk Matrisi

Yukarıda ki Risk Matrisine göre;

- Örnekleme kümesi sınıf sayısı 1.697' dir.

- Kurduğumuz model, 215 sınıf alıp içerisinden 30 verinin ‘B0’ hedef değerine gireceğiniz tahmin etmiş ve tamamı girmiştir.

- Kurduğumuz model, 205 sınıf alıp 183 tanesinin ‘B1’ hedef değerine gireceğini tahmin etmiş ama 165 tanesi girmiştir.

- Kurduğumuz model, 227 sınıf alıp 214 tanesi ‘B2’ hedef değerine gireceğini tahmin etmiş ama 198 tanesi girmiştir.

- …

- Sonuçta test verisi içerisinden her bir hedef değer grubu için ortalama eşit sayıda örneklem alınarak model test edildiğinde, kurduğumuz model bize 1.697 verinin 1.375 tanesini doğru tahmin etmiştir. Modelimizin doğruluk oranı: %81'dir diyebiliriz. Modelimiz asıl hedef kolonumuz olan ‘B0’ değerini tahmin etmede %100 başarılı gözükmektedir.

Modelin sağladığı faydayı aslında doğruluğunu gösteren Lift grafiğimiz aşağıda verilmiştir.

En İyilenmiş Modelin Lift Analizi

Modelimizin doğruluğunu ölçmede kullanılan diğer bir grafik ise ROC grafiğimizdir. Tüm durumların mükemmel, tüm durumların pozitif ya da negatif ve tüm durumların hatalı tahmin edilmesinin incelendiği ROC grafiğimiz aşağıda gösterilmiştir

En İyilenmiş Modelin ROC Analizi

2.4. Modelin Uygulanması

Modelin uygulanacağı bu adımında ise, yeni bir çiftçinin kredi çekmek için kuruma geldiğini varsayalım. Bu çiftçinin sistemden modelimize girdi olacak bilgilerini çekip (bakmakla yükümlü kişi sayısı, çiftçilik yaptığı ili, teminatı, toplam borcu, üst kurum bilgisi ve verdiği beyanlardan yıllık minimum gelir bilgisi) bir tabloya atarak, o tabloyu oluşturduğumu model üzerinde ‘Model Apply’ işlemini uygulayarak, o çiftçiye ne kadar kredi verilirse hangi olasılıkla vadesinde ödenip ödenemeyeceğini bulalım.

Çiftçi Bilgileri; (KREDI_ICIN_GELEN_CIFTCI Tablosu)

*Bakmakla Yükümlü Olduğu Kişi Sayısı: 15
*Çiftçilik Yaptığı İl Adı: DENİZLİ
*Teminatı: 300 ₺
*Kredi Çekmek İstediği Miktarda Dahil Toplam Borcu: 10.000 ₺
*Beyanına Göre Sistemin Hesapladığı Yıllık Minimum Gelir: 14.000 ₺

Modelin Uygulanması — Model Seçilir
Modelin Uygulanması — Uygulama Yapılacak Tablonun Seçilmesi
Modelin Uygulanması — Hangi Çıktı Türleri İçin Olasılıkların Hesaplanması İstendiği Seçilir

Uygulama sonrası her bir çıktı grubu için olasılık dağılımı şu şekildedir.

Model Uygulama Sonucu

Sonuç olarak kredi çekmek için gelen çiftçinin vadesini geçireceği borç miktarı B0'a doğru olması gerekirken, olasılığı en yüksek çıkan sonuç B7 (10.000'den büyük) olmuştur. Tüm olasılıklara bakacak olursak;

Model Uygulama Sonucu Olasılık Dağılımları

Sonuçta çiftinin hiç borcunun olmadığını ve 10.000 ₺ kredi çekmek için geldiğini düşünürsek, bu çiftçi çekeceği 10.000 ₺’ lik kredinin tamamını (B7 durumu 10.000 ve fazlası içindi) %99 olasılıkla ödemeyecektir.

Peki, bu çiftçiye kredi vermek istersek ne kadar kredi vermeliyiz? Çiftçinin teminatını artırması, çiftçilik yaptığı ili değiştirmesi, daha az kredi çekmesi, ya da beyanındaki yıllık gelirini fazla göstermesi seçeneklerinde hangi olasılıklarda borcunu öder/ödemez? Şimdi bunu görelim. Aşağıda çiftçinin olası durumlarının listesi verilmiştir. (KREDI_ICIN_GELEN_CIFTCI tablosu verileri) Birinci durum çiftçinin ilk geldiğindeki durumdur.

Yeni Uygulama İçin Olası Durumlar

*Durum 1: Çiftçinin mevcut durumu

*Durum 2: Çiftçinin teminat artırılması

*Durum 3: Çiftçinin çekmek istediği kredi miktarının (eski borcu dahil) indirilmesi ve beyan belgesi değiştirerek yıllık gelirinin yükseltilmesi

*Durum 4: Çiftçinin teminat artırılması ve çekmek istediği kredi miktarının (eski borcu dahil) indirilmesi

*Durum 5: Çiftçinin bakmakla yükümlü kişi sayısının azaltılması ve çiftçiliğini Denizli de değil de İzmir de yapması

Modelimizi KREDI_ICIN_GELEN_CIFTCI tablosunda tekrar çalıştırırsak aşağıdaki sonucu alacağız.

Olası Durumlar İçin Olasılık Dağılımları

Çiftçinin bakmakla yükümlü kişi sayısının azaltılması ve çiftçiliğini Denizli de değil de İzmir de yapmasının bu çiftçi için önemli olmadığı, borcunu zamanında ödeyeceği en iyi durumun ise 3. Durum olduğu görülmektedir. Bu çiftçiye kredi şu koşullarda şu risklerle verilir;

Olası Durumlar İçin Toplam Risk Dağılımları

Çiftçiye hemen istediği 10.000 ₺’ lik krediyi verirsek zamanında geri almamız neredeyse mümkün değildir. Ama teminat artırımı ve beyan belgesi yenileme ile 6.000 ₺ kredi verirsek, zamanında %22,4 olasılıkla zamanından önce alırız.

3. durum, karar ağacımızın 63. düğümündedir. Karar ağacımızın yapısını ve bu düğüm için oluşturduğu kural yapısı aşağıda verilmiştir.

Modelimizin Karar Ağacı Yapısı

3. SONUÇ

Bir kredi başvurusu yapan çiftçinin talep ettiği kredi miktarının ne kadar risk teşkil ettiği, teminatın artırılması ve kredi miktarının belli miktarda düşürülmesi ile vadesi geçen borç olasılığını minimize eden durumların neler olabildiği belirlenebilmiştir. Böylelikle yüksek geri dönüşlü kredi kullandırmada karar-destek sistemi kurulması sağlanmıştır. Ayrıca makine öğrenmesi uygulamamızdan genel olarak da; teminatı belirli bir tutarın altında kalan ve kredi borcu 10.000 ₺’den fazla olan ayrıca belirlenmiş bazı illerde çiftçilik yapan kişilerin kredi geri ödeme alışkanlıklarının çok kötü olduğu, çiftçinin bakmakla yükümlü olduğu kişi sayısının sadece 8 ve üzerine çıkması durumlarında riskin arttığı, çiftçinin borç ödemesi üzerinde yıllık minimum gelirinin etkili olduğu ve bunun kırılma alt noktasının ise ortalama asgari ücretin 20 katı olduğu, Trakya bölgesindeki çiftçilerin ödeme alışkanlıklarının çok yüksek olduğu ve hangi çiftçilerin nerede hangi ürünleri yetiştirmesi gerektiği gibi bir çok yorum ve karar-destek sistemlerine varan sonuçlar çıkarmak mümkün olmuştur.

--

--

Özkan ÇELİKTEN
Deep Learning Türkiye

Tarım Kredi Koop. Merkez Birliği Yazılım ve Veri Yönetimi Müdürü