import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier as Knn
from sklearn import datasets
from sklearn.model_selection import cross_val_score as crovasco
from itertools import combinations as combi
wine = datasets.load_wine() # ดึงข้อมูลไวน์
X,z = wine.data,wine.target
X = (X-X.mean(0))/X.std(0) # ทำให้เป็นมาตรฐาน
model = Knn(9) # เพื่อนบ้านใกล้สุด 9 ตัว
n = X.shape[1] # จำนวนตัวแปร
ind = tuple(range(n)) # ดัชนีของตัวแปร ไล่จาก 0 จนถึง n-1
khanaen = []
index = []
# วนซ้ำโดยไล่จำนวนตัวแปร (k) จาก =n ไปจนถึง 1
for k in range(n,0,-1):
khanaen_disut = 0 # คะแนนดีสุดในแต่ละรอบ
ii_disut = 0 # รูปแบบการเลือกกลุ่มตัวแปรที่ดีที่สุด
# ใช้ combinations เพื่อหยิบตัวแปรจำนวน k ตัวจากตัวแปรที่เหลืออยู่ในแต่ละรอบ
for ii in combi(ind,k):
khanaen_ii = crovasco(model,X[:,ii],z,cv=5).mean() # หาคะแนนแล้วเฉลี่ย
# หากได้คะแนนสูงกว่าเดิมก็ให้เก็บค่า
if(khanaen_ii>khanaen_disut):
khanaen_disut = khanaen_ii
ii_disut = ii
ind = ii_disut # รูปแบบกลุ่มตัวแปรที่ดีที่สุดจะนำมาใช้เป็นกลุ่มตั้งต้นในรอบถัดไป
khanaen.append(khanaen_disut)
index.append(ind)
print(ind)
print([wine.feature_names[i] for i in index[np.array(khanaen).argmax()]])
plt.plot(range(n,0,-1),khanaen,'o-g')
plt.show()
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12)
(0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 12)
(0, 1, 2, 3, 4, 5, 6, 9, 11, 12)
(0, 1, 2, 3, 4, 6, 9, 11, 12)
(0, 1, 2, 3, 6, 9, 11, 12)
(0, 2, 3, 6, 9, 11, 12)
(0, 3, 6, 9, 11, 12)
(0, 6, 9, 11, 12)
(0, 6, 9, 12)
(6, 9, 12)
(6, 9)
(6,)
['alcohol', 'ash', 'alcalinity_of_ash', 'flavanoids', 'color_intensity', 'od280/od315_of_diluted_wines', 'proline']
import numpy as np
from sklearn.model_selection import cross_val_score as crovasco
from itertools import combinations as combi
class KhatLueakYonKlapLangTamLamdap:
def __init__(self,model,k0=1,cv=5):
self.model = model
self.k0 = max(k0,1)
self.cv = max(cv,2)
def rianru(self,X,z):
self.n = X.shape[1]
if(self.n<=self.k0):
print('จำนวนมิติข้อมูลต้องมากกว่ามิติต่ำสุดที่ต้องการ')
raise
ind = tuple(range(self.n))
self.index = []
self.khanaen = []
self.std = []
for k in range(self.n,self.k0-1,-1):
khanaen_disut = 0
for ii in combi(ind,k):
cvc = crovasco(self.model,X[:,ii],z,cv=self.cv)
khanaen_ii = cvc.mean()
if(khanaen_ii>khanaen_disut):
ii_disut = ii
khanaen_disut = khanaen_ii
std_disut = cvc.std()
ind = ii_disut
self.index.append(ind)
self.khanaen.append(khanaen_disut)
self.std.append(std_disut)
self.khanaen = np.array(self.khanaen)
self.std = np.array(self.std)
def plaeng(self,X,k=0):
if(k):
return X[:,self.index[self.n-k]]
else:
i = self.khanaen.argmax()
return X[:,self.index[i]]
from sklearn.linear_model import LogisticRegression as Lori
sbs = KhatLueakYonKlapLangTamLamdap(Lori(),k0=1)
sbs.rianru(X,z)
plt.plot(range(13,0,-1),sbs.khanaen,'o-g')
plt.fill_between(range(13,0,-1),sbs.khanaen-sbs.std,sbs.khanaen+sbs.std,color='#AAFFCC')
plt.show()
print(sbs.plaeng(X).shape) # ได้ (178, 9)
print(sbs.plaeng(X,6).shape) # ได้ (178, 6)
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ