[Python教學] Scikit-learn:模型選擇與超參數調優

更新 發佈閱讀 18 分鐘

歡迎來到Scikit-learn教學系列的第五篇文章!在前幾篇中,我們學習了分類與回歸模型,並掌握了資料前處理與模型評估。這一篇將聚焦於模型選擇與超參數調優,這是提升機器學習模型表現的關鍵步驟。我們將介紹交叉驗證、超參數調優方法(網格搜尋與隨機搜尋),以及如何避免過擬合,幫助你選擇最佳模型並優化其參數。準備好讓你的模型更上一層樓吧!


為什麼需要模型選擇與超參數調優?

機器學習模型的表現不僅取決於演算法,還與超參數(Hyperparameters)設置密切相關。例如:

  • K近鄰(KNN)的鄰居數量n_neighbors。
  • 隨機森林的樹數量n_estimators或樹的最大深度max_depth。
  • 嶺回歸的正則化強度alpha。

超參數無法通過訓練資料直接學習,需人工設置或通過系統性方法尋找。此外,不同演算法在不同資料集上的表現差異很大,因此需要模型選擇來確定最適合的演算法。


關鍵技術

我們將介紹以下三個核心技術,並使用Scikit-learn實現:

  1. 交叉驗證(Cross-Validation):評估模型的泛化能力。
  2. 超參數調優:網格搜尋(GridSearchCV)與隨機搜尋(RandomizedSearchCV)。
  3. 避免過擬合:正則化與控制模型複雜度。

1. 交叉驗證:K折交叉驗證

單次訓練-測試分割可能導致評估結果不穩定。K折交叉驗證(K-Fold Cross-Validation)將資料分為K份,輪流使用一份作為測試集,其餘作為訓練集,計算K次評估的平均表現。

範例程式碼

from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

# 載入資料
iris = load_iris()
X, y = iris.data, iris.target

# 定義模型
knn = KNeighborsClassifier(n_neighbors=5)

# 進行5折交叉驗證
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
print("交叉驗證準確率:", scores)
print("平均準確率:", scores.mean(), "±", scores.std())

說明cv=5表示5折交叉驗證,scoring='accuracy'指定評估指標。結果顯示每次驗證的準確率及其均值與標準差。

raw-image


2. 超參數調優:網格搜尋與隨機搜尋

超參數調優的目標是找到最佳參數組合。Scikit-learn提供兩種方法:

  • 網格搜尋(GridSearchCV):遍歷所有指定的參數組合。
  • 隨機搜尋(RandomizedSearchCV):從參數空間中隨機抽樣,適合大規模參數空間。

範例程式碼(網格搜尋):

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris

# 載入 Iris 資料集
iris = load_iris()
X, y = iris.data, iris.target

# 定義管道(前處理 + 模型)
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])

# 定義參數網格
param_grid = {
'svm__C': [0.1, 1, 10],
'svm__kernel': ['linear', 'rbf'],
'svm__gamma': ['scale', 'auto']
}

# 執行網格搜尋
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X, y)

# 輸出最佳結果
print("最佳參數:", grid_search.best_params_)
print("最佳交叉驗證準確率:", grid_search.best_score_)

說明param_grid定義參數組合,cv=5表示5折交叉驗證,n_jobs=-1使用所有CPU核心加速計算。

raw-image


範例程式碼(隨機搜尋):

from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris
from scipy.stats import uniform

# 載入 Iris 資料集
iris = load_iris()
X, y = iris.data, iris.target

# 定義管道(前處理 + 模型)
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])

# 定義參數分佈
param_dist = {
'svm__C': uniform(0.1, 10), # 在 [0.1, 10.1) 範圍內隨機取值
'svm__kernel': ['linear', 'rbf'],
'svm__gamma': ['scale', 'auto']
}

# 進行隨機搜尋
random_search = RandomizedSearchCV(pipeline, param_dist, n_iter=10, cv=5, scoring='accuracy', n_jobs=-1, random_state=42)
random_search.fit(X, y)

# 輸出最佳結果
print("最佳參數:", random_search.best_params_)
print("最佳交叉驗證準確率:", random_search.best_score_)

說明n_iter=10 表示隨機抽樣10組參數,uniform(0.1, 10)定義連續分佈的參數範圍。

raw-image


3. 避免過擬合:正則化與模型複雜度

過擬合(Overfitting)是指模型在訓練集上表現很好,但在測試集上表現差。以下方法有助於避免過擬合:

  • 正則化:例如嶺回歸的alpha或SVM的C,限制模型複雜度。
  • 控制模型複雜度:例如限制決策樹的max_depth或隨機森林的min_samples_split
  • 更多資料:若可行,增加訓練資料量。


實作:對支持向量機(SVM)進行超參數調優

讓我們使用 Wine 資料集對 SVM 分類器執行超參數調整,包括預處理、交叉驗證和網格搜尋。

程式碼範例

以下程式碼展示如何對Wine資料集進行超參數調優:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report, confusion_matrix

# 載入Wine資料集
wine = load_wine()
X = wine.data
y = wine.target
target_names = wine.target_names

# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 定義管道
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])

# 定義參數網格
param_grid = {
'svm__C': [0.1,1,10,100],
'svm__kernel': ['linear', 'rbf'],
'svm__gamma': ['scale', 'auto', 0.1, 1]
}

# 進行網格搜尋
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 輸出最佳結果
print("最佳參數:", grid_search.best_params_)
print("最佳交叉驗證準確率:", grid_search.best_score_)

# 使用最佳模型進行預測
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)

# 評估模型
print("\n測試集結果:")
print("準確率:", grid_search.score(X_test, y_test))
print("分類報告:")
print(classification_report(y_test, y_pred, target_names=target_names))

# 繪製混淆矩陣
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=target_names, yticklabels=target_names)
plt.title('Confusion Matrix - Best SVM Model')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.savefig('wine_svm_cm.png')
plt.show()

# 視覺化網格搜尋結果
results = pd.DataFrame(grid_search.cv_results_)
pivot_table = results.pivot_table(values='mean_test_score', index='param_svm__C', columns='param_svm__kernel')
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_table, annot=True, cmap='viridis')
plt.title('Grid Search Accuracy for Different C and Kernel')
plt.xlabel('Kernel')
plt.ylabel('C')
plt.savefig('wine_grid_search_heatmap.png')
plt.show()

程式碼解釋

  1. 資料載入與分割: 載入Wine資料集,包含13個特徵與3個類別。 分割為70%訓練集與30%測試集。
  2. 管道設置: 使用Pipeline整合StandardScaler與SVC(支持向量機分類器)。
  3. 網格搜尋: 定義參數網格,涵蓋C(正則化強度)、kernel(核函數)與gamma(核參數)。 使用GridSearchCV進行5折交叉驗證,尋找最佳參數。
  4. 模型評估: 使用最佳模型預測測試集,計算準確率並輸出分類報告。 繪製混淆矩陣,展示預測表現。
  5. 視覺化: 繪製熱圖,展示不同C與kernel組合的交叉驗證準確率。

運行程式碼後,你會看到最佳參數、測試集表現、混淆矩陣與網格搜尋結果的熱圖。

raw-image
raw-image
raw-image


練習:對決策樹進行隨機搜尋

請完成以下練習:

  1. 使用Scikit-learn的load_breast_cancer()載入Breast Cancer資料集。
  2. 創建一個管道,包含StandardScaler與DecisionTreeClassifier。
  3. 使用RandomizedSearchCV進行超參數調優,參數分佈如下: max_depth: 整數範圍1到10。 min_samples_split: 整數範圍2到20。 min_samples_leaf: 整數範圍1到10。
  4. 進行10次隨機搜尋,使用5折交叉驗證,評估指標為準確率。
  5. 輸出最佳參數與測試集準確率,繪製混淆矩陣,保存為breast_cancer_dt_cm.png。

以下是起點程式碼:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import randint

# 載入Breast Cancer資料集
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target
target_names = cancer.target_names

# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 你的程式碼從這裡開始...
raw-image


總結

恭喜你學會了模型選擇與超參數調優!本篇文章介紹了交叉驗證、網格搜尋、隨機搜尋與避免過擬合的方法,並通過Wine資料集展示了SVM的超參數調優流程。你現在能夠系統性地優化模型,提升其泛化能力。

在下一篇文章中,我們將探索非監督學習 - 聚類與降維,學習如何處理無標籤資料。請完成練習,並在留言區分享你的Breast Cancer資料集混淆矩陣!

資源與進階學習




留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
12會員
163內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/06/10
歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。
Thumbnail
2025/06/10
歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。
Thumbnail
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
2025/05/30
歡迎來到Scikit-learn教學系列的第二篇文章!在上篇中,我們介紹了Scikit-learn與機器學習基礎,並探索了Iris資料集。這一篇將聚焦於資料預處理,我們將學習如何使用Scikit-learn清理資料、處理缺失值、進行特徵縮放與類別編碼,並以真實資料集進行實作。
Thumbnail
2025/05/30
歡迎來到Scikit-learn教學系列的第二篇文章!在上篇中,我們介紹了Scikit-learn與機器學習基礎,並探索了Iris資料集。這一篇將聚焦於資料預處理,我們將學習如何使用Scikit-learn清理資料、處理缺失值、進行特徵縮放與類別編碼,並以真實資料集進行實作。
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
呈上篇介紹如何訓練模型,此篇就主要介紹如何利用訓練好的模型來生成圖片 [深度學習][Python]DCGAN訓練生成手寫阿拉伯數字_生成篇 生成的結果 生成的圖片大小會根據,當初設置的生成器輸出大小來決定,當你使用生成對抗網絡(GAN)生成圖像時,生成器模型的最後一層通常會決定生成圖
Thumbnail
呈上篇介紹如何訓練模型,此篇就主要介紹如何利用訓練好的模型來生成圖片 [深度學習][Python]DCGAN訓練生成手寫阿拉伯數字_生成篇 生成的結果 生成的圖片大小會根據,當初設置的生成器輸出大小來決定,當你使用生成對抗網絡(GAN)生成圖像時,生成器模型的最後一層通常會決定生成圖
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文介紹了AI助手在數據收集和訓練過程中的工作原理和不斷進步的過程。關注的內容包括從公開的網絡資源、書籍、文章等渠道收集數據,數據的清洗和結構化處理,知識庫的增量更新以及訓練算法和模型的優化。如果大家對AI助手的發展還有任何其他感興趣的話題或建議,歡迎隨時告訴我們,讓我們共同探索,攜手進步。
Thumbnail
本文介紹了AI助手在數據收集和訓練過程中的工作原理和不斷進步的過程。關注的內容包括從公開的網絡資源、書籍、文章等渠道收集數據,數據的清洗和結構化處理,知識庫的增量更新以及訓練算法和模型的優化。如果大家對AI助手的發展還有任何其他感興趣的話題或建議,歡迎隨時告訴我們,讓我們共同探索,攜手進步。
Thumbnail
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
Thumbnail
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News