import numpy as np
print(np.random.choice(20,20))
[ 0 14 0 0 16 12 3 5 9 5 15 13 18 6 5 1 5 6 2 13]
import matplotlib.pyplot as plt
np.random.seed(20)
X = np.random.uniform(-1,1,[1000,2])
z = ((np.abs(X[:,0])+np.abs(X[:,1]))//0.4).astype(int)
plt.axes(aspect=1)
plt.scatter(X[:,0],X[:,1],c=z,edgecolor='k',cmap='plasma')
plt.show()
from sklearn.tree import DecisionTreeClassifier as Ditri
from sklearn.model_selection import train_test_split
X_fuek,X_truat,z_fuek,z_truat = train_test_split(X,z,test_size=0.2) # แยกข้อมูลส่วนหนึ่งไว้ตรวตสอบ
zzz = 0 # เตรียมไว้สำหรับรวมผลของแต่ละรอบ
for i in range(10):
s = np.random.choice(800,800) # สุ่ม บูตสแตร็ป
dt = Ditri() # ใช้ต้นไม้ตัดสินใจของ sklearn
dt.fit(X_fuek[s],z_fuek[s]) # เรียนรู้ด้วยข้อมูลที่สุ่มได้ในแต่ละรอบ
zz = dt.predict(X_truat) # ทำนายผลของแต่ละรอบ
zz_1h = zz[:,None]==np.arange(10) # ทำผลเป็น one-hot
zzz += zz_1h # เก็บรวมผลของแต่ละรอบ
print(u'รอบที่ %d คะแนน %.3f'%(i+1,(zz==z_truat).mean()))
# นำผลการทำนายในแต่ละรอบมาสรุปรวมเป็นผลแล้วหาความแม่น
print('---\nผลรวมได้ %.3f'%(zzz.argmax(1)==z_truat).mean())
รอบที่ 1 คะแนน 0.810
รอบที่ 2 คะแนน 0.845
รอบที่ 3 คะแนน 0.845
รอบที่ 4 คะแนน 0.870
รอบที่ 5 คะแนน 0.855
รอบที่ 6 คะแนน 0.835
รอบที่ 7 คะแนน 0.840
รอบที่ 8 คะแนน 0.885
รอบที่ 9 คะแนน 0.845
รอบที่ 10 คะแนน 0.890
---
ผลรวมได้ 0.935
dt = Ditri()
dt.fit(X_fuek,z_fuek)
zz = dt.predict(X_truat)
print((zz==z_truat).mean()) # ได้ 0.89
import numpy as np
import matplotlib.pyplot as plt
def gini(p):
return 1-(p**2).sum()
class Chuttaek:
def __init__(self,X,z,chan):
self.chan = chan
self.n = len(z)
self.king = []
if(len(np.unique(z))==1):
self.z = z[0]
elif(chan==0):
self.z = np.bincount(z).argmax()
else:
self.gn = 1
for j in range(X.shape[1]):
x = X[:,j]
xas = x.argsort()
x_riang = x[xas]
z_riang = z[xas]
x_kan = (x_riang[1:]+x_riang[:-1])/2
x_kan = x_kan[z_riang[1:]!=z_riang[:-1]]
for khabaeng in x_kan:
baeng = khabaeng>x
z_sai = z[baeng]
z_khwa = z[~baeng]
n_sai = float(len(z_sai))
n_khwa = float(len(z_khwa))
gn = (gini(np.bincount(z_sai)/n_sai)*n_sai+gini(np.bincount(z_khwa)/n_khwa)*n_khwa)/self.n
if(self.gn>gn):
self.gn = gn
self.j = j
self.khabaeng = khabaeng
o = (self.khabaeng>X[:,self.j])
self.king = [Chuttaek(X[o],z[o],chan-1),Chuttaek(X[~o],z[~o],chan-1)]
def __call__(self,X):
if(self.king==[]):
return self.z
else:
o = self.khabaeng>X[:,self.j]
return np.where(o,self.king[0](X),self.king[1](X))
class TonmaiTatsinchai:
def __init__(self,luek):
self.luek = luek
def rianru(self,X,z):
self.rak = Chuttaek(X,z,self.luek)
def thamnai(self,X):
return self.rak(X)
class Pasum:
def __init__(self,luek,n_tonmai=10):
self.luek = luek
self.n_tonmai = n_tonmai
def rianru(self,X,z):
n = len(z)
self.kiklum = z.max()+1
self.tonmai = []
for i in range(self.n_tonmai):
tt = TonmaiTatsinchai(self.luek)
s = np.random.choice(n,n)
tt.rianru(X[s],z[s])
self.tonmai.append(tt)
def _thamnai(self,X):
phon = 0
for tt in self.tonmai:
phon += tt.thamnai(X)[:,None]==np.arange(self.kiklum)
return phon
def thamnai(self,X):
return self._thamnai(X).argmax(1)
def thamnai_laiat(self,X):
return self._thamnai(X)/self.n_tonmai
np.random.seed(2)
X = np.random.uniform(-1,1,[1000,2])
z = (np.sqrt(X[:,0]**2+X[:,1]**2)//0.282).astype(int)
pasum = Pasum(100)
pasum.rianru(X,z)
nmesh = 200
mx,my = np.meshgrid(np.linspace(X[:,0].min(),X[:,0].max(),nmesh),np.linspace(X[:,1].min(),X[:,1].max(),nmesh))
mX = np.stack([mx.ravel(),my.ravel()],1)
mz = pasum.thamnai(mX).reshape(nmesh,nmesh)
plt.axes(aspect=1,xlim=[mx.min(),mx.max()],ylim=[my.min(),my.max()])
plt.scatter(X[:,0],X[:,1],alpha=0.6,c=z,edgecolor='k',cmap='rainbow')
plt.contourf(mx,my,mz,alpha=0.4,cmap='rainbow',zorder=0)
plt.show()
print(len(pasum.tonmai)) # ได้ 10
print(pasum.tonmai[0]) # ได้ <__main__.TonmaiTatsinchai object at 0x1166a97b8>
print(pasum.tonmai[0].rak) # ได้ <__main__.Chuttaek object at 0x1166a9c18>
print(pasum.tonmai[0].rak.king) # ได้ [<__main__.Chuttaek object at 0x1166a99e8>, <__main__.Chuttaek object at 0x1165acc18>]
np.random.seed(11)
X = np.random.uniform(-1,1,[1000,2])
z = (np.sqrt(X[:,0]**2+X[:,1]**2)//0.707).astype(int)
pasum = Pasum(100,n_tonmai=100)
pasum.rianru(X,z)
nmesh = 200
mx,my = np.meshgrid(np.linspace(-1,1,nmesh),np.linspace(-1,1,nmesh))
mX = np.stack([mx.ravel(),my.ravel()],1)
mz = pasum.thamnai_laiat(mX)[:,1].reshape(nmesh,nmesh)
plt.axes(aspect=1,xlim=[mx.min(),mx.max()],ylim=[my.min(),my.max()])
plt.scatter(X[:,0],X[:,1],c=z,alpha=0.9,edgecolor='k',cmap='Spectral')
plt.contourf(mx,my,mz,100,cmap='Spectral',zorder=0)
plt.colorbar(pad=0.01)
plt.show()
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ