---
# System prepended metadata

title: '[資料探勘Project2報告](https://hackmd.io/@qq21629489/ByGAf7odt)'
tags: [homework]

---

[資料探勘Project2報告](https://hackmd.io/@qq21629489/ByGAf7odt) 
===
P96104112 製造所 碩一 蘇冠瑜

## 分類火鍋

* 目標：分類好火鍋／壞火鍋
* 屬性（Attribute）：20種火鍋料：
    1. beef 牛肉 
    2. pork 豬肉
    3. lamb 羊肉
    4. cabbage 高麗菜
    5. pig blood 豬血
    6. chinese herbal medicine 中藥材
    7. taro 芋頭
    8. oden 黑輪
    9. pumpkin 南瓜
    10. bean curd skin 魚板
    11. black fungus 黑木耳
    12. rice blood cake 米血
    13. egg dumpling 蛋餃 
    14. snapper 鯛魚 
    15. mochi 麻糬
    16. frozen tofu 凍豆腐
    17. chinese cabbage 白菜
    18. enoki mushroom 金針菇 
    19. fried bread stick 油條
    20. pork balls 貢丸
    21. result 是不是好火鍋
* 絕對規則（Rule）
    * 定義5種好火鍋料（1～5）：good
    * 定義5種壞火鍋料（6～10）：bad
    * 若 sum(good) >= 3 且 sum(bad) <= 2，為好火鍋（result is 1）。
    * 若不是，則為壞火鍋（result is 0）。
    * 剩下的10種火鍋料為noise，不影響分類。
> 說明文件中，火鍋料編號從 **1** 開始；程式中，火鍋料編號從 **0** 開始。

---
## STEP1：資料生成
* 火鍋中是否有火鍋料X，以0、1表示，0表示無、1表示有。
* 每個火鍋有哪些火鍋料，皆以亂數生成。
* 共生成1000筆資料，其中約1/4(250筆)為好火鍋。
```python=31
good_sum = 0
for row in range(2, 1002):
    data = []
    for _ in range(20):
        data.append(random.randint(0, 1))
        
    good = data[0] + data[1] + data[2] + data[3] + data[4] # 好火鍋料總計
    bad = data[5] + data[6] + data[7] + data[8] + data[9] # 壞火鍋料總計
    
    if (good >= 3) and (bad <= 2): # rule
        data.append(1)
        good_sum += 1
    else:
        data.append(0)
```
![](https://i.imgur.com/pCUQxZv.png)

---
## STEP2：建立模型

### Decision Tree
採用sklearn libary之決策樹模型
```python=
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(
        criterion='gini',         # 最佳化方法
        max_depth=deep,           # 最深層數
        max_leaf_nodes=max_nodes) # 最多子葉數
```

### SVM
採用sklearn libary之SVM（SVC）模型
```python=
from sklearn.svm import SVC

model = SVC()
```

---
## Result

### Result in Decision Tree
![](https://i.imgur.com/KeA2tuq.png)

在最深層數為10，最多子葉數為64的設定下，training data的準確度約落在9成5，而testing data的準確度約為9成。testing data相較表現差一點
從結果來看，決策樹的分類已經接近rule的設定。
![](https://i.imgur.com/R9KuK3m.png)

此外，若不改變最深層數，對最多子葉數進行變動，結果如下圖：
![](https://i.imgur.com/OJfXOqx.png)
可以發現，當子葉數來到 **2 ^ 7** 時，training data的準確度幾乎來到100%。然而，子葉數越高，卻造成了testing data的準確度下降，因此可以此次結果判定最佳的最多子葉數設定為約 2 ^ 7左右。

### Result in SVM
![](https://i.imgur.com/gK5uK7d.png)
而在SVM中，traing data與testing data的準確度都來到了9成9。很明顯的SVM的分類結果幾乎可以代表rule的分類標準。

### Compare 2 Result
從結果（testing accuracy）來看，即使將Decision Tree的最多子葉數往上調，也達不到SVM的準確度。

---
## Other Discussion
在Decision Tree的結果中，可以發現在最開始的分類條件，幾乎都是火鍋料1.～10.，這表示決策樹在最開始就找到rule中關鍵的Attribute。
* 第一層
![](https://i.imgur.com/UABtI44.png)
* 第二、三層
![](https://i.imgur.com/4nYXRXM.png)
> 在較後面（深）的層數中，雖然有少部分是Noise Attribute，但大多數還是關鍵的Attribute（1.～10.）。
