資料科學 HW2

Info

  • 環境:Windows 10, Jupyter, python 3
  • 套件:pandas、sklearn
  • 如果格式或Code上色有跑掉,可以至網頁觀看。

程式碼相關

程式執行

  • 建議直接使用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

  • 就只是把需要使用的套件引入進來。
import pandas as pd
from sklearn import cluster, metrics
import matplotlib.pyplot as plt

Data preprocessing

  • 先將資料集讀進來,然後移除無用欄位。
# 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值為何,雖然最後好像沒有參考到。
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是訓練過程是否有隨機性
model = cluster.KMeans(n_clusters = 9, n_init = 1000, random_state = 1)
model.fit(data)
result = model.predict(data)
  • 後面就是簡單的把預測結果fit到指定格式上,就不多做說明了。