文章目錄
隨機梯度下降(SGD) 是一種簡單但又非常高效的方法,主要用於凸損失函數下線性分類器的判別式學習,例如(線性) 支持向量機和 Logistic 迴歸。 儘管 SGD 在機器學習社區已經存在了很長時間, 但是最近在大規模學習(large-scale learning) 方面 SGD 獲得了相當大的關注。
SGD 已成功應用於在文本分類和自然語言處理中經常遇到的大規模和稀疏的機器學習問題。對於稀疏數據,本模塊的分類器可以輕易的處理超過 的訓練樣本和超過 的特徵。
隨機梯度下降法(Stochastic Gradient Descent)的優勢:
- 高效。
- 易於實現 (有大量優化代碼的機會)。
隨機梯度下降法(Stochastic Gradient Descent) 的劣勢:
- SGD 需要一些超參數,例如正則化(regularization) 參數和迭代次數(number of iterations)。
- SGD 對特徵縮放(feature scaling) 敏感。
1. 分類
警告: 在擬合模型前,確保你重新排列了(打亂) 你的訓練數據,或者使用
shuffle=True
在每次迭代後打亂訓練數據。
SGDClassifier
類實現了一個簡單的隨機梯度下降學習例程,支持分類問題不同的損失函數和正則化方法。
作爲另一個分類器,擬合 SGD 我們需要兩個數組: 保存訓練樣本的 size
爲 [n_samples, n_features]
的數組 X
以及保存訓練樣本目標值(類標籤)的 size
爲 [n_samples]
的數組 Y
>>> from sklearn.linear_model import SGDClassifier
>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = SGDClassifier(loss="hinge", penalty="l2")
>>> clf.fit(X, y)
SGDClassifier(alpha=0.0001, average=False, class_weight=None,
early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,
l1_ratio=0.15, learning_rate='optimal', loss='hinge',
max_iter=1000, n_iter_no_change=5, n_jobs=None, penalty='l2',
power_t=0.5, random_state=None, shuffle=True, tol=0.001,
validation_fraction=0.1, verbose=0, warm_start=False)
擬合後,我們可以用該模型來預測新值:
>>> clf.predict([[2., 2.]])
array([1])
SGD 通過訓練數據來擬合一個線性模型,成員 coef_
保存模型參數:
>>> clf.coef_
array([[ 9.9..., 9.9...]])
成員 intercept_
保存截距(intercept),又稱作偏移(offset) 或偏差(bias):
>>> clf.intercept_
array([-9.9...])
模型是否使用截距,即一個偏置的超平面(a biased hyperplane),是由參數 fit_intercept
控制的。
使用 SGDClassifier.decision_function
來獲得到此超平面的符號距離(signed distance)。
>>> clf.decision_function([[2., 2.]])
array([ 29.6...])
具體的損失函數(loss function) 可以通過 loss
參數來設置。SGDClassifier
支持以下的損失函數:
loss="hinge"
: (軟間隔)線性支持向量機((soft-margin) linear Support Vector Machine)loss="modified_huber"
: 平滑的 hinge 損失(smoothed hinge loss)loss="log"
: logistic 迴歸(logistic regression)- 以及所有的迴歸損失
前兩個損失函數是懶惰的,只有一個例子違反了邊界約束(margin constraint),它們才更新模型的參數, 這使得訓練非常有效率,即使使用了 L2懲罰
(penalty) 我們仍然可能得到稀疏的模型結果。