簡體   English   中英

partial_fit 與 SGDClassifier 給出了波動的准確度

[英]partial_fit with SGDClassifier gives fluctuating accuracy

我的數據在一個稀疏矩陣中。 在開始大計算之前,我現在首先處理具有約 500k 行的子集。 數據是二元數加上熵和字符串長度,完整的數據集包含數百萬行乘以 1400 列。 該模型旨在幫助表征這些字符串,因此我使用SGDClassifier進行邏輯回歸。

由於尺寸較大,我決定在我的SGDClassifier上使用partial_fit ,但是我在每個時期得到的計算出area-under-curve值似乎波動很大。

這是我的代碼:

from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
model = SGDClassifier(loss='log', alpha=1e-10, n_iter=50, n_jobs=-1, shuffle=True)
for f in file_list:
    data = dill.load(open(f))
    X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2)
    X_train, X_holdout, y_train, y_holdout = train_test_split(data, labels, test_size=0.05)
    for ep in range(max_epoch):
        model.partial_fit(X_train, y_train, classes=np.unique(y_train))

        # Calculate Area under ROC curve to see if things improve
        probs = model.predict_proba(X_holdout)
        auc   = roc_auc_score(y_holdout, [x[1] for x in probs])

        if auc > best_auc: best_auc = auc
        print('Epoch: %d - auc: %.2f (best %.2f)' %(ep, auc, best_auc))

發生的情況是 auc 迅速上升到~0.9,但隨后波動很大。 有時它甚至會下降到 ~0.5-0.6,然后又回升。 我認為更auc邏輯的auc應該隨着每個 epoch 繼續普遍增加,只有很小的下降可能,直到它找到一個平衡值,其中更多的訓練幾乎沒有任何改善。

我做錯了什么,或者這是partial_fit可能的“正常”行為嗎? 當我在較小的數據集上使用fit時,我從未見過這種行為。

通常, partial_fit已認為是傾向於減少波動精度。 在某種程度上,這可以通過改組並提供整個數據集的一小部分來稍微緩解。 但是,對於較大的數據,使用 SGDClassifier/SVM 分類器,在線訓練似乎只會降低准確性。

我試着用它做實驗,發現使用低學習率有時可以幫助我們。 粗略的類比是,在大數據上重復訓練同一個模型,導致模型忘記從以前的數據中學到的東西。 因此,使用很小的學習率會減慢學習和遺忘的速度!

我們可以使用sklearn提供的adaptive學習率功能,而不是手動提供速率。 注意模型初始化部分,

model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=None, shuffle=True, verbose=0, learning_rate='adaptive', eta0=0.01, early_stopping=False)

這在 [scikit docs] 中描述為:

'adaptive':eta = eta0,只要訓練不斷減少。 每次 n_iter_no_change 連續 epochs 未能將訓練損失減少 tol 或未能將驗證分數增加 tol 如果 early_stopping 為 True 時,則當前學習率除以 5。

隨着學習率的變化,我得到了非常好的結果(從數據集第四部分的最初從 98% 下降到 28%)到 100% 的模型准確度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM