iT邦幫忙

2023 iThome 鐵人賽

DAY 10
1
AI & Data

ML From Scratch系列 第 10

[Day 10] Support Vector Machine — 解決真實問題

  • 分享至 

  • xImage
  •  

讓我們先了解今天 Kaggle Competition 的主題。

House Prices - Advanced Regression Techniques

https://ithelp.ithome.com.tw/upload/images/20230910/20152821A8fjZRU6eB.png

這個 Kaggle Competition 的目標是建立一個預測模型,該模型能夠根據給定的特徵預測房屋的價格。

數據集欄位包括各種特徵,如房屋的大小、位置、年份、建材、附近學校的評級等等。

這裡我們使用 Support Vector Machine for Regression

以下是實做的程式碼

Import Library

import pandas as pd
import numpy as np
import seaborn as sns
import os
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, MinMaxScaler, StandardScaler

Load Dataset

# Load csv data
train = pd.read_csv("../input/train.csv")
compe = pd.read_csv("../input/test.csv")
sample_sub = pd.read_csv("../input/sample_submission.csv")

# All data
data  = train.append(compe, sort=False)

這裡要確認資料集讀取的路徑,以免沒有讀取到資料。

Data Pre-Processing

data.drop(['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu'], axis=1, inplace = True)

移除遺失超過 40% 的 feature

categorical_variables_string = \
    ['MSZoning', 'Street', 'LotShape', 'LandContour', 
     'Utilities', 'LotConfig', 'LandSlope', 'Neighborhood', 
     'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 
     'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 
     'MasVnrType', 'ExterQual', 'ExterCond', 'Foundation', 
     'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 
     'BsmtFinType2', 'Heating', 'HeatingQC', 'CentralAir', 
     'Electrical', 'KitchenQual', 'Functional', 'GarageType', 
     'GarageFinish', 'GarageQual', 'GarageCond', 'PavedDrive', 
     'SaleType', 'SaleCondition']

for v in categorical_variables_string:
    # Fill NaN with mode
    data[v] = data[v].fillna(data[v].mode()[0])
    # One-Hot Encoding
    data = pd.get_dummies(data, columns=[v], drop_first=True)

填充 dummy data 在一些遺失的欄位上

# Fill missing data
numerical_variavles = \
    ['MSSubClass', 'LotFrontage', 'LotArea', 'YearBuilt', 
     'YearRemodAdd', 'MasVnrArea', 'BsmtFinSF1', 'BsmtFinSF2', 
     'BsmtUnfSF', 'TotalBsmtSF', '1stFlrSF', '2ndFlrSF', 
     'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 
     'FullBath', 'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 
     'TotRmsAbvGrd', 'Fireplaces', 'GarageYrBlt', 'GarageCars', 
     'GarageArea', 'WoodDeckSF', 'OpenPorchSF', 'EnclosedPorch', 
     '3SsnPorch', 'ScreenPorch', 'PoolArea', 'MiscVal', 'YrSold']

ss = StandardScaler()
for v in numerical_variavles:
    # Fill NaN with mean
    data[v] = data[v].fillna(data[v].mean())
    # Standardize values
    data[v] = ss.fit_transform(data[[v]])

填充遺失資料在資料集上

# Set data
train = data[:1460]
test  = data[1460:]

切割訓練集跟測試集資料

Train

possible_features = train.columns.copy().drop('SalePrice').drop('Id')

# Check feature importances
selector = SelectKBest(f_regression, len(possible_features))
selector.fit(train[possible_features], train['SalePrice'])
scores = -np.log10(selector.pvalues_)
indices = np.argsort(scores)[::-1]
print('Feature importances:')
for i in range(len(scores)):
    print('%.2f %s' % (scores[indices[i]], possible_features[indices[i]]))

選取要被訓練的 feature

Build Model and Prediction

from sklearn import svm
from sklearn.model_selection import GridSearchCV, train_test_split

svrgs_parameters = {
    'kernel': ['rbf'],
    'C':     [150000,200000,250000],
    'gamma': [0.004,0.0045,0.005]
}

svr_cv = GridSearchCV(svm.SVR(), svrgs_parameters, cv=8, scoring= 'neg_mean_squared_log_error')
svr_cv.fit(train_features, train_target)

由於是回歸任務,所以這裡使用的是 SVR !!!

kernel:核函數的類型,這裡使用的是徑向基函數(RBF)。
C:正規化參數,這是一個正浮點數。程式碼中提供了三個不同的C值。
gamma:核函數的係數,也是一個正浮點數。程式碼中提供了三個不同的gamma值。

svr_cv:這是用於在超參數網格上執行交叉驗證以選擇最佳的SVR模型參數

  • svm.SVR():建立一個 SVR 模型,作為基本模型。
  • svrgs_parameters:將超參數網格傳遞給 GridSearchCV,以指定需要搜索的超參數和其候選值。
  • cv=8:指定交叉驗證的折數,這裡設置為8折。
  • scoring='neg_mean_squared_log_error':指定用於評估模型性能的指標,這裡使用了負均方對數誤差(Negative Mean Squared Logarithmic Error)作為評估指標。

執行完畢,就可以得到最佳模型和最佳參數:

  • svr_cv.best_estimator_:最佳參數的SVR模型。
  • svr_cv.best_params_:最佳參數的值。
  • svr_cv.best_score_:最佳模型的性能得分(負均方對數誤差)。

透過這次實驗,我們可以發現在進行資料科學的競賽時,模型訓練其實只佔一點部分,真正耗費時間的地方在於如何處理資料,讓模型可以真正學習到資料集最重要的資訊。


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

明天要進入另一個主題 https://chart.googleapis.com/chart?cht=tx&chl=k-nearest neighbors 敬請期待

/images/emoticon/emoticon06.gif

Reference


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

尚未有邦友留言

立即登入留言