好的課程應該分享給更多人:人工智能視頻列表-尚學堂,點開任意一個之后會發現他們會提供系列課程整合到一起的百度網盤下載地址,包括視頻+代碼+資料,免費的優質資源。當然,現在共享非常多,各種mooc、博客、論壇等,很容易就可以找到各種各樣的知識,能走到哪一步,都在我們自己。希望我能夠一直堅持下去,加油!
參考書籍:《機器學習》-周志華,中文書,各種概念都講解的很清晰,贊。點這里下載,在百度網盤上,密碼是:8tmk
參見官方文檔:scikit-learn官網http://scikit-learn.org/stable/supervised_learning.html#supervised-learning
看這個吧,簡書上的:深入淺出--梯度下降法及其實現
批量梯度下降
· 初始化W,即隨機W,給初值
· 沿着負梯度方向迭代,更新后的W使得損失函數J(w)更小
· 如果W維度是幾百維度,直接算SVD也是可以的,幾百維度以上一般是梯度下降算法
# 批量梯度下降 import numpy as np # 自己創建建數據,哈哈 X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] learning_rate = 0.1 # 學習率,步長=學習率x梯度 n_iterations = 1000 # 迭代次數,一般不設置閾值,只設置超參數,迭代次數 m = 100 # m個樣本 theta = np.random.randn(2, 1) # 初始化參數theta,w0,...,wn count = 0 # 計數 for iteration in range(n_iterations): count += 1 # 求梯度,每次迭代使用m個樣本求梯度 gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y) # 迭代更新theta值 theta = theta - learning_rate * gradients # print(count, theta) print(count, theta)
隨機梯度下降
· 優先選擇隨機梯度下降
· 有些時候隨機梯度下降可以跳出局部最小# 隨機梯度下降
import numpy as np X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] n_epochs = 500 t0, t1 = 5, 50 m = 100 def learning_schedule(t): return t0/(t + t1) # 隨機初始化參數值 theta = np.random.randn(2, 1) for epoch in range(n_epochs): for i in range(m): random_index = np.random.randint(m)
# 每次迭代使用一個樣本求梯度 xi = X_b[random_index:random_index+1] yi = y[random_index:random_index+1] gradients = 2*xi.T.dot(xi.dot(theta)-yi) learning_rate = learning_schedule(epoch*m + i) theta = theta - learning_rate * gradients print(theta)
歸一化
預處理
這個CSDN的博客挺好的:機器學習常見歸一化方法及實現,我覺得還是看書效果最好了。
基於梯度下降法求最優解時,都要歸一化,why,為什么?
數據的歸一化/標准化/規范化,顧名思義,就是有量綱數據集經過某種變換后,變成無量綱的數據,比如變到[0,1],應該是這樣便於處理吧,使各個維度梯度盡量同時收斂。
過擬合、擬合與欠擬合
過擬合:模型很好的擬合了訓練集數據,但預測的准確率反而降低了,擬合過度,泛化能力弱。
欠擬合:與過擬合相反,模型尚未能很好的擬合訓練數據集,擬合不足。
擬合:模型適當擬合訓練集且預測准確率較高,泛化能力強。
主要做的是防止過擬合:
· 通過正則化修改損失函數,考慮懲罰項的影響,如L1、L2正則化
L1 = n個維度的w的絕對值和
L2 = n個維度的w的平方和
即,loss_function = loss_function + α(L1 or L2),使用懲罰項,模型泛化能力提高,可能影響訓練數據集正確率,在懲罰項里面,會有個alpha,即懲罰項的權重,我們可以通過調整alpha超參數,根據需求來決定是更看重模型的正確率還是模型的泛化能力!
難受的,代碼:
損失函數 + L2正則項:
# 嶺回歸/脊回歸,隨機梯度下降,crtl+B查看函數文檔以調整參數… import numpy as np from sklearn.linear_model import Ridge from sklearn.linear_model import SGDRegressor # 模擬真實數據集 X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # # 方法一:脊/嶺回歸,損失函數=最小二乘+L2正則項 # # alpha=1,懲罰項權重-Regularization strength; # ridge_reg = Ridge(alpha=1, solver='auto') # ridge_reg.fit(X, y) # 模型 # print(ridge_reg.predict(2)) # 預測x=2時,y=? # print("w0 =", ridge_reg.intercept_) # 打印w0或者說bias # print("w1 =", ridge_reg.coef_) # 打印weights # 方法二:隨機梯度下降
# # penalty='l2',使用L2正則化,迭代n_iter=100次
sgd_reg = SGDRegressor(penalty='l1', n_iter=100)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(2))
print("w0 =", sgd_reg.intercept_)
print("w1 =", sgd_reg.coef_)
損失函數 + L1正則項:
# 套索回歸,隨機梯度下降回歸函數 import numpy as np from sklearn.linear_model import Lasso, SGDRegressor # 模擬真實數據集 X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # One:lasso regression,損失函數=最小二乘項? + L1正則項 lasso_reg = Lasso(alpha=0.15, max_iter=1000) lasso_reg.fit(X, y) print(lasso_reg.predict(2)) print(lasso_reg.intercept_, lasso_reg.coef_) # # Two:sgd regression # sgd_reg = SGDRegressor(penalty='l1', n_iter=1000) # sgd_reg.fit(X, y) # print(sgd_reg.predict(2)) # print(sgd_reg.intercept_, sgd_reg.coef_)
