ml_mt_note
1. Data Preprocessing
Training Dataset
X n = { X n 1 , X n 2 , . . . , X n D } X_n = \{ X_{n1}, X_{n2}, ..., X_{nD} \} X n = { X n 1 , X n 2 , ... , X n D } เรียกว่า Feature Matrix
Y = { y 1 , y 2 , . . . , y n } Y = \{ y_1, y_2, ..., y_n \} Y = { y 1 , y 2 , ... , y n } เรียกว่า Label Vector
D D D คือจำนวนของ Features
N N N คือจำนวนของ Datasets
Feature Engineering
สามารถแบ่งประเภทของ Features ได้สองแบบคือ
Continuos numeric
Categorical features
Data Preprocessing
เช่นการ
Handling missing value (ค่าที่หายไป)
ลบ Rows นั้นออก
แทนด้วยค่าเฉลี่ย, ค่า unknown , ค่าที่น่าจะใกล้เคียงที่สุด
แทนด้วยค่าที่พบมากที่สุด (Categorial)
Outlier Detection / Removal (ค่าที่ไม่ปกติ)
Visually: ด้วยการทำ Scatter Plot
Statiscally: ใช้ 2 หรือ 3 เท่าของ Standard deviations (SD) จากค่าเฉลี่ย
S . D . = ∑ ( x i − x ˉ ) 2 n − 1 S.D. = \sqrt{\sum{\dfrac{(x_i - \bar{x})^2}{n - 1}}} S . D . = ∑ n − 1 ( x i − x ˉ ) 2
Scaling / Normalization (Data smoothing)
แบ่งออกเป็นกลุ่มๆ แล้วเปลี่ยนค่าในกลุ่มเป็น ค่าเฉลี่ยน, boundaries, medians ของกลุ่ม
Normalization
Decimal Scaling หายไปที่ละ 1 0 j 10^j 1 0 j (เปลี่ยนจนกว่าค่าที่มากที่สุดหารด้วย 1 0 j 10^j 1 0 j จะ ≤ 1 \le 1 ≤ 1 )
v ′ = v 1 0 j v' = \dfrac{v}{10^j} v ′ = 1 0 j v
Min-max normalization (Mapping)
v ′ = v − m i n o l d m a x o l d − m i n o l d ( m a x n e w − m i n n e w ) + m i n n e w v' = \dfrac{v - min_{old}}{max_{old} - min_{old}}(max_{new} - min_{new}) + min_{new} v ′ = ma x o l d − mi n o l d v − mi n o l d ( ma x n e w − mi n n e w ) + mi n n e w
Z-score normalization (Standardization) ≈ [ 3 , − 3 ] \approx[3,-3] ≈ [ 3 , − 3 ]
v ′ = v − v ˉ S . D . v' = \dfrac{v - \bar{v}}{S.D.} v ′ = S . D . v − v ˉ
Feature Selection
Class imbalance
Hot-deck imputation (Closest-fit algorithm)
แทนค่าที่หายไป ด้วยค่าที่ใกล้เคียงที่สุด
d i s t a n c e ( x , y ) = ∑ i = 1 n d i s t a n c e ( a i ( x ) , a i ( y ) ) d i s t a n c e ( a i ( x ) , a i ( y ) ) = { 0 , if a i ( x ) = a i ( y ) 1 , if a i ( x ) ≠ a i ( y ) d i s t e u d ( a i ( x ) , a i ( y ) ) , if a i ( x ) and a i ( y ) is numeric \begin{align}
distance(x, y) & = \sum_{i=1}^{n} \color{red}{distance(a_i(x), a_i(y))} \\
\color{red}{distance(a_i(x), a_i(y))} & = \begin{cases}
0,& \text{if } a_i(x) = a_i(y)\\
1,& \text{if } a_i(x) \neq a_i(y)\\
dist_{eud}(a_i(x), a_i(y)),& \text{if } a_i(x) \text{ and } a_i(y) \text{ is numeric}\\
\end{cases}
\end{align} d i s t an ce ( x , y ) d i s t an ce ( a i ( x ) , a i ( y )) = i = 1 ∑ n d i s t an ce ( a i ( x ) , a i ( y )) = ⎩ ⎨ ⎧ 0 , 1 , d i s t e u d ( a i ( x ) , a i ( y )) , if a i ( x ) = a i ( y ) if a i ( x ) = a i ( y ) if a i ( x ) and a i ( y ) is numeric
Subject Age Income Gender d i s t a n c e ( a i ( x ) , a i ( 8 ) ) distance(a_i(x), {\color{red}a_i(8)}) d i s t an ce ( a i ( x ) , a i ( 8 ) ) 1 29 $40,000 M 1 + ∥ 40000 − 81000 ∥ + 1 = 41002 1 + \| 40000-81000 \| + 1 = 41002 1 + ∥40000 − 81000∥ + 1 = 41002 2 45 $36,000 M 1 + ∥ 36000 − 81000 ∥ + 1 = 45000 1 + \| 36000-81000 \| + 1 = 45000 1 + ∥36000 − 81000∥ + 1 = 45000 3 81 M 1 + ∥ 81000 ∥ + 1 = 81002 1 + \| 81000 \| + 1 = 81002 1 + ∥81000∥ + 1 = 81002 4 22 $16,000 1 + ∥ 16000 − 81000 ∥ + 1 = 65002 1 + \| 16000-81000 \| + 1 = 65002 1 + ∥16000 − 81000∥ + 1 = 65002 5 41 $98,000 M 1 + ∥ 98000 − 81000 ∥ + 1 = 17002 1 + \| 98000-81000 \| + 1 = 17002 1 + ∥98000 − 81000∥ + 1 = 17002 6 33 $60,000 F 1 + ∥ 60000 − 81000 ∥ + 0 = 21001 1 + \| 60000-81000 \| + 0 = 21001 1 + ∥60000 − 81000∥ + 0 = 21001 7 22 $24,000 F 1 + ∥ 24000 − 81000 ∥ + 0 = 57001 1 + \| 24000-81000 \| + 0 = 57001 1 + ∥24000 − 81000∥ + 0 = 57001 8 45 \color{blue}45 45 $81,000 F - 9 33 $55,000 F 1 + ∥ 55000 − 81000 ∥ + 0 = 26001 1 + \| 55000-81000 \| + 0 = 26001 1 + ∥55000 − 81000∥ + 0 = 26001 10 45 $80,000 F 1 + ∥ 80000 − 81000 ∥ + 0 = 10001 \color{blue} 1 + \| 80000-81000 \| + 0 = 10001 1 + ∥80000 − 81000∥ + 0 = 10001
ปัญหา Curse of Dimensionality
เมื่อจำนวนของ Features เพิ่มขึ้นจะทำให้ข้อมูลเกิดการกระจาย (Thinly scattered)
สามารถแก้ปัญหาได้ 2 แบบ
Feature Selection: เลือกเฉพาะที่มีประโยชน์
Feature Aggregation: รวมหลายๆ features เป็นอันเดียว
Pearson Correlation (Correlation coeffienct)
ไว้หาความสัมพันธ์ของตัวเลขสองตัวแปร
r = ∑ ( X i − X ˉ ) ( Y i − Y ˉ ) ∑ ( X i − X ˉ ) 2 ∑ ( Y i − Y ˉ ) 2 r = \dfrac{\sum(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum(X_i - \bar{X})^2\sum(Y_i - \bar{Y})^2}} r = ∑ ( X i − X ˉ ) 2 ∑ ( Y i − Y ˉ ) 2 ∑ ( X i − X ˉ ) ( Y i − Y ˉ )
Mutual Information
ไว้วัดความสัมพันธ์ระหว่าง Features กับ Label
ค่า MI ที่สูง: สัมพันธ์กันสูง
ค่า MI ที่ต่ำ: สัมพันธ์กันต่ำ
I ( X ; Y ) = ∑ y ∈ Y ∑ x ∈ X p ( x , y ) l o g 2 ( p ( x , y ) p ( x ) p ( y ) ) I(X;Y) = \sum_{y \in Y}\sum_{x \in X}p(x,y)log_2\left(\dfrac{p(x,y)}{p(x)p(y)}\right) I ( X ; Y ) = y ∈ Y ∑ x ∈ X ∑ p ( x , y ) l o g 2 ( p ( x ) p ( y ) p ( x , y ) )
ตัวอย่าง. จงคำนวนหาค่า MI ระหว่าง Outlook / Temperature
I ( Outlook ; Temperature ) = ∑ y ∈ Temperature ∑ x ∈ Outlook p ( x , y ) l o g 2 ( p ( x , y ) p ( x ) p ( y ) ) = ∑ x ∈ Outlook p ( x , Hot ) l o g 2 ( p ( x , Hot ) p ( x ) p ( Hot ) ) + ∑ x ∈ Outlook p ( x , Cold ) l o g 2 ( p ( x , Cold ) p ( x ) p ( Cold ) ) + ∑ x ∈ Outlook p ( x , Mild ) l o g 2 ( p ( x , Mild ) p ( x ) p ( Mild ) ) = [ p ( Sunny , Hot ) l o g 2 ( p ( Sunny , Hot ) p ( Sunny ) p ( Hot ) ) + p ( Overcast , Hot ) l o g 2 ( p ( Overcast , Hot ) p ( Overcast ) p ( Hot ) ) + p ( Rainy , Hot ) l o g 2 ( p ( Rainy , Hot ) p ( Rainy ) p ( Hot ) ) ] + [ p ( Sunny , Cold ) l o g 2 ( p ( Sunny , Cold ) p ( Sunny ) p ( Cold ) ) + p ( Overcast , Cold ) l o g 2 ( p ( Overcast , Cold ) p ( Overcast ) p ( Cold ) ) + p ( Rainy , Cold ) l o g 2 ( p ( Rainy , Cold ) p ( Rainy ) p ( Cold ) ) ] + [ p ( Sunny , Mild ) l o g 2 ( p ( Sunny , Mild ) p ( Sunny ) p ( Mild ) ) + p ( Overcast , Mild ) l o g 2 ( p ( Overcast , Mild ) p ( Overcast ) p ( Mild ) ) + p ( Rainy , Mild ) l o g 2 ( p ( Rainy , Mild ) p ( Rainy ) p ( Mild ) ) ] \begin{align}
I(\text{Outlook};\text{Temperature}) = & \sum_{y \in \text{Temperature}}\sum_{x \in \text{Outlook}}p(x,y)log_2\left(\dfrac{p(x,y)}{p(x)p(y)}\right) \\
= & \sum_{x \in \text{Outlook}}p(x,\text{\color{red}Hot})log_2\left(\dfrac{p(x,\text{\color{red}Hot})}{p(x)p(\text{\color{red}Hot})}\right) + \\
& \sum_{x \in \text{Outlook}}p(x,\text{\color{green}Cold})log_2\left(\dfrac{p(x,\text{\color{green}Cold})}{p(x)p(\text{\color{green}Cold})}\right) + \\
& \sum_{x \in \text{Outlook}}p(x,\text{\color{blue}Mild})log_2\left(\dfrac{p(x,\text{\color{blue}Mild})}{p(x)p(\text{\color{blue}Mild})}\right) \\
= & \left[
p(\text{\color{orange}Sunny},\text{\color{red}Hot})log_2\left(\dfrac{p(\text{\color{orange}Sunny},\text{\color{red}Hot})}{p(\text{\color{orange}Sunny})p(\text{\color{red}Hot})}\right) +
p(\text{\color{purple}Overcast},\text{\color{red}Hot})log_2\left(\dfrac{p(\text{\color{purple}Overcast},\text{\color{red}Hot})}{p(\text{\color{purple}Overcast})p(\text{\color{red}Hot})}\right) +
p(\text{\color{lime}Rainy},\text{\color{red}Hot})log_2\left(\dfrac{p(\text{\color{lime}Rainy},\text{\color{red}Hot})}{p(\text{\color{lime}Rainy})p(\text{\color{red}Hot})}\right)
\right] + \\
& \left[
p(\text{\color{orange}Sunny},\text{\color{green}Cold})log_2\left(\dfrac{p(\text{\color{orange}Sunny},\text{\color{green}Cold})}{p(\text{\color{orange}Sunny})p(\text{\color{green}Cold})}\right) +
p(\text{\color{purple}Overcast},\text{\color{green}Cold})log_2\left(\dfrac{p(\text{\color{purple}Overcast},\text{\color{green}Cold})}{p(\text{\color{purple}Overcast})p(\text{\color{green}Cold})}\right) +
p(\text{\color{lime}Rainy},\text{\color{green}Cold})log_2\left(\dfrac{p(\text{\color{lime}Rainy},\text{\color{green}Cold})}{p(\text{\color{lime}Rainy})p(\text{\color{green}Cold})}\right)
\right] + \\
& \left[
p(\text{\color{orange}Sunny},\text{\color{blue}Mild})log_2\left(\dfrac{p(\text{\color{orange}Sunny},\text{\color{blue}Mild})}{p(\text{\color{orange}Sunny})p(\text{\color{blue}Mild})}\right) +
p(\text{\color{purple}Overcast},\text{\color{blue}Mild})log_2\left(\dfrac{p(\text{\color{purple}Overcast},\text{\color{blue}Mild})}{p(\text{\color{purple}Overcast})p(\text{\color{blue}Mild})}\right) +
p(\text{\color{lime}Rainy},\text{\color{blue}Mild})log_2\left(\dfrac{p(\text{\color{lime}Rainy},\text{\color{blue}Mild})}{p(\text{\color{lime}Rainy})p(\text{\color{blue}Mild})}\right)
\right]
\end{align} I ( Outlook ; Temperature ) = = = y ∈ Temperature ∑ x ∈ Outlook ∑ p ( x , y ) l o g 2 ( p ( x ) p ( y ) p ( x , y ) ) x ∈ Outlook ∑ p ( x , Hot ) l o g 2 ( p ( x ) p ( Hot ) p ( x , Hot ) ) + x ∈ Outlook ∑ p ( x , Cold ) l o g 2 ( p ( x ) p ( Cold ) p ( x , Cold ) ) + x ∈ Outlook ∑ p ( x , Mild ) l o g 2 ( p ( x ) p ( Mild ) p ( x , Mild ) ) [ p ( Sunny , Hot ) l o g 2 ( p ( Sunny ) p ( Hot ) p ( Sunny , Hot ) ) + p ( Overcast , Hot ) l o g 2 ( p ( Overcast ) p ( Hot ) p ( Overcast , Hot ) ) + p ( Rainy , Hot ) l o g 2 ( p ( Rainy ) p ( Hot ) p ( Rainy , Hot ) ) ] + [ p ( Sunny , Cold ) l o g 2 ( p ( Sunny ) p ( Cold ) p ( Sunny , Cold ) ) + p ( Overcast , Cold ) l o g 2 ( p ( Overcast ) p ( Cold ) p ( Overcast , Cold ) ) + p ( Rainy , Cold ) l o g 2 ( p ( Rainy ) p ( Cold ) p ( Rainy , Cold ) ) ] + [ p ( Sunny , Mild ) l o g 2 ( p ( Sunny ) p ( Mild ) p ( Sunny , Mild ) ) + p ( Overcast , Mild ) l o g 2 ( p ( Overcast ) p ( Mild ) p ( Overcast , Mild ) ) + p ( Rainy , Mild ) l o g 2 ( p ( Rainy ) p ( Mild ) p ( Rainy , Mild ) ) ]
2. Distance-based Classification
Centroid-based Classification
สร้าง Centroid (จุดศูนย์กลางของทุกจุดใน Class นั้นๆ)
μ − = 1 N − ∑ y n = − 1 x n μ + = 1 N + ∑ y n = + 1 x n \begin{align}
\mu_{-} & = \dfrac{1}{N_{-}} \sum_{y_n = -1} x_n \\
\mu_{+} & = \dfrac{1}{N_{+}} \sum_{y_n = +1} x_n
\end{align} μ − μ + = N − 1 y n = − 1 ∑ x n = N + 1 y n = + 1 ∑ x n
K-NN Nearest Neightbor Classification
ดูว่า k (1, 2, 3, ...) จุดที่ใกล้ที่สุด เป็น Class อะไร (majority vote)
D ( X , Y ) = ∑ i = 1 D ( x i − y i ) 2 D(X,Y) = \sqrt{\sum^D_{i=1}(x_i - y_i)^2} D ( X , Y ) = i = 1 ∑ D ( x i − y i ) 2
ตัวอย่าง
Petal Sepal Class D ( c u r r , 1 ) D(curr, 1) D ( c u rr , 1 ) 4.9 4.9 4.9 3.0 3.0 3.0 Setosa \text{\color{red}Setosa} Setosa ( 4.9 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 0.509 \sqrt{(4.9-{\color{blue}5.4})^2 + (3.0-{\color{blue}2.9})^2}={\color{red}0.509} ( 4.9 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 0.509 4.7 4.7 4.7 3.2 3.2 3.2 Setosa \text{\color{red}Setosa} Setosa ( 4.7 − 5.4 ) 2 + ( 3.2 − 2.9 ) 2 = 0.761 \sqrt{(4.7-{\color{blue}5.4})^2 + (3.2-{\color{blue}2.9})^2}={\color{red}0.761} ( 4.7 − 5.4 ) 2 + ( 3.2 − 2.9 ) 2 = 0.761 4.6 4.6 4.6 3.1 3.1 3.1 Setosa \text{\color{red}Setosa} Setosa ( 4.6 − 5.4 ) 2 + ( 3.1 − 2.9 ) 2 = 0.824 \sqrt{(4.6-{\color{blue}5.4})^2 + (3.1-{\color{blue}2.9})^2}=0.824 ( 4.6 − 5.4 ) 2 + ( 3.1 − 2.9 ) 2 = 0.824 5.0 5.0 5.0 3.6 3.6 3.6 Setosa \text{\color{red}Setosa} Setosa ( 5.0 − 5.4 ) 2 + ( 3.6 − 2.9 ) 2 = 0.806 \sqrt{(5.0-{\color{blue}5.4})^2 + (3.6-{\color{blue}2.9})^2}=0.806 ( 5.0 − 5.4 ) 2 + ( 3.6 − 2.9 ) 2 = 0.806 6.4 6.4 6.4 3.2 3.2 3.2 Versicolor \text{\color{green}Versicolor} Versicolor ( 6.4 − 5.4 ) 2 + ( 3.2 − 2.9 ) 2 = 1.044 \sqrt{(6.4-{\color{blue}5.4})^2 + (3.2-{\color{blue}2.9})^2}=1.044 ( 6.4 − 5.4 ) 2 + ( 3.2 − 2.9 ) 2 = 1.044 6.9 6.9 6.9 3.1 3.1 3.1 Versicolor \text{\color{green}Versicolor} Versicolor ( 6.9 − 5.4 ) 2 + ( 3.1 − 2.9 ) 2 = 1.513 \sqrt{(6.9-{\color{blue}5.4})^2 + (3.1-{\color{blue}2.9})^2}=1.513 ( 6.9 − 5.4 ) 2 + ( 3.1 − 2.9 ) 2 = 1.513 5.5 5.5 5.5 2.3 2.3 2.3 Versicolor \text{\color{green}Versicolor} Versicolor ( 5.5 − 5.4 ) 2 + ( 2.3 − 2.9 ) 2 = 0.608 \sqrt{(5.5-{\color{blue}5.4})^2 + (2.3-{\color{blue}2.9})^2}={\color{red}0.608} ( 5.5 − 5.4 ) 2 + ( 2.3 − 2.9 ) 2 = 0.608 6.5 6.5 6.5 2.8 2.8 2.8 Versicolor \text{\color{green}Versicolor} Versicolor ( 6.5 − 5.4 ) 2 + ( 2.8 − 2.9 ) 2 = 1.104 \sqrt{(6.5-{\color{blue}5.4})^2 + (2.8-{\color{blue}2.9})^2}=1.104 ( 6.5 − 5.4 ) 2 + ( 2.8 − 2.9 ) 2 = 1.104 6.7 6.7 6.7 3.0 3.0 3.0 Virginica \text{\color{blue}Virginica} Virginica ( 6.7 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 1.303 \sqrt{(6.7-{\color{blue}5.4})^2 + (3.0-{\color{blue}2.9})^2}=1.303 ( 6.7 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 1.303 6.3 6.3 6.3 2.6 2.6 2.6 Virginica \text{\color{blue}Virginica} Virginica ( 6.3 − 5.4 ) 2 + ( 2.6 − 2.9 ) 2 = 0.948 \sqrt{(6.3-{\color{blue}5.4})^2 + (2.6-{\color{blue}2.9})^2}=0.948 ( 6.3 − 5.4 ) 2 + ( 2.6 − 2.9 ) 2 = 0.948 6.5 6.5 6.5 3.0 3.0 3.0 Virginica \text{\color{blue}Virginica} Virginica ( 6.5 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 1.104 \sqrt{(6.5-{\color{blue}5.4})^2 + (3.0-{\color{blue}2.9})^2}=1.104 ( 6.5 − 5.4 ) 2 + ( 3.0 − 2.9 ) 2 = 1.104
ข้อมูลที่ต้องการทดสอบ
No Petal Sepal Class 1 5.4 2.9 ??
ถ้า k = 3 k = 3 k = 3 ค่าที่น้อยสุด 3 อันดับแรกคือ
0.509 0.509 0.509 , Setosa \text{\color{red}Setosa} Setosa
0.608 0.608 0.608 , Versicolor \text{\color{green}Versicolor} Versicolor
0.761 0.761 0.761 , Setosa \text{\color{red}Setosa} Setosa
จะได้ Setosa \text{\color{red}Setosa} Setosa เยอะที่สุด คำตอบจึงเป็น Setosa \text{\color{red}Setosa} Setosa
K-dimensional Tree (K-d Tree)
เป็นวิธีการเก็บข้อมูลสำหรับการหา Nearest Neighbor
โดยจะแบ่งเป็นหลายๆ มิติ
วิธ๊สร้าง
นำข้อมูลมาเรียงด้วยแกน x
แบ่งข้อมูลด้วยค่า Median
กลับไปข้อ 1. ด้วยแกน y
วิธีใช้: คล้ายๆ กับ BST
ตัวอย่าง
( 7 , 2 ) , ( 5 , 9 ) , ( 9 , 6 ) , ( 4 , 7 ) , ( 8 , 1 ) , ( 7 , 6 ) (7,2), (5,9), (9,6), (4,7), (8,1), (7,6) ( 7 , 2 ) , ( 5 , 9 ) , ( 9 , 6 ) , ( 4 , 7 ) , ( 8 , 1 ) , ( 7 , 6 ) เรียงด้วยแกน x x x
( 4 , 7 ) , ( 5 , 9 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 8 , 1 ) , ( 9 , 6 ) ({\color{red}4},7), ({\color{red}5},9), ({\color{red}7},2), ({\color{red}7},6), ({\color{red}8},1), ({\color{red}9},6) ( 4 , 7 ) , ( 5 , 9 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 8 , 1 ) , ( 9 , 6 ) จะได้ค่า Median = 7 7 7 , จากนั้นแบ่งข้อมูลด้วย < 7 \lt 7 < 7 กับ ≥ 7 \ge 7 ≥ 7
ฝั่ง < 7 \lt 7 < 7 , ( 4 , 7 ) , ( 5 , 9 ) (4,7),(5,9) ( 4 , 7 ) , ( 5 , 9 ) เรียงด้วยแกน y
( 4 , 7 ) , ( 5 , 9 ) (4,{\color{blue}7}),(5,{\color{blue}9}) ( 4 , 7 ) , ( 5 , 9 ) จะได้ค่า Median = 8 8 8 , จากนั้นแบ่งข้อมูลด้วย < 8 \lt 8 < 8 กับ ≥ 8 \ge 8 ≥ 8
ฝั่ง ≥ 7 \ge 7 ≥ 7 , ( 8 , 1 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 9 , 6 ) (8,{\color{blue}1}),(7,{\color{blue}2}),(7,{\color{blue}6}),(9,{\color{blue}6}) ( 8 , 1 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 9 , 6 ) เรียงด้วยแกน y
( 8 , 1 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 9 , 6 ) (8,{\color{blue}1}),(7,{\color{blue}2}),(7,{\color{blue}6}),(9,{\color{blue}6}) ( 8 , 1 ) , ( 7 , 2 ) , ( 7 , 6 ) , ( 9 , 6 ) จะได้ค่า Median = 4 4 4 , จากนั้นแบ่งข้อมูลด้วย < 4 \lt 4 < 4 กับ ≥ 4 \ge 4 ≥ 4
💻 Code
Centroid-based classification
from sklearn . neighbors import NearestCentroid
K-neighbors classification
from sklearn . neighbors import KNeighborsClassifier
model = KNeighborsClassifier ( n_neighbors = 5 , algorithm = 'auto' )
# algorithm = 'auto', 'kd_tree', 'brute'
from sklearn . datasets import make_classification
X , y = make_classification ( n_samples = 1000 , n_features = 4 , n_classes = 2 )
from sklearn . model_selection import train_test_split
X_train , X_test , y_train , y_test = train_test_split ( X , y , test_size = 0.2 )
Hyper-parameter tuning (GridSearchCV)
from sklearn . model_selection import GridSearchCV
params = { 'n_neighbors' : list ( range ( 1 , 10 ) ) } # 'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9]
clf = GridSearchCV ( model , params )
clf . fit ( X_train , y_train )
clf . best_params_
# {'n_neighbors': 9}
clf . best_estimator_
# เอา Model ที่ดีที่สุดออกมา
import pickle
pickle . dump ( model , open ( 'my_model.sav' , 'wb' ) )
loaded_model = pickle . load ( open ( 'my_model.sav' , 'rb' ) )
3. Tree-based Classification
Decision Tree
ประกอบไปด้วย
Internal Node : จุดที่จะตัดสินใจ (จาก Feature ใด Feature หนึ่ง)
Branch (Edge/เส้น): ผลลัพท์ของการตัดสินใจ
Left Node ผลลัพท์สุดท้าย (Label)
Entropy measurement (วัดค่าความไม่แน่นอน)
เป็นการวัดค่าความสุ่ม ความไม่นอน
H ( S ) ∈ [ 0 , 1 ] H(S) \in [0, 1] H ( S ) ∈ [ 0 , 1 ]
C C C คือ Labels, S S S ข้อมูล row นึง
H ( S ) = − ∑ c ∈ C p c ⋅ l o g 2 ( p c ) H(S) = -\sum_{c \in C} p_c \cdot log_2 \left( p_c \right) H ( S ) = − c ∈ C ∑ p c ⋅ l o g 2 ( p c )
โดยจะเลือกแบ่ง Decision Tree จากค่า Entropy ที่น้อยที่สุด
ยิ่งค่ามาก จำนวนของแต่ละ Class จะเท่าๆ กัน
ยิ่งค่าน้อย จำนวนของแต่ละ Class จะต่างกัน
ตัวอย่าง
Gini Index
เป็นการวัดค่าความไม่เท่าเทียม/ความบริสุทธ์ ของแต่ละ Class
G i n i ( S ) ∈ [ 0 , 0.5 ] Gini(S) \in [0, 0.5] G ini ( S ) ∈ [ 0 , 0.5 ]
เลือกแบ่ง Decision Tree จากค่า Gini ที่น้อยที่สุด
ถ้า G i n i ( S ) = 0 Gini(S) = 0 G ini ( S ) = 0 หมายความว่ามี 1 Class เท่านั้น
ถ้า G i n i ( S ) = 0.5 Gini(S) = 0.5 G ini ( S ) = 0.5 หมายความว่าทุกๆ Class มีจำนวนเท่ากัน
G i n i ( S ) = 1 − ∑ c ∈ C P c 2 Gini(S) = 1 - \sum_{c \in C}P_c^2 G ini ( S ) = 1 − c ∈ C ∑ P c 2
สำหรับคำนวนว่าควรแบ่ง Decision Tree ตรงไหน
∣ S f ∣ |S_f| ∣ S f ∣ จำนวน sample ที่อยู่ใน feature f f f
∣ S ∣ |S| ∣ S ∣ จำนวน sample
H ( S f ) H(S_f) H ( S f ) ค่า Entropy ของ Label เมื่อถ้า
I G ( S , F ) = H ( S ) − ∑ f ∈ F ∣ S f ∣ ∣ S ∣ H ( S f ) IG(S,F) = H(S) - \sum_{f \in F} \dfrac{| S_f |}{| S |}H(S_f) I G ( S , F ) = H ( S ) − f ∈ F ∑ ∣ S ∣ ∣ S f ∣ H ( S f )
ตัวอย่าง
Name Hair Height Weight Lotion Result Sarah Blonde Average Light No Subburned Dana Blonde Tall Average Yes None Alex Brown Short Average Yes None Annie Blonde Short Average No Subburned Emily Red Average Heavy No Subburned Pete Brown Tall Heavy No None John Brown Average Heavy No None Katie Blonde Short Light Yes None
H ( Result ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − [ ( 3 8 ) l o g 2 ( 3 8 ) + ( 5 8 ) l o g 2 ( 5 8 ) ] = 0.9544340029 \begin{align}
H(\text{Result}) & = - \left[P(\text{\color{red}Subburned})log2(\text{\color{red}Subburned}) + P(\text{\color{blue}None})log2(\text{\color{blue}None})\right] \\
& = - \left[ {\color{red}(\dfrac{3}{8})log2(\dfrac{3}{8})} + {\color{blue}(\dfrac{5}{8})log2(\dfrac{5}{8})} \right] \\
& = 0.9544340029
\end{align} H ( Result ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − [ ( 8 3 ) l o g 2 ( 8 3 ) + ( 8 5 ) l o g 2 ( 8 5 ) ] = 0.9544340029
คำนวน Entropy ของ Label เมื่อแบ่ง Feature ด้วย Hair
Name Hair Height Weight Lotion Result Sarah Blonde Average Light No Subburned Dana Blonde Tall Average Yes None Annie Blonde Short Average No Subburned Katie Blonde Short Light Yes None
H ( Text ∣ Hair = " B l o n d e " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 2 4 ) l o g 2 ( 2 4 ) + ( 2 4 ) l o g 2 ( 2 4 ) ) = 1 \begin{align}
H(\text{Text}|\text{Hair}="Blonde") & = - \left[P(\text{\color{red}Subburned})log2(\text{\color{red}Subburned}) + P(\text{\color{blue}None})log2(\text{\color{blue}None})\right] \\
& = - \left( {\color{red}(\dfrac{2}{4})log_2(\dfrac{2}{4})} + {\color{blue}(\dfrac{2}{4})log_2(\dfrac{2}{4})} \right) \\
& = 1
\end{align} H ( Text ∣ Hair = " Bl o n d e " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 4 2 ) l o g 2 ( 4 2 ) + ( 4 2 ) l o g 2 ( 4 2 ) ) = 1
Name Hair Height Weight Lotion Result Emily Red Average Heavy No Subburned
H ( Text ∣ Hair = " R e d " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 1 1 ) l o g 2 ( 1 1 ) + ( 0 1 ) l o g 2 ( 0 1 ) ) = 0 \begin{align}
H(\text{Text}|\text{Hair}="Red") & = - \left[P(\text{\color{red}Subburned})log2(\text{\color{red}Subburned}) + P(\text{\color{blue}None})log2(\text{\color{blue}None})\right] \\
& = - \left( {\color{red}(\dfrac{1}{1})log_2(\dfrac{1}{1})} + {\color{blue}(\dfrac{0}{1})log_2(\dfrac{0}{1})} \right) \\
& = 0
\end{align} H ( Text ∣ Hair = " R e d " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 1 1 ) l o g 2 ( 1 1 ) + ( 1 0 ) l o g 2 ( 1 0 ) ) = 0
Name Hair Height Weight Lotion Result Alex Brown Short Average Yes None Pete Brown Tall Heavy No None John Brown Average Heavy No None
H ( Text ∣ Hair = " B r o w n " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 0 3 ) l o g 2 ( 0 3 ) + ( 3 3 ) l o g 2 ( 3 3 ) ) = 0 \begin{align}
H(\text{Text}|\text{Hair}="Brown") & = - \left[P(\text{\color{red}Subburned})log2(\text{\color{red}Subburned}) + P(\text{\color{blue}None})log2(\text{\color{blue}None})\right] \\
& = - \left( {\color{red}(\dfrac{0}{3})log_2(\dfrac{0}{3})} + {\color{blue}(\dfrac{3}{3})log_2(\dfrac{3}{3})} \right) \\
& = 0
\end{align} H ( Text ∣ Hair = " B ro w n " ) = − [ P ( Subburned ) l o g 2 ( Subburned ) + P ( None ) l o g 2 ( None ) ] = − ( ( 3 0 ) l o g 2 ( 3 0 ) + ( 3 3 ) l o g 2 ( 3 3 ) ) = 0
ค่า Information Gain เมื่อแบ่งด้วย Hair จึงได้ (Blonde, Red, Brown ตามลำดับ)
I G ( Hair ) = H ( Result ) − [ ∣ S B l o n d e ∣ ∣ S ∣ H ( B l o n d e ) + ∣ S R e d ∣ ∣ S ∣ H ( R e d ) + ∣ S B r o w n ∣ ∣ S ∣ H ( B r o w n ) ] = 0.954 − [ 4 8 ( 1 ) + 1 8 ( 0 ) + 3 8 ( 0 ) ] = 0.454 \begin{align}
IG(\text{Hair}) & = H(\text{Result}) - \left[
\dfrac{|S_{Blonde}|}{|S|}H(Blonde) +
\dfrac{|S_{Red}|}{|S|}H(Red) +
\dfrac{|S_{Brown}|}{|S|}H(Brown)
\right] \\
& = 0.954 - \left[
\dfrac{4}{8}(1) +
\dfrac{1}{8}(0) +
\dfrac{3}{8}(0)
\right] \\
& = 0.454
\end{align} I G ( Hair ) = H ( Result ) − [ ∣ S ∣ ∣ S Bl o n d e ∣ H ( Bl o n d e ) + ∣ S ∣ ∣ S R e d ∣ H ( R e d ) + ∣ S ∣ ∣ S B ro w n ∣ H ( B ro w n ) ] = 0.954 − [ 8 4 ( 1 ) + 8 1 ( 0 ) + 8 3 ( 0 ) ] = 0.454
ค่า Information Gain เมื่อแบ่งด้วย Weight (Light, Average, Heavy)
I G ( Weight ) = 0.964 − [ 2 8 ( 1 ) + 3 8 ( 0.9182958341 ) + 3 8 ( 0.9182958341 ) ] = 0.015 \begin{align}
IG(\text{Weight}) & = 0.964 - \left[
\dfrac{2}{8}(1) +
\dfrac{3}{8}(0.9182958341) +
\dfrac{3}{8}(0.9182958341)
\right] \\
& = 0.015
\end{align} I G ( Weight ) = 0.964 − [ 8 2 ( 1 ) + 8 3 ( 0.9182958341 ) + 8 3 ( 0.9182958341 ) ] = 0.015
ค่า Information Gain เมื่อแบ่งด้วย Lotion (Yes, No)
I G ( Lotion ) = 0.964 − [ 3 8 ( 0 ) + 5 8 ( 0.9709505945 ) ] = 0.347 \begin{align}
IG(\text{Lotion}) & = 0.964 - \left[
\dfrac{3}{8}(0) +
\dfrac{5}{8}(0.9709505945)
\right] \\
& = 0.347
\end{align} I G ( Lotion ) = 0.964 − [ 8 3 ( 0 ) + 8 5 ( 0.9709505945 ) ] = 0.347
∴ \therefore ∴ จากค่า IG เมื่อแบ่งด้วย Hair, Weight, Lotion จะได้ค่า IG สูงสุดเมื่อแบ่งด้วย Hair
Tree Ensemble
การรวม Decision Tree หลายๆ อันมาช่วยตัดสินใจ
สามารถทำได้ 2 แบบคือ
Bagging: แบ่ง Training data ออกเป็นหลายๆ แล้วเอาไปทำ Model เมื่อใช้งานก็จะให้ดูว่าคำตอบไหนเป็นคำตอบที่ตอบเยอะที่สุด
Boosting: สร้าง Decision Tree มาต่อๆ กัน เพื่อให้ Decision อันต่อมาแก้คำตอบของอันก่อนหน้า
มักจะสร้าง Weak Tree ที่มีเพียง 1-2 ชั้น
แต่จะเอาคำตอบของต้นแรก มาทำต้นต่อมาเพื่อลดข้อผิดพลาด
เช่น XGBoost
💻 Code
from sklearn . tree import DecisionTreeClassifier
model = DecisionTreeClassifier ( max_depth = 5 , criterion = 'entropy' )
model . fit ( X_train , y_train )
from sklearn . tree import plot_tree
import matplotlib . pyplot as plt
plt . figure ( figsize = ( 20 , 10 ) )
tree . plot_tree ( model , filled = True , features_names = X_train . columns , class_names = [ '<=50K' , '>50K' ] )
plt . show ( )
เปลี่ยนข้อมูล Categorical แบบตัวอักษร หรืออื่นๆ ไปเป็น ตัวเลข (Label Encode)
from sklearn . preprocessing import LabelEncoder
label_encoder = LabelEncoder ( )
df [ 'f1' ] = label_encoder . fit_transform ( df [ 'f1' ] )
ทำ Random Forest (Tree Ensemble)
from sklearn . ensemble import RandomForestClassifier
model = RandomForestClassifier ( n_estimators = 10 , criterion = 'entropy' , max_depth = 5 )
model . fit ( X_train , y_train )
from sklearn . tree import plot_tree
import matplotlib . pyplot as plt
fig , axes = plt . subplot ( nrows = 1 , ncols = 3 , figsize = ( 10 , 2 ) , dpi = 900 )
for idx in range ( 3 ) :
plot_tree ( model . estimators_ [ idx ] , filled = True ,
feature_names = X_train . columns ,
class_names = [ '<=50K' , '>50K' ] ,
ax = axes . ravel ( ) [ idx ]
)
import xgboost as xgb
model = xgb . XGBClassifier ( objective = 'multi:softmax' , n_estimators = 10 , max_depth = 5 , num_class = 3 )
mode . fit ( X_train , X_test )