# 資料科學 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到指定格式上,就不多做說明了。