iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
AI & Data

ML From Scratch系列 第 13

[Day 13] K nearest neighbors — 解決真實問題

  • 分享至 

  • xImage
  •  

今天我們要透過 KNN 去解決 Spaceship Titanic

https://ithelp.ithome.com.tw/upload/images/20230913/20152821anPVhsmSaR.png

此次 Kaggle Competition 跟一開始介紹 Titanic - Machine Learning from Disaster 是類似的題目

主要是透過資料去判斷說太空船上的乘客的是否被傳送到另一個維度

Data

  • train.csv
  • test.csv
  • sample_submission.csv

train.csv

PassengerId - 每位乘客都有一個唯一的 ID
HomePlanet - 乘客離開的星球,通常是他們永久居住的星球
CryoSleep - 指示乘客是否選擇在航程期間處於假死狀態
Cabin - 旅客所入住的艙室號
採用甲板/數字/側面的形式,其中側面可以是表示左舷的 P 或表示右舷的 S
Destination - 乘客將要登陸的星球
Age - 乘客的年齡
VIP - 旅客在航程中是否已付費享受特殊VIP服務
RoomService, FoodCourt, ShoppingMall, Spa, VRDeck - 乘客在泰坦尼克號宇宙飛船的眾多豪華設施中所支付的費用
Name - 乘客的名字和姓氏
Transported - 是否被傳送到另一個維度


Import Library

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
from sklearn.impute import SimpleImputer
from sklearn import metrics
from sklearn.model_selection import GridSearchCV

在此說明一下所要用的的 Library

StandardScaler:用來對數據進行標準化處理,確保每個特徵的平均值為0,標準差為1。

LabelEncoder:用來將分類標籤轉換成數值,以便機器學習模型能夠處理。

sklearn.neighbors:這是 scikit-learn 庫中的一個模組,用於K最近鄰(K-Nearest Neighbors)分類。

sklearn.impute:用於數據缺失值處理。這裡使用了 SimpleImputer 用來填充數據中的缺失值,以確保數據完整性。

sklearn.metrics:用於模型評估和評價。它包含各種用於評估機器學習模型性能的指標和函數。

sklearn.model_selection:用於模型選擇和超參數調整。這裡使用了 GridSearchCV(用於通過網格搜索來找到最佳的超參數組合,以優化機器學習模型的性能。

Load Dataset

#read train data
train = pd.read_csv("/kaggle/input/spaceship-titanic/train.csv")
#read test data
test = pd.read_csv("/kaggle/input/spaceship-titanic/test.csv")
#read submission data
submission = pd.read_csv("/kaggle/input/spaceship-titanic/sample_submission.csv")

這裡主要是透過 Kaggle notebook 開發,所以在其他地方開發的讀取資料集的路徑 pd.read_csv 要更改一下。

Data Preparation

simp_num = SimpleImputer(missing_values = np.nan, strategy = "mean")
simp_cat = SimpleImputer(missing_values = np.nan, strategy = "most_frequent")

上述程式碼主要使用了兩個不同的資料填補方法(Imputer):一個用於數值資料,另一個用於類別資料。

  1. simp_num = SimpleImputer(missing_values = np.nan, strategy = "mean")

    • SimpleImputer 是一個用來填補缺失數值資料的工具。
    • missing_values = np.nan 表示要填補的缺失值是NaN(Not-a-Number)。
    • strategy = "mean" 表示填補策略是使用平均值
  2. simp_cat = SimpleImputer(missing_values = np.nan, strategy = "most_frequent")

    • SimpleImputer 這裡用於填補缺失的類別資料。
    • missing_values = np.nan 表示要填補的缺失值是NaN。
    • strategy = "most_frequent" 表示填補策略是使用最常見的類別值

KNN

grid_params = { 'n_neighbors' : range(45,100),
               'weights' : ['uniform','distance'],
               'metric' : ['minkowski','euclidean','manhattan']
               }
# n neighbours is the value of k

gs = GridSearchCV(KNeighborsClassifier(), grid_params, verbose = 1, cv = 3, n_jobs = -1)
# n_jobs is set to -1 which means that the job of finding a good fit will be handled by the Python interpreter on its own.

g_res = gs.fit(X, y)

這裡使用 Grid Search 調整 KNN 的超參數設定

  • 'n_neighbors':K最近鄰中的K值,範圍從45到100。
  • 'weights':鄰居權重的選擇,可以是 'uniform'(統一權重)或 'distance'(距離權重)。
  • 'metric':距離度量方式,可以是 'minkowski'、'euclidean' 或 'manhattan'。

gs = GridSearchCV(KNeighborsClassifier(), grid_params, verbose = 1, cv = 3, n_jobs = -1) 建立了一個網格搜尋物件 (gs)。

  • KNeighborsClassifier() 使用K最近鄰分類器。
  • grid_params 是要搜索的超參數範圍。
  • verbose = 1 顯示搜索的進度。
  • cv = 3 是交叉驗證的折數,表示我們將數據分為3折進行交叉驗證。
  • n_jobs = -1 表示使用所有可用的CPU核心來平行處理超參數搜索,以加速搜索過程。

g_res = gs.fit(X, y) 開始執行網格搜尋,其中 X 是特徵數據,y 是對應的目標標籤。

該搜索將嘗試不同的超參數組合,並使用交叉驗證來評估每種組合的性能。

最終,它會返回一個包含最佳超參數設置的模型 g_res,可以用於進一步的機器學習任務。

之後透過 g_res.best_score_,我們可以發現最佳分數是 0.7929386269273109

而最好的超參數配置 g_res.best_params_

  • metric: manhattan
  • n_neighbors: 46
  • weights: distance

完整的 code 可以去 Kaggle Notebook 實際執行喔~

明天要進入另一個主題 Gaussian Mixture Model 敬請期待

/images/emoticon/emoticon31.gif

Reference


上一篇
[Day 12] K nearest neighbors — 主題實作
下一篇
[Day 14] Gaussian Mixture Model — 背後理論
系列文
ML From Scratch31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言