自動調參、ROC——2017.03.13
小樣本序列數據的LSTM超參數調優
參考資料:
- https://zhuanlan.zhihu.com/p/24720954
- https://zhuanlan.zhihu.com/p/20767428
1. 自動調參方法
- Gird Search: 實現簡單,遍歷原理,但是耗時,遍歷所有參數組合不太現實;
- Random Search: 實際操作時先用Gird Search的方法,得到所有候選參數,然後每次從中隨機選擇進行訓練,比Gird Search更有效;
- Bayesian Optimization考慮到了不同參數對應的實驗結果值,因此更節省時間,和Gird Search相比簡直就是老牛和跑車的區別。推薦了兩個實現貝葉斯調參的Python庫,可以上手即用:① jaberg/hyperopt——比較簡單;② fmfn/BayesianOptimization, 比較複雜,支持並行調參。
2. 手動調參經驗參數
- learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試。很少見learning rate大於10的。學習率一般要隨著訓練進行衰減。衰減係數一般是0.5。 衰減時機,可以是驗證集準確率不再上升時,或固定訓練多少個周期以後。 不過更建議使用自適應梯度方法,例如adam, adadelta, rmsprop等,這些一般使用相關論文提供的默認值即可,可以避免再費勁調節學習率。對RNN來說,有個經驗,如果RNN要處理的序列比較長,或者RNN層數比較多,那麼learning rate一般小一些比較好,否則有可能出現結果不收斂,甚至Nan等問題。
- 網路層數: 先從1層開始。
- 每層結點數: 16 32 128,超過1000的情況比較少見。超過1W的從來沒有見過。
- batch size: 128上下開始。batch size值增加,的確能提高訓練速度。但是有可能收斂結果變差。如果顯存大小允許,可以考慮從一個比較大的值開始嘗試。因為batch size太大,一般不會對結果有太大的影響,而batch size太小的話,結果有可能很差。
- clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減系係數,讓value的值等於閾值: 5,10,15
- dropout: 0.5
- L2正則:1.0,超過10的很少見。
- 詞向量embedding大小:128,256
- 正負樣本比例: 這個是非常忽視,但是在很多分類問題上,又非常重要的參數。很多人往往習慣使用訓練數據中默認的正負類別比例,當訓練數據非常不平衡的時候,模型很有可能會偏向數目較大的類別,從而影響最終訓練結果。除了嘗試訓練數據默認的正負類別比例之外,建議對數目較小的樣本做過採樣,例如進行複製。提高他們的比例,看看效果如何,這個對多分類問題同樣適用。 在使用mini-batch方法進行訓練的時候,盡量讓一個batch內,各類別的比例平衡,這個在圖像識別等多分類任務上非常重要。
---------------------------------------------------------------------------------------------------------------------------
ROC
下圖是一個示例,圖中共有20個測試樣本,「Class」一欄表示每個測試樣本真正的標籤(p表示正樣本,n表示負樣本),「Score」表示每個測試樣本屬於正樣本的概率。
接下來,我們從高到低,依次將「Score」值作為閾值threshold,當測試樣本屬於正樣本的概率大於或等於這個threshold時,我們認為它為正樣本,否則為負樣本。舉例來說,對於圖中的第4個樣本,其「Score」值為0.6,那麼樣本1,2,3,4都被認為是正樣本,因為它們的「Score」值都大於等於0.6,而其他樣本則都認為是負樣本。每次選取一個不同的threshold,我們就可以得到一組FPR和TPR,即ROC曲線上的一點。這樣一來,我們一共得到了20組FPR和TPR的值,將它們畫在ROC曲線的結果如下圖:
當我們將threshold設置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當threshold取值越多,ROC曲線越平滑。
其實,我們並不一定要得到每個測試樣本是正樣本的概率值,只要得到這個分類器對該測試樣本的「評分值」即可(評分值並不一定在(0,1)區間)。評分越高,表示分類器越肯定地認為這個測試樣本是正樣本,而且同時使用各個評分值作為threshold。我認為將評分值轉化為概率更易於理解一些。
計算ROC:訓練數據x_test,標籤y_test
from keras.models import Sequentialfrom sklearn.metrics import roc_curve, roc_auc_scoreimport matplotlib.pyplot as pltlstmModel = Sequential()predictProba = lstmModel.predict_proba(x_test, batch_size = batch_size, verbose = 1)fpr, tpr, thresholds = roc_curve(y_test, predictProba, pos_label = 1)# specify the positive classaucScore = roc_auc_score(y_test, predictProba)lw = 2#linewidthplt.clf()#Empty the current image( .cla():used to empty the current coordinates)plt.title("ROC curve (AUC = %.4f)" % (aucScore))plt.xlabel("False Positive Rate")plt.ylabel("True Positive Rate")plt.ylim([0.0, 1.0])#fix the range of the coordinatesplt.xlim([0.0, 1.0])plt.plot(fpr, tpr, color=navy, lw = lw, label = Sat)plt.legend(loc="lower right")plt.savefig("roc.png", dpi=75)plt.show()
圖:
- 公式1:
- 公式2:
- 公式3:
- 公式4:
- 公式5:
Precision and Recall
防止分母為0 ↓
prec = float(cntfr) / (cntf + 1E-12)
recl = float(cntfr) / (cntr + 1E-12)
---------------------------------------------------------------------------------------------------------------------------
推薦閱讀:
※知識布局-tensorflow-梯度下降
※提升方法(AdaBoost)
※馬庫斯:DeepMind新出的機器心智網路不錯,但有誤導性
※過擬合與模型容量
※2018AI學習清單丨150個最好的機器學習和Python教程
TAG:機器學習 |