-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproject.py
More file actions
134 lines (109 loc) · 4.22 KB
/
project.py
File metadata and controls
134 lines (109 loc) · 4.22 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 29 21:47:53 2020
@author: İbrahim Mete Çiçek
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import math
from sklearn import tree
from sklearn.model_selection import cross_val_score
# Veri setini işleme hazırlama kısmı
data = pd.read_csv('veri.csv')
print(data.head())
X = data.iloc[:,:-1]
y = data.iloc[:,-1:].values.flatten()
kromozom_uzunlugu = len(data.columns)-1
# Bu işlem iterasyon sayısını etkiler
sıcaklık = math.exp(3) # Başlangıç sıcaklığı
minimum_sıcaklık = math.exp(-8) # Sıcaklığı durdur
alfa_degeri = 0.98 # Soğutma katsayısı
iterasyon_sayısı = 10 # En kötü çözümlerin üretilme sayısı
# Kötü bir çözümü benimseme olasılığını etkiler, daha kötü bir çözümü benimsemek daha kolay olur
k = 0.002
def uygunluk(delta_E,sıcaklık):
if delta_E<=0: # ΔE <= 0, ifadesi doğrudan kabul edildi
print('Sonuç: Doğrudan Çocuk sahibi olabilir')
return True
p=math.exp(-delta_E/(k*sıcaklık)) # Çocuk sahibi olma olasılığı
r=random.random()
if r<p:
print(str(r)+"<"+str(p)+",Sonuç: Çocuk sahibi olma ihtimali var")
return True
else:
print(str(r)+">="+str(p)+",Sonuç: Çocuk sahibi olamaz"+"("+str(iterasyon_sayısı)+")")
return False
# Feature selection kodlaması, simulated annealing buradan itibaren başlıyor
def gen_kodlaması(): # Gen Kodlaması
while True:
temp = []
kromozom_degeri_1 = False # Bu kromozomun değerinin 1 olmasının sorgulanması
for j in range(kromozom_uzunlugu):
rand = random.randint(0,1)
if rand == 1:
kromozom_degeri_1 = True
temp.append(rand)
if kromozom_degeri_1: # Kromozomların tümü 0 olamaz
return temp
def model_tutarlıgı(x):
X_test = X
kromozom_degeri_1 = False
for j in range(kromozom_uzunlugu):
if x[j] == 0:
X_test =X_test.drop(columns = j)
else:
kromozom_degeri_1 = True
X_test = X_test.values
if kromozom_degeri_1:
gtf = tree.DecisionTreeClassifier() # Karar ağacı model yapılandırması
model_tutarlıgı = cross_val_score(gtf, X_test, y, cv=5).mean() # 5 kez çapraz doğrulama optimizasyonu
return model_tutarlıgı
else:
model_tutarlıgı = 0 # Tüm modellerin uygunluğu 0'dır
return model_tutarlıgı
# Eski çözümden yeni çözüm üretilmesi
def yeni_kromozom(x):
mutasyon_noktası = random.randint(0, kromozom_uzunlugu-1) # Rastgele mutasyon noktaları seçimi
if x[mutasyon_noktası] == 1:
x[mutasyon_noktası] = 0
else:
x[mutasyon_noktası] = 1
return x
# Programın görselleştirilmesinin giriş kısmı
if __name__=='__main__':
plt.xlabel('sıcaklık')
plt.ylabel('model_tutarlıgı')
plt.xlim((minimum_sıcaklık,sıcaklık)) # X koordinat aralığı
plt.ylim((0.4,0.9)) # Y koordinat aralığı
px = []
eski_py = []
yeni_py = []
plt.ion()
eski_g = gen_kodlaması() # İlk önce rastgele çözüm üretilmeli
eski_m = model_tutarlıgı(eski_g)
while sıcaklık > minimum_sıcaklık:
yeni_g = yeni_kromozom(eski_g) # Rastgele çözümlerin üretilmesi
yeni_m = model_tutarlıgı(yeni_g) # Model tutarlığı yani fitness fonksiyonu, fit etmek oturtmak anlamına geliyor, modelin tutarlığını gösteriyor
delta_E = -(yeni_m - eski_m)
if uygunluk(delta_E,sıcaklık): # Kabul edilebilir
eski_g = yeni_g
eski_m = yeni_m
if delta_E<=0: # ΔE<=0, soğutma işlemi
sıcaklık = sıcaklık * alfa_degeri
else:
iterasyon_sayısı -= 1
if iterasyon_sayısı < 0:
break
print(sıcaklık)
print(eski_g)
print(eski_m)
print()
px.append(sıcaklık) # Elde edilen verilerin görsel olarak çizilme kısmı
eski_py.append(eski_m)
yeni_py.append(yeni_m)
plt.plot(px,eski_py,'r')
plt.plot(px,yeni_py)
plt.show()
plt.pause(0.001)