超參數數值

Python 超參數調校

Alex Scriven

Data Scientist

超參數數值

 

有些超參數更值得優先調整。

但應該嘗試哪些超參數「數值」呢?

  • 依每個演算法與超參數而定
  • 仍有一些最佳實務與小訣竅可遵循

來看看幾個重點提示!

Python 超參數調校

超參數衝突選項

注意互相衝突的超參數選項。

  • LogisticRegression()solverpenalty 存在互斥選項。
The 'newton-cg', 'sag' and 'lbfgs' solvers support only l2 penalties.

有些不會明說,而是直接「忽略」(例如 ElasticNetnormalize 超參數):

This parameter is ignored when fit_intercept is set to False

務必查閱 Scikit Learn 說明文件!

Python 超參數調校

不合理的超參數數值

 

留意為不同演算法設定「不合理」的數值:

  • 隨機森林的樹太少
    • 只有 2 棵樹還能叫「森林」嗎?
  • KNN 設為 1 個鄰居
    • 只取一個人的「投票」不太可靠!
  • 超參數只增加極小幅度

花時間整理超參數的合理範圍很有價值。

Python 超參數調校

自動化選擇超參數

 

在前一個練習中,我們這樣建立模型:

knn_5 =  KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20  = KNeighborsClassifier(n_neighbors=20)

這樣效率不高。能更好嗎?

Python 超參數調校

自動化超參數調校

用 for 迴圈逐一嘗試選項:

neighbors_list = [3,5,10,20,50,75]

accuracy_list = []
for test_number in neighbors_list: model = KNeighborsClassifier(n_neighbors=test_number) predictions = model.fit(X_train, y_train).predict(X_test)
accuracy = accuracy_score(y_test, predictions) accuracy_list.append(accuracy)
Python 超參數調校

自動化超參數調校

把結果存成 DataFrame 檢視:

results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

鄰居數對應的正確率表

Python 超參數調校

學習曲線

來畫學習曲線圖。

這次要測更多數值。

neighbors_list = list(range(5,500, 5))

accuracy_list = [] for test_number in neighbors_list: model = KNeighborsClassifier(n_neighbors=test_number) predictions = model.fit(X_train, y_train).predict(X_test) accuracy = accuracy_score(y_test, predictions) accuracy_list.append(accuracy) results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
Python 超參數調校

學習曲線

把較大的 DataFrame 視覺化:

plt.plot(results_df['neighbors'], 
    results_df['accuracy'])

# 加上標籤與標題 plt.gca().set(xlabel='n_neighbors', ylabel='Accuracy', title='Accuracy for different n_neighbors') plt.show()
Python 超參數調校

學習曲線

我們的圖:

KNN 的正確率與鄰居數學習曲線

Python 超參數調校

產生數值的實用技巧

Python 的 range 函式不支援小數步長。

一個好用的小技巧是使用 NumPy 的 np.linspace(start, end, num)

  • 產生你指定區間(startend)內等距的 num 個數值。
print(np.linspace(1,2,5))
[1.   1.25 1.5  1.75 2.  ]
Python 超參數調校

一起來練習吧!

Python 超參數調校

Preparing Video For Download...