Grid Search กับ Scikit Learn

การปรับ Hyperparameter ใน Python

Alex Scriven

Data Scientist

ออบเจกต์ GridSearchCV

 

แนะนำออบเจกต์ GridSearchCV:

sklearn.model_selection.GridSearchCV(
    estimator,
    param_grid, scoring=None, fit_params=None,
    n_jobs=None, refit=True, cv='warn',
    verbose=0, pre_dispatch='2*n_jobs',
    error_score='raise-deprecating',
    return_train_score='warn')
การปรับ Hyperparameter ใน Python

ขั้นตอนใน Grid Search

 

ขั้นตอนใน Grid Search:

  1. อัลกอริทึมสำหรับปรับ hyperparameter (บางครั้งเรียกว่า "estimator")
  2. กำหนด hyperparameter ที่ต้องการปรับ
  3. กำหนดช่วงค่าของแต่ละ hyperparameter
  4. กำหนดรูปแบบ cross-validation
  5. กำหนดฟังก์ชันคะแนนเพื่อเลือกช่องที่ "ดีที่สุด" บน grid
  6. ระบุข้อมูลหรือฟังก์ชันเสริมที่มีประโยชน์
การปรับ Hyperparameter ใน Python

อินพุตของออบเจกต์ GridSearchCV

อินพุตสำคัญ ได้แก่:

  • estimator
  • param_grid
  • cv
  • scoring
  • refit
  • n_jobs
  • return_train_score
การปรับ Hyperparameter ใน Python

GridSearchCV 'estimator'

 

อินพุต estimator:

  • คืออัลกอริทึมที่ใช้งาน
  • ได้ใช้งาน KNN, Random Forest, GBM, Logistic Regression มาแล้ว

 

ข้อควรจำ:

  • ใส่ estimator ได้เพียงหนึ่งตัวต่อออบเจกต์ GridSearchCV
การปรับ Hyperparameter ใน Python

GridSearchCV 'param_grid'

อินพุต param_grid:

  • กำหนด hyperparameter และค่าที่ต้องการทดสอบ

แทนที่จะใช้ list แบบนี้:

max_depth_list = [2, 4, 6, 8]
min_samples_leaf_list = [1, 2, 4, 6]

ให้เขียนแบบนี้แทน:

param_grid = {'max_depth': [2, 4, 6, 8],
              'min_samples_leaf': [1, 2, 4, 6]}
การปรับ Hyperparameter ใน Python

GridSearchCV 'param_grid'

อินพุต param_grid:

ข้อควรจำ: คีย์ใน dictionary param_grid ต้องเป็น hyperparameter ที่ถูกต้อง

ตัวอย่างเช่น สำหรับ estimator แบบ Logistic regression:

# Incorrect
param_grid = {'C': [0.1,0.2,0.5],
              'best_choice': [10,20,50]}
ValueError: Invalid parameter best_choice for estimator LogisticRegression
การปรับ Hyperparameter ใน Python

GridSearchCV 'cv'

อินพุต cv:

  • กำหนดวิธีทำ cross-validation
  • การใส่ค่าเป็น integer จะใช้ k-fold cross-validation โดยค่ามาตรฐานทั่วไปคือ 5 หรือ 10

k-fold wikipedia

การปรับ Hyperparameter ใน Python

GridSearchCV 'scoring'

 

อินพุต scoring:

  • ใช้กำหนดว่าจะเลือกช่องที่ดีที่สุด (โมเดล) ด้วยเกณฑ์ใด
  • ใช้ได้ทั้งฟังก์ชันที่สร้างเองหรือโมดูล metrics ของ Scikit Learn

ตรวจสอบฟังก์ชัน scoring ในตัวทั้งหมดได้ด้วยโค้ดนี้:

from sklearn import metrics
sorted(metrics.SCORERS.keys())
การปรับ Hyperparameter ใน Python

GridSearchCV 'refit'

 

อินพุต refit:

  • ฟิต hyperparameter ที่ดีที่สุดกับข้อมูลฝึก
  • ทำให้ออบเจกต์ GridSearchCV ใช้เป็น estimator (สำหรับการพยากรณ์) ได้
  • ตัวเลือกที่มีประโยชน์มาก!
การปรับ Hyperparameter ใน Python

GridSearchCV 'n_jobs'

อินพุต n_jobs:

  • ช่วยให้ประมวลผลแบบขนานได้
  • สร้างโมเดลหลายตัวพร้อมกัน แทนที่จะทีละตัว

โค้ดที่มีประโยชน์:

import os
print(os.cpu_count())

ระวัง: หากต้องการทำงานอื่นไปด้วย อย่าใช้ core ทั้งหมดสำหรับการสร้างโมเดล!

การปรับ Hyperparameter ใน Python

GridSearchCV 'return_train_score'

 

อินพุต return_train_score:

  • บันทึกสถิติเกี่ยวกับการฝึกที่ดำเนินการไป
  • มีประโยชน์สำหรับการวิเคราะห์ bias-variance trade-off แต่เพิ่มภาระการคำนวณ
  • ไม่ได้ช่วยเลือกโมเดลที่ดีที่สุด ใช้เพื่อการวิเคราะห์เท่านั้น
การปรับ Hyperparameter ใน Python

การสร้างออบเจกต์ GridSearchCV

 

สร้างออบเจกต์ GridSearchCV ของเราเอง:

# Create the grid
param_grid = {'max_depth': [2, 4, 6, 8], 'min_samples_leaf': [1, 2, 4, 6]}

#Get a base classifier with some set parameters. rf_class = RandomForestClassifier(criterion='entropy', max_features='auto')
การปรับ Hyperparameter ใน Python

การสร้างออบเจกต์ GridSearchCV

 

ประกอบทุกส่วนเข้าด้วยกัน:

grid_rf_class = GridSearchCV(
    estimator = rf_class,
    param_grid = parameter_grid,
    scoring='accuracy',
    n_jobs=4,
    cv = 10,
    refit=True,
    return_train_score=True)
การปรับ Hyperparameter ใน Python

การใช้งานออบเจกต์ GridSearchCV

 

เนื่องจากกำหนด refit เป็น True จึงใช้งานออบเจกต์ได้โดยตรง:

#Fit the object to our data
grid_rf_class.fit(X_train, y_train)

# Make predictions
grid_rf_class.predict(X_test)
การปรับ Hyperparameter ใน Python

มาฝึกกันเถอะ!

การปรับ Hyperparameter ใน Python

Preparing Video For Download...