---
# System prepended metadata

title: 資料科學 HW2

---

# 資料科學 HW2

## Info

* 環境：Windows 10, Jupyter, python 3
* 套件：pandas、sklearn

- **如果格式或Code上色有跑掉，可以至[網頁](https://hackmd.io/@Zero871015/Data-science-hw2)觀看。**

## 程式碼相關

### 程式執行

* 建議直接使用jupyter開啟附檔的notebook(*HW2.ipynb*)
* 否則有附上純python檔(*HW2.py*)，但沒有測試過跑不跑得動。
* 執行時請將檔案按照下方放置，執行後會跑出*ans.csv*為答案。

### 檔案擺放路徑
```
2020-data-science-hw2
|
|--- HW2.ipynb (code)
|
|--- data.csv
|
|--- submit.csv
|
|--- test.csv
```

### 模型

* 使用KMeans演算法。
* 再使用之前先計算群間差異和群內差異的比值還有Elbow Method來評估K值為和最佳。
    * 前者越接近1越好，後者要找斷點。

### 資料前處理

* 先把`id`和全部都一樣的`feature3`移除，然後直接看看估計值為何：
    * ![](https://i.imgur.com/Dd9dqHf.png)
    * ![](https://i.imgur.com/8Dd46Ak.png)
* 看起來`K=4`還不錯，就直接丟進去看看，結果為`0.68125`。

---

* 接著我仔細看一下資料，發現其實不少欄位我看不太懂用途(像是`feature1, 2`)，因此這次移除大量欄位，只留下我自己覺得有用的部分。
    * ![](https://i.imgur.com/TaTztag.png)
    * ![](https://i.imgur.com/y5WB9j4.png)
* 和上面的做比較，好像一樣是`K=4`左右，因此又丟了一次，結果這次反而變差，分數為`0.6625`
* 但可以注意到兩張圖的曲線都有點緩下來，我認為可能是分群不夠多，因此試試看`K=8`，結果分數果然有所進步，得到`0.7625`分。

---

* 再調了部分參數還是沒有用的情況下，我決定把feature砍到只剩下和色彩有關的部分，我只留下了RGB、灰階值、明度、飽和度、色相等資訊。
* 原本只是死馬當活馬醫，結果意外的有用，得到`0.84375`分，看來與周遭區域的資訊並不是特別重要。


### Code詳細

#### Import packages

* 就只是把需要使用的套件引入進來。

```python=!
import pandas as pd
from sklearn import cluster, metrics
import matplotlib.pyplot as plt
```

#### Data preprocessing

* 先將資料集讀進來，然後移除無用欄位。

```python=!
# Load data
data = pd.read_csv('data.csv')
data = data.drop(columns = ['id', 'feature1', 'feature2', 'feature3', 'feature4', 'feature5', 'feature6','feature7','feature8','feature9', 'feature14', 'feature15', 'feature16'])
```

#### Find K

* 用演算法找較好的K值為何，雖然最後好像沒有參考到。

```python=!
silhouette_avgs = []
ks = range(2, 11)
for k in ks:
    kmeans_fit = cluster.KMeans(n_clusters = k).fit(data)
    cluster_labels = kmeans_fit.labels_
    silhouette_avg = metrics.silhouette_score(data, cluster_labels)
    silhouette_avgs.append(silhouette_avg)
    
plt.bar(ks, silhouette_avgs)
plt.show()
print(silhouette_avgs)

distortions = []
K = range(1,10)
for k in K:
    kmeanModel = cluster.KMeans(n_clusters=k)
    kmeanModel.fit(data)
    distortions.append(kmeanModel.inertia_)
    
plt.figure(figsize=(16,8))
plt.plot(K, distortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Distortion')
plt.title('The Elbow Method showing the optimal k')
plt.show()
```

#### KMeans

* 調用sklearn的KMeans分類法。
    * n_clusters是群數。
    * n_init是要跑多久。
    * random_state是訓練過程是否有隨機性

```python=!
model = cluster.KMeans(n_clusters = 9, n_init = 1000, random_state = 1)
model.fit(data)
result = model.predict(data)
```

* 後面就是簡單的把預測結果fit到指定格式上，就不多做說明了。