Sadece 3 adım'da nasıl bir qlearning modeli yaparız ?
1. veri oluşturma
2. model eğitme
3. test
4. Burdan sonrası frontend
1. ADIM VERİ OLUŞTURMA
- Sahte Kullanıcı Verileri Oluşturma ve Analizi
.csv içeriğinin bir kısmı
VERİ SETİ TEST
2. ADIM MODEL OLUŞTURMA (QLEARNG)
3. ADIM TEST
1. veri oluşturma
2. model eğitme
3. test
4. Burdan sonrası frontend
1. ADIM VERİ OLUŞTURMA
- Sahte Kullanıcı Verileri Oluşturma ve Analizi
- Her kullanıcı için ad, yaş, cinsiyet, ülke gibi temel bilgiler oluşturulur.
- Finansal bilgiler de dahil olmak üzere çeşitli özellikler rastgele atanır.
- Kullanıcıların gelir ve birikimleri, kendi ülkelerinin para birimine göre dönüştürülür.
- Kullanıcıların gelir ve birikimleri normal dağılıma göre ayarlanır.
- Kredi skorları ve harcama puanları hesaplanır.
- Finansal detaylar, kredi miktarı, faiz oranı, vade süresi gibi bilgiler belirlenir.
- Kullanıcıların yaşlarına göre sağlık durumu, eğitim seviyesi, meslek, medeni durum gibi bilgiler belirlenir.
- Yaşa göre yatırım tercihi ve harcama alışkanlığı tahmin edilir.
- Oluşturulan demografik veriler, analiz edilmek üzere bir CSV dosyasına kaydedilir (global.csv).
Python:
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
kullanici_bilgileri = pd.DataFrame({
'Kullanici_ID': range(1, 50001), #50000 kullanıcı
'Ad': [f'Kullanici_{i}' for i in range(1, 50001)],
'Yas': np.random.randint(18, 65, 50000),
'Ulke': np.random.choice(["Türkiye", "ABD", "Almanya", "Fransa", "Çin"], 50000),
'Cinsiyet': np.random.choice(['Erkek', 'Kadın'], 50000),
'Kilo': np.random.randint(50, 150, 50000),
'Boy': np.random.randint(150, 200, 50000),
'Ehliyet': np.random.choice(['Var', 'Yok'], 50000),
'ParaBirimi': '',
'KrediKarti': np.random.choice(['Var', 'Yok'], 50000),
'KrediLimiti': np.random.randint(1000, 5000, 50000),
'KrediHesabi': np.random.choice(['Var', 'Yok'], 50000),
'KrediTarihi': np.random.choice(['Var', 'Yok'], 50000),
'KrediDurumu': np.random.choice(['Var', 'Yok'], 50000),
'KrediTutari': np.random.randint(1000, 5000, 50000),
'KrediKalan': np.random.randint(1000, 5000, 50000),
'KrediPuan': np.random.randint(1, 5, 50000),
'Hesap': np.random.choice(['Var', 'Yok'], 50000),
'HesapTarihi': np.random.choice(['Var', 'Yok'], 50000),
'HesapDurumu': np.random.choice(['Var', 'Yok'], 50000),
'HesapPuan': np.random.randint(1, 5, 50000),
'HesapTutari': np.random.randint(1000, 5000, 50000),
'HesapKalan': np.random.randint(1000, 5000, 50000),
'HesapParaBirimi': np.random.choice(['Türkiye', 'ABD', 'Almanya', 'Fransa', 'Çin'], 50000),
'HesapKrediKarti': np.random.choice(['Var', 'Yok'], 50000),
'HesapKrediLimiti': np.random.randint(1000, 5000, 50000),
'HesapKrediHesabi': np.random.choice(['Var', 'Yok'], 50000),
'HesapKrediTarihi': np.random.choice(['Var', 'Yok'], 50000),
'HesapKrediDurumu': np.random.choice(['Var', 'Yok'], 50000),
'HesapKrediTutari': np.random.randint(1000, 5000, 50000),
'HesapKrediKalan': np.random.randint(1000, 5000, 50000),
'HesapKrediPuan': np.random.randint(1, 5, 50000),
'HesapTuru': np.random.choice(['Vadesiz', 'Vadeli'], 50000),
'Gelir': np.random.randint(2000, 10000, 50000),
'GelirTarihi': np.random.choice(['Var', 'Yok'], 50000),
'GelirPuan': np.random.randint(1, 5, 50000),
'GelirTutari': np.random.randint(1000, 5000, 50000),
'GelirKalan': np.random.randint(1000, 5000, 50000),
'GelirParaBirimi': np.random.choice(['Türkiye', 'ABD', 'Almanya', 'Fransa', 'Çin'], 50000),
'Birikim': np.random.randint(1000, 5000, 50000),
'BirikimTarihi': np.random.choice(['Var', 'Yok'], 50000),
'BirikimPuan': np.random.randint(1, 5, 50000),
'BirikimTutari': np.random.randint(1000, 5000, 50000),
'BirikimKalan': np.random.randint(1000, 5000, 50000),
'BirikimParaBirimi': np.random.choice(['Türkiye', 'ABD', 'Almanya', 'Fransa', 'Çin'], 50000),
'EgitimDurumu': np.random.choice(['Var', 'Yok'], 50000),
'Egitim': np.random.choice(['Yok', 'Ortaokul', 'Lise', 'Lisans', 'Yüksek Lisans', 'Doktora'], 50000),
'Meslek': np.random.choice(['Mühendis', 'Öğretmen', 'Doktor', 'Programcı', 'Sanatçı',
'Demirci', 'Kuaför', 'Eczacı', 'Hemşire', 'Avukat', 'Pilot',
'Diş Hekimi', 'Yazılım Geliştirici', 'Grafik Tasarımcı', 'Market Sahibi',
'Oyuncu', 'Şef', 'Elektrik Mühendisi'], 50000),
'MedeniDurum': np.random.choice(['Bekar', 'Evli', 'Boşanmış', 'Dul'], 50000),
'Hobiler': np.random.choice(['Okuma', 'Seyahat', 'Fotoğrafçılık', 'Spor', 'Yemek Yapma'], 50000),
'SaglikDurumu': np.random.choice(['Mükemmel', 'İyi', 'Orta', 'Kötü'], 50000),
'AlisverisTercihi': np.random.choice(['Online', 'Mağaza', 'Her İkisi'], 50000)
})
para_birimleri = {'Türkiye': 2.0, 'ABD': 3.8, 'Almanya': 0.85, 'Fransa': 0.85, 'Çin': 6.5}
kullanici_bilgileri['ParaBirimi'] = [para_birimleri[ulke] for ulke in kullanici_bilgileri['Ulke']]
for index, satir in kullanici_bilgileri.iterrows():
kullanici_bilgileri.at[index, 'Gelir'] = satir['Gelir'] * satir['ParaBirimi']
kullanici_bilgileri.at[index, 'Birikim'] = satir['Birikim'] * satir['ParaBirimi']
kullanici_bilgileri['ParaBirimi'] = kullanici_bilgileri['ParaBirimi'].astype(str)
kullanici_bilgileri['KrediSkoru'] = np.random.randint(300, 850, 50000)
kullanici_bilgileri['YatirimTercihi'] = np.random.choice(['Konservatif', 'Dengeli', 'Agresif'], 50000)
kullanici_bilgileri['Gelir'] = np.random.normal(5000, 1500, 50000).astype(int)
kullanici_bilgileri['Birikim'] = np.random.normal(2500, 1000, 50000).astype(int)
kullanici_bilgileri['KatilmaTarihi'] = pd.to_datetime('2022-01-01') + pd.to_timedelta(np.random.randint(0, 365, 50000), unit='D')
kullanici_bilgileri['HarcamaPuani'] = kullanici_bilgileri['Gelir'] * 0.05 + kullanici_bilgileri['KrediSkoru'] * 0.1
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 60, 'SaglikDurumu'] = 'Kötü'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 50, 'SaglikDurumu'] = 'Orta'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 40, 'SaglikDurumu'] = 'İyi'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 30, 'SaglikDurumu'] = 'Mükemmel'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 25, 'SaglikDurumu'] = 'İyi'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 20, 'SaglikDurumu'] = 'İyi'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 15, 'SaglikDurumu'] = 'İyi'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] < 25, 'YatirimTercihi'] = 'Agresif'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] < 35, 'YatirimTercihi'] = 'Dengeli'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 60, 'YatirimTercihi'] = 'Konservatif'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] < 20, 'MedeniDurumu'] = 'Bekar'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 65, 'MedeniDurumu'] = 'Dul'
kullanici_bilgileri.loc[kullanici_bilgileri('Yas') > 20, 'MedeniDurumu'] = 'Evli'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 50, 'Egitim'] = 'Doktora'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 40, 'Meslek'] = 'Doktor'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 30, 'Meslek'] = 'Öğretmen'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 28, 'Meslek'] = 'Mühendis'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 25, 'Meslek'] = 'Programcı'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 20, 'Meslek'] = 'Sanatçı'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 24, 'Egitim'] = 'Yüksek Lisans'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 18, 'Egitim'] = 'Lisans'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 15, 'Egitim'] = 'Lise'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 10, 'Egitim'] = 'Ortaokul'
kullanici_bilgileri.loc[kullanici_bilgileri['Yas'] > 5, 'Egitim'] = 'Yok'
kullanici_bilgileri['HarcamaAliskanligi'] = np.random.uniform(0.1, 0.9, 50000)
kullanici_bilgileri['YatirimTercihi'] = np.random.choice(['Düşük Risk', 'Orta Risk', 'Yüksek Risk'], 50000)
kullanici_bilgileri['AylıkGiderler'] = np.random.randint(500, 3000, 50000)
kullanici_bilgileri['KrediMiktari'] = np.random.randint(0, 5000, 50000)
kullanici_bilgileri['KrediFaizOrani'] = np.random.uniform(0.01, 0.2, 50000)
kullanici_bilgileri['KrediVadeAy'] = np.random.randint(12, 60, 50000)
kullanici_bilgileri['GiderOrani'] = kullanici_bilgileri['Birikim'] / kullanici_bilgileri['Gelir']
kullanici_bilgileri['AylıkBirikim'] = kullanici_bilgileri['Gelir'] - kullanici_bilgileri['Birikim']
kullanici_bilgileri['AylıkBirikimOrani'] = np.random.uniform(0.1, 0.5, 50000)
print(kullanici_bilgileri.head())
kullanici_bilgileri.to_csv('global.csv', index=False)
.csv içeriğinin bir kısmı
Bash:
Kullanici_ID,Ad,Yas,Ulke,Cinsiyet,Kilo,Boy,Ehliyet,ParaBirimi,KrediKarti,KrediLimiti,KrediHesabi,KrediTarihi,KrediDurumu,KrediTutari,KrediKalan,KrediPuan,Hesap,HesapTarihi,HesapDurumu,HesapPuan,HesapTutari,HesapKalan,HesapParaBirimi,HesapKrediKarti,HesapKrediLimiti,HesapKrediHesabi,HesapKrediTarihi,HesapKrediDurumu,HesapKrediTutari,HesapKrediKalan,HesapKrediPuan,HesapTuru,Gelir,GelirTarihi,GelirPuan,GelirTutari,GelirKalan,GelirParaBirimi,Birikim,BirikimTarihi,BirikimPuan,BirikimTutari,BirikimKalan,BirikimParaBirimi,EgitimDurumu,Egitim,Meslek,MedeniDurum,Hobiler,SaglikDurumu,AlisverisTercihi,KrediSkoru,YatirimTercihi,KatilmaTarihi,HarcamaPuani,MedeniDurumu,HarcamaAliskanligi,AylıkGiderler,KrediMiktari,KrediFaizOrani,KrediVadeAy,GiderOrani,AylıkBirikim,AylıkBirikimOrani
1,Kullanici_1,35,Türkiye,Erkek,59,175,Yok,2.0,Var,4078,Var,Yok,Yok,1504,3717,1,Yok,Yok,Yok,1,3342,1638,ABD,Yok,2243,Var,Var,Yok,2512,4875,2,Vadeli,6209,Var,3,3485,1774,Türkiye,2228,Yok,2,1008,2341,ABD,Var,Yok,Sanatçı,Boşanmış,Seyahat,İyi,Her İkisi,317,Orta Risk,2022-03-04,342.15000000000003,nan,0.5979907019152567,2251,29,0.08216745273931977,38,0.35883395071670154,3981,0.4157374425475392
2,Kullanici_2,62,Fransa,Kadın,147,189,Yok,0.85,Yok,1580,Var,Yok,Yok,3003,1841,3,Var,Yok,Yok,4,4719,2376,Fransa,Yok,3063,Var,Yok,Yok,4698,2447,3,Vadeli,4798,Var,3,4022,2484,ABD,2055,Var,2,2459,2344,ABD,Yok,Yok,Sanatçı,Bekar,Spor,İyi,Online,825,Düşük Risk,2022-04-03,322.4,nan,0.8737413526919053,629,547,0.10259444139620044,28,0.4283034597749062,2743,0.10373521516766036
3,Kullanici_3,30,Türkiye,Erkek,53,184,Yok,2.0,Var,1500,Yok,Yok,Yok,1720,4047,4,Yok,Var,Yok,4,3095,3782,Çin,Var,2162,Yok,Var,Var,4849,4395,2,Vadeli,5717,Yok,3,1753,1918,Türkiye,2130,Var,1,1332,3096,Çin,Var,Yok,Sanatçı,Dul,Fotoğrafçılık,İyi,Her İkisi,673,Orta Risk,2022-10-30,353.15000000000003,nan,0.11987827959921687,1542,3812,0.11098449942926258,14,0.3725730278117894,3587,0.11386793538401903
4,Kullanici_4,47,Fransa,Erkek,118,182,Var,0.85,Yok,4281,Yok,Var,Var,2182,3423,2,Var,Var,Var,1,4234,3908,Türkiye,Var,3343,Var,Var,Var,4552,3442,1,Vadeli,4261,Yok,2,1083,3695,ABD,2502,Yok,3,4202,1121,Fransa,Yok,Yok,Sanatçı,Dul,Spor,İyi,Mağaza,591,Yüksek Risk,2022-09-21,272.15000000000003,nan,0.14889614076211777,2872,1092,0.04197886009814683,21,0.5871861065477587,1759,0.37793635974185324
5,Kullanici_5,35,Türkiye,Kadın,89,162,Yok,2.0,Var,2550,Var,Var,Var,4446,2228,1,Yok,Var,Yok,4,3215,4763,ABD,Var,1894,Var,Yok,Var,1575,1388,1,Vadeli,4762,Yok,1,3544,3519,Almanya,2778,Var,1,1278,2535,Fransa,Var,Yok,Sanatçı,Bekar,Yemek Yapma,İyi,Her İkisi,817,Orta Risk,2022-11-10,319.8,nan,0.5459816526405795,2572,4987,0.10238730467957205,17,0.5833683326333473,1984,0.1628602177030487
6,Kullanici_6,18,Almanya,Kadın,121,153,Yok,0.85,Yok,4938,Var,Yok,Yok,3998,4081,1,Var,Var,Yok,2,2779,1063,ABD,Var,1697,Yok,Var,Var,2336,2023,1,Vadesiz,6263,Yok,4,1675,2432,Çin,844,Var,1,2501,2840,Çin,Yok,Yok,Yazılım Geliştirici,Evli,Spor,İyi,Online,813,Düşük Risk,2022-03-21,394.45000000000005,Bekar,0.6899149349677549,1883,2671,0.037013601811298806,56,0.1347596998243653,5419,0.14817080148479828
VERİ SETİ TEST
Bash:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 65 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Kullanici_ID 50000 non-null int64
1 Ad 50000 non-null object
2 Yas 50000 non-null int64
3 Ulke 50000 non-null object
4 Cinsiyet 50000 non-null object
5 Kilo 50000 non-null int64
6 Boy 50000 non-null int64
7 Ehliyet 50000 non-null object
8 ParaBirimi 50000 non-null float64
9 KrediKarti 50000 non-null object
10 KrediLimiti 50000 non-null int64
11 KrediHesabi 50000 non-null object
12 KrediTarihi 50000 non-null object
13 KrediDurumu 50000 non-null object
14 KrediTutari 50000 non-null int64
15 KrediKalan 50000 non-null int64
16 KrediPuan 50000 non-null int64
17 Hesap 50000 non-null object
18 HesapTarihi 50000 non-null object
19 HesapDurumu 50000 non-null object
20 HesapPuan 50000 non-null int64
21 HesapTutari 50000 non-null int64
22 HesapKalan 50000 non-null int64
23 HesapParaBirimi 50000 non-null object
24 HesapKrediKarti 50000 non-null object
25 HesapKrediLimiti 50000 non-null int64
26 HesapKrediHesabi 50000 non-null object
27 HesapKrediTarihi 50000 non-null object
28 HesapKrediDurumu 50000 non-null object
29 HesapKrediTutari 50000 non-null int64
30 HesapKrediKalan 50000 non-null int64
31 HesapKrediPuan 50000 non-null int64
32 HesapTuru 50000 non-null object
33 Gelir 50000 non-null int64
34 GelirTarihi 50000 non-null object
35 GelirPuan 50000 non-null int64
36 GelirTutari 50000 non-null int64
37 GelirKalan 50000 non-null int64
38 GelirParaBirimi 50000 non-null object
39 Birikim 50000 non-null int64
40 BirikimTarihi 50000 non-null object
41 BirikimPuan 50000 non-null int64
42 BirikimTutari 50000 non-null int64
43 BirikimKalan 50000 non-null int64
44 BirikimParaBirimi 50000 non-null object
45 EgitimDurumu 50000 non-null object
46 Egitim 50000 non-null object
47 Meslek 50000 non-null object
48 MedeniDurum 50000 non-null object
49 Hobiler 50000 non-null object
50 SaglikDurumu 50000 non-null object
51 AlisverisTercihi 50000 non-null object
52 KrediSkoru 50000 non-null int64
53 YatirimTercihi 50000 non-null object
54 KatilmaTarihi 50000 non-null object
55 HarcamaPuani 50000 non-null float64
56 MedeniDurumu 48962 non-null object
57 HarcamaAliskanligi 50000 non-null float64
58 AylıkGiderler 50000 non-null int64
59 KrediMiktari 50000 non-null int64
60 KrediFaizOrani 50000 non-null float64
61 KrediVadeAy 50000 non-null int64
62 GiderOrani 50000 non-null float64
63 AylıkBirikim 50000 non-null int64
64 AylıkBirikimOrani 50000 non-null float64
dtypes: float64(6), int64(28), object(31)
memory usage: 24.8+ MB
Python:
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from collections import deque
import random
data = pd.read_csv('GÜNCELLEYİN!!!/global.csv')
data = data.select_dtypes(exclude=['object'])
data = data.dropna()
data = data.reset_index(drop=True)
birikim_miktari = [100, 500, 750, 1000]
data['KullaniciBirikimMiktari'] = np.random.choice(birikim_miktari, size=len(data))
state_size = data.shape[1] - 1
action_size = 2
batch_size = 32
n_episodes = 1000
n_steps_per_episode = 1000
memory = deque(maxlen=2000)
gamma = 0.95
epsilon = 1.0
epsilon_min = 0.01
epsilon_decay = 0.995
learning_rate = 0.001
def build_model(state_size, action_size):
model = Sequential()
model.add(Dense(24, input_shape=(state_size,), activation='relu'))
model.add(Dense(24, activation='relu'))
model.add(Dense(action_size, activation='linear'))
model.compile(loss='mse', optimizer=Adam(lr=learning_rate))
return model
model = build_model(state_size, action_size)
for episode in range(n_episodes):
state = data.iloc[episode % len(data)].values[:-1].reshape(1, -1)
total_reward = 0
for step in range(n_steps_per_episode):
if np.random.rand() <= epsilon:
action = np.random.choice(action_size)
else:
q_values = model.predict(state)
action = np.argmax(q_values[0])
new_state = data.iloc[(episode + step + 1) % len(data)].values[:-1].reshape(1, -1).astype(float)
reward = data.iloc[(episode + step + 1) % len(data)]['KullaniciBirikimMiktari']
done = False
memory.append((state, action, reward, new_state, done))
state = new_state
if len(memory) > batch_size:
minibatch = random.sample(memory, batch_size)
for state, action, reward, new_state, done in minibatch:
target = reward
if not done:
target = reward + gamma * np.amax(model.predict(new_state)[0])
target_f = model.predict(state)
target_f[0][action] = target
model.fit(state, target_f, epochs=1, verbose=0)
if done:
break
if epsilon > epsilon_min:
epsilon *= epsilon_decay
model.save('bankerbilo_dqn.h5')
3. ADIM TEST
Son düzenleme: