# 資料科學 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`移除,然後直接看看估計值為何:
* 
* 
* 看起來`K=4`還不錯,就直接丟進去看看,結果為`0.68125`。
---
* 接著我仔細看一下資料,發現其實不少欄位我看不太懂用途(像是`feature1, 2`),因此這次移除大量欄位,只留下我自己覺得有用的部分。
* 
* 
* 和上面的做比較,好像一樣是`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到指定格式上,就不多做說明了。