1.11 交叉驗證,網格搜索[****]
-
交叉驗證
- 目的: 爲了提高模型訓練結果可信度, 可以提高模型的範化能力.
- 步驟:
- 把數據集劃分爲 訓練集 和 測試集
- 把訓練集劃分爲 訓練集 和 驗證集
- 什麼是n交叉驗證:
- 把訓練集分成n等份, 每輪選擇其中一份做驗證集, 其他作爲訓練集, 訓練n輪.
- 一般n選擇爲10.
-
網格搜索
- 作用: 模型選擇參數調優, 選擇出來比較好的超參數.
- 超參數: 在進行模型訓練的時候, 需要手動指定的參數. 舉例: KNN中的k值就是超參數
-
網格搜索與交叉驗證
- API: sklearn.model_selection.GridSearchCV(estimator, param_grid, cv)
- 參數
- estimtor: 需要進行參數調優的評估器
- param_grid, 字典格式超參數列表
- cv: 幾折交叉驗證
- 方法
- fit
- predict
- score
- 交叉驗證相關的屬性
- best_score_: 交叉驗證最好的準確率
- best_estimator: 交叉驗證最好的模型
- cv_results_: 交叉驗證的結果.
1.11 案例:facebook位置預測[***]
-
步驟:
- 加載數據
- 數據基本處理
- 減少數據規模, 爲了演示方便(實際中不要這麼做)
- 選擇有效的時間特徵, 把單位爲秒的時間戳, 該爲天, 星期, 小時
- 去掉簽到比較少的地方
- 確定特徵值和目標值
- 分割數據集
- 特徵工程-特徵預處理-標準化
- 機器學習(KNN+GridSearchCV)
- 模型評估
# 2. 數據基本處理 # 2.1 縮小數據規模(只是爲了演示方便, 實際中不要這個做) facebook_data = data.query('x>2.0&x<2.5&y>2.0&y<2.5') # facebook_data # 2.2 選擇有效的時間特徵 date_time = pd.to_datetime(facebook_data['time'], unit='s') date = pd.DatetimeIndex(date_time) facebook_data['day'] = date.day facebook_data['weekday'] = date.weekday facebook_data['hour'] = date.hour # facebook_data # 2.3 去掉簽到比較少的地方 place_id_counts = facebook_data.groupby('place_id').count() place_id = place_id_counts.query('row_id>5') # facebook_data 中篩選place_id裏面的地方 facebook = facebook_data[facebook_data['place_id'].isin(place_id.index)] # 2.4 確定特徵值和目標 x = facebook[['x','y','accuracy','day','weekday', 'hour']] y = facebook['place_id'] # 2.5 分割數據集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=8)
2.線性迴歸
2.1 線程迴歸簡介
- 定義: 使用迴歸方程對一個自變量或多自變量(特徵) 和 因變量(目標值) 建模一種方式.
- 通用公式:
- θ: 模型係數
- b: 模型偏置
- 機器學習(模型訓練)的過程:
- 把訓練集的數據, 帶入到通用公式中, 求解θ和b的過程
- 預測過程:
- 把預測的特徵值, 帶入通用公式, 結果就是預測的目標值
- 按照自變量個數分類:
- 一個自變量: 單變量回歸
- 多個自變量: 多元迴歸
- 線性迴歸模型與目標關係:
- 線性關係; 一次方程
- 非線性關係: 多次方程, 方程中有2次項,3次項或以上.
2.2 api初步簡介
- API: sklearn.linear_mode.LinearRegression()
- 方法:
- fit(x, y)
- predict(x)
- 屬性:
- 模型係數: coef_
- 方法:
2.4 線性迴歸的損失和優化[***]
-
線性迴歸的損失:
- 最小二乘法:
-
優化:
- 求解 最小二乘法損失最小值
- 兩種方式:
- 正規方程: 通過正規方程的公式, 直接求解
- 梯度下降: 隨意初始化模型係數(θ)和偏置(b), 使用梯度下降方法, 一步一步求解最優模型係數(θ)和偏置(b),
-
正規方程:
- 缺點:
- 計算量大
- 有些時候無法求解.
- 缺點:
-
梯度下降
- 梯度:
- 單變量函數: 函數的斜率
- 多變量函數: 偏導數, 帶入對應的點.
- 關鍵點:
- 梯度下降公式:
- α: 學習率(步長))
- 太小就需要很多步
- 太大就會錯失最優解
- 梯度乘以負號的原因: 梯度是上升最快方向, 我們求解最下值, 要找下降最快的方向, 所以要加負號.
- 梯度:
-
梯度下降與正規方程對比
- 梯度下降 正規方程
- 需要選擇學習率 不需要
- 需要迭代求解 一次運算得出
- 特徵數量較大可以使用 需要計算方程,時間複雜度高O(n3)
-
選擇:
- 小規模數據:
- 正規方程: LinearRegression
- 改進: 嶺迴歸(Ridge)
- 大規模數據:
- 梯度下降: SGDRegressor
- 小規模數據:
2.5 梯度下降法介紹 [*]
-
全梯度下降算法(FG)
- 每次梯度下降的時候, 都使用所有訓練樣本數據
-
隨機梯度下降算法(SG)
- 每次梯度下降的時候, 隨機選擇一個樣本數據
-
小批量梯度下降算法(mini-bantch)
- 每次梯度下降的時候, 隨機選擇一小批訓練樣本, 然後對這一小批的樣本使用全梯度下降算法
-
隨機平均梯度下降算法(SAG)
-
會記錄每次梯度, 每次梯度下降的時候, 隨機選擇一個樣本, 計算梯度, 帶入的梯度下降公式時候, 使用是前面所有梯度平均值.
-
總結:
(1**)FG方法由於它每輪更新都要使用全體數據集,故花費的時間成本最多,內存存儲最大。**
(2)SAG在訓練初期表現不佳,優化速度較慢。這是因爲我們常將初始梯度設爲0,而SAG每輪梯度更新都結合了上一輪梯度值。
(3)綜合考慮迭代次數和運行時間,SG表現性能都很好,能在訓練初期快速擺脫初始梯度值,快速將平均損失函數降到很低。但要注意,在使用SG方法時要慎重選擇步長,否則容易錯過最優解。
(4)mini-batch結合了SG的“膽大”和FG的“心細”,從6幅圖像來看,它的表現也正好居於SG和FG二者之間。在目前的機器學習領域,mini-batch是使用最多的梯度下降算法,正是因爲它避開了FG運算效率低成本大和SG收斂效果不穩定的缺點。
2.6 案例–正規方程[**]
- 正規化API:
- sklearn.linear_model.LinearRegression(fit_intercept=True)
- 參數:
- fit_intercept: 是否計算偏置
- 屬性:
- coef_: 模型係數
- intercept_: 模型偏置
- 迴歸模型評估:
- sklearn.metric.mean_squared_error(y_true, y_pred)
- 計算均方誤差: 預測值-真實值的平方和除以樣本數量
- y_true: 真實目標值
- y_pred: 預測目標值. .
- sklearn.metric.mean_squared_error(y_true, y_pred)
2.7 案例 – 梯度下降法[***]
- 梯度下降API:
-
API:
- sklearn.linear_model.SGDRegressor(loss=“squared_loss”, fit_intercept=True, learning_rate =‘invscaling’, eta0=0.01)
-
參數:
- learning_rate: 學習率, 默認invscaling, 每次迭代的時候, 學習率是遞減
- eta0: 初始學習率
-
屬性:
- 模型係數: coef_
- 模型偏置: intercept_
-
2.8 欠擬合,過擬合[****]
-
欠擬合:
- 概念: 模型在訓練集上表現的不好, 在測試集表現也不好
- 原因: 模型太簡單了, 學到特徵太少了
- 解決:
- 增添其他的特徵項
- 添加多次項
-
過擬合
- 概念: 模型在訓練集上表現的很好, 但是在測試集上表現不好
- 原因: 模型太複雜了, 學到特徵特多了(不使用通用規律的特徵也被學到了)
- 解決:
- 清洗數據: 把嘈雜特徵清洗掉, 讓數據更純.
- 增加訓練集
- 正則化
- 特徵降維(減少特徵的個數)
-
正則化:
-
正規化是用於解決什麼問題的?
- 解決模型過擬合的問題.
-
L2正則化:
- 作用: 讓一些特徵的模型係數很小, 從而削弱這些特徵的影響
- 說明: 模型係數越小模型就越簡單, 模型越簡單, 就越不容易過擬合
-
L1正則化
- 作用: 讓一些特徵的模型係數直接爲0, 就相當於刪除這個特徵.
-
-
維災難[瞭解]:
- 隨着維度的增加,分類器性能逐步上升,到達某點之後,其性能便逐漸下降
2.9 正則化與線性模型
-
嶺迴歸(L2正則化):
- 就是在損失函數上添加了L2正則化項
- L2正則化項: 模型係數的平方和
-
Lasso迴歸(L1正則化):
- 就是在損失函數上添加了L1正則化項
- L1正則化項: 模型係數的絕對值的和
-
Elastic Net 彈性網絡
- 正則化項: 是結合嶺迴歸和Lasso迴歸
-
Early Stopping
- 當損失帶到一個可以接受範圍, 就可以停止訓練.
2.10 嶺迴歸[***]
-
API:
- sklearn.linear_model.Ridge(alpha=1)
-
參數:
- alpha: 正則化力度
-
正則化力度與係數之間的關係:
- 正則化力度越大, 模型係數就越小
- 正則化力度越小, 模型係數就越大
-
嶺迴歸與線性迴歸的區別:
- 嶺迴歸也是一種線性迴歸
- 嶺迴歸使用L2正則化 和 隨機平均梯度下降法
- 總結: 嶺迴歸是一種使用L2正則化和隨機平均梯度下降法的線性迴歸
-
SGDRegressor:
- 隨機梯度下降下降法
-
Ridge
- L2正則化
- 隨機平均梯度下降法.
2.11 模型保存和加載
-
所在模塊: sklearn.externals.joblib
- API:
- 保存模型: joblib.dump(模型, ‘路徑’)
- 加載模型: joblib.load(‘路徑’)
- 注意: 文件後綴名是pkl.
- API:
-
學習目標反饋
-
知道交叉驗證實現過程
- 把數據集劃分爲 訓練集 和 測試集
- 把訓練集劃分爲 訓練集 和 驗證集
- n折交叉驗證:
- 把訓練集爲n等份,
- 每次都選擇一份做驗證集 其他 做訓練集
- 使用訓練集訓練模型, 使用驗證集評估評估
- 重複上面兩個步驟, 重複n-1次.
-
知道超參數搜索過程
- 給超參數, 指定爲若干備選值
- 使用交叉驗證的方式, 嘗試這些被選超參數
- 最後從中選擇一個最好超參數.
-
應用GridSearchCV實現算法參數的調優
# 4. 機器學習(模型訓練) # 4.1 創建KNN評估器 estimator = KNeighborsClassifier() # 4.2 創建網格搜索與交叉驗證的評估器 param_grid = {'n_neighbors': [3, 5, 7, 9]} estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
-
掌握線性迴歸的實現過程
- 準備線性迴歸通用公式
- 把訓練集帶入通用公式中, 求解模型係數與偏置
- 帶入未知數據的樣本到通用公式中, 進行預測
-
應用LinearRegression或SGDRegressor實現迴歸預測
# 4. 機器學習(正規方程) estimator = LinearRegression() estimator.fit(x_train, y_train) # 4. 機器學習(隨機梯度下載) estimator = SGDRegressor() estimator.fit(x_train, y_train)
-
知道迴歸算法的評估標準及其公式
- 均方損失: 預測值-真實值的平方和再除以樣本數量
- 平均絕對損失 預測值-真實值的絕對值的和再除以樣本數量
-
知道過擬合與欠擬合的原因以及解決方法
- 過擬合
- 表現; 在訓練集表現很好, 但是在測試集上表現的不好
- 原因: 模型太複雜了, 學到特徵太多了
- 解決:
- 清洗數據, 讓數據變更純, 去掉噪聲數據
- 增加樣本數量
- 正則化
- 特徵降維, 減少特徵維度(個數)
- 欠擬合
- 表現: 在訓練集 上表現不好, 在測試集上表現頁不好
- 原因: 模型太簡單了, 學到特徵太少了
- 解決:
- 添加其他的特徵項
- 添加多次項.
- 過擬合
-
知道嶺迴歸的原理及與線性迴歸的不同之處
- 嶺迴歸; 在線性迴歸損失函數上添加一個L2的正則化項, L2正則化項; 係數的平方和
- 線性迴歸的不同之處:
- 使用L2的正則化
- 使用隨機平均梯度下降
-
應用Ridge實現迴歸預測
# 4. 機器學習(嶺迴歸: L2正則化項 + 隨機平均梯度下降) estimator = Ridge() estimator.fit(x_train, y_train)
-
應用joblib實現模型的保存與加載
# 4. 機器學習(嶺迴歸: L2正則化項 + 隨機平均梯度下降) # estimator = Ridge() # estimator.fit(x_train, y_train) # 保存訓練好的模型 # joblib.dump(estimator, 'test.pkl') estimator = joblib.load('test.pkl')
-