Random Search ใน Scikit Learn

การปรับ Hyperparameter ใน Python

Alex Scriven

Data Scientist

เปรียบเทียบกับ GridSearchCV

 

ไม่ต้องเริ่มต้นใหม่จากศูนย์ ทบทวนขั้นตอนของ Grid Search กันก่อน:

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

เปรียบเทียบกับ Grid Search

   

มีความแตกต่างเพียงจุดเดียว:

  • ขั้นที่ 7 = กำหนดจำนวนตัวอย่างที่จะสุ่ม (แล้วทำการสุ่ม)

 

เท่านี้เอง! (โดยหลัก)

การปรับ Hyperparameter ใน Python

เปรียบเทียบโมดูลใน Scikit Learn

โมดูลก็คล้ายกันด้วย:

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')

 

RandomizedSearchCV:

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

ความแตกต่างหลัก

 

ความแตกต่างหลัก 2 ประการ:

  • n_iter คือจำนวนตัวอย่างที่ random search จะสุ่มจาก grid ในตัวอย่างก่อนหน้าใช้ค่า 300

  • param_distributions ต่างจาก param_grid เล็กน้อย โดยเปิดให้กำหนดการกระจายสำหรับการสุ่มได้

    • ค่าเริ่มต้นคือทุกชุดค่าผสมมีโอกาสถูกเลือกเท่ากัน
การปรับ Hyperparameter ใน Python

สร้าง RandomizedSearchCV Object

สร้าง random search object ได้เช่นเดียวกับ grid search แต่เพิ่มการเปลี่ยนแปลงเล็กน้อย:

# Set up the sample space
learn_rate_list = np.linspace(0.001,2,150)
min_samples_leaf_list = list(range(1,51))

# Create the grid
parameter_grid = {
    'learning_rate' : learn_rate_list,
    'min_samples_leaf' : min_samples_leaf_list}

# Define how many samples number_models = 10
การปรับ Hyperparameter ใน Python

สร้าง RandomizedSearchCV Object

สร้าง object ได้เลย

# Create a random search object
random_GBM_class = RandomizedSearchCV(
    estimator = GradientBoostingClassifier(),
    param_distributions = parameter_grid,
    n_iter = number_models,
    scoring='accuracy',
    n_jobs=4, 
    cv = 10,
    refit=True, 
    return_train_score = True)
# Fit the object to our data
random_GBM_class.fit(X_train, y_train)
การปรับ Hyperparameter ใน Python

วิเคราะห์ผลลัพธ์

ผลลัพธ์ที่ได้เหมือนกันทุกประการ!

ดูค่า hyperparameter ที่ถูกเลือกได้อย่างไร?

ใช้ dictionary cv_results_ (คอลัมน์ param_ ที่เกี่ยวข้อง)!

ดึงข้อมูลเป็น list:

rand_x = list(random_GBM_class.cv_results_['param_learning_rate'])
rand_y = list(random_GBM_class.cv_results_['param_min_samples_leaf'])
การปรับ Hyperparameter ใน Python

วิเคราะห์ผลลัพธ์

สร้างการแสดงผล:

# Make sure we set the limits of Y and X appriately
x_lims = [np.min(learn_rate_list), np.max(learn_rate_list)]
y_lims = [np.min(min_samples_leaf_list), np.max(min_samples_leaf_list)]

# Plot grid results plt.scatter(rand_y, rand_x, c=['blue']*10) plt.gca().set(xlabel='learn_rate', ylabel='min_samples_leaf', title='Random Search Hyperparameters') plt.show()
การปรับ Hyperparameter ใน Python

วิเคราะห์ผลลัพธ์

กราฟที่ได้คล้ายกับตัวอย่างก่อนหน้า:

กราฟการครอบคลุมแบบ random

การปรับ Hyperparameter ใน Python

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

การปรับ Hyperparameter ใน Python

Preparing Video For Download...