欠擬合與過擬合
什麼是過擬合與欠擬合
欠擬合算法
過擬合api
- 第一種狀況:由於機器學習到的天鵝特徵太少了,致使區分標準太粗糙,不能準確識別出天鵝。
- 第二種狀況:機器已經基本能區別天鵝和其餘動物了。而後,很不巧已有的天鵝圖片全是白天鵝的,因而機器通過學習後,會認爲天鵝的羽毛都是白的,之後看到羽毛是黑的天鵝就會認爲那不是天鵝。
定義
- 過擬合:一個假設在訓練數據上可以得到比其餘假設更好的擬合, 可是在測試數據集上卻不能很好地擬合數據,此時認爲這個假設出現了過擬合的現象。(模型過於複雜)
- 欠擬合:一個假設在訓練數據上不能得到更好的擬合,而且在測試數據集上也不能很好地擬合數據,此時認爲這個假設出現了欠擬合的現象。(模型過於簡單)
緣由以及解決辦法
- 欠擬合緣由以及解決辦法
- 緣由:學習到數據的特徵過少
- 解決辦法:增長數據的特徵數量
- 過擬合緣由以及解決辦法
- 緣由:原始特徵過多,存在一些嘈雜特徵, 模型過於複雜是由於模型嘗試去兼顧各個測試數據點
- 解決辦法:
在學習的時候,數據提供的特徵有些影響模型複雜度或者這個特徵的數據點異常較多,因此算法在學習的時候儘可能減小這個特徵的影響(甚至刪除某個特徵的影響),這就是正則化dom
正則化類別
- L2正則化
- 做用:可使得其中一些W的都很小,都接近於0,削弱某個特徵的影響
- 優勢:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象
- Ridge迴歸
- L1正則化
- 做用:可使得其中一些W的值直接爲0,刪除這個特徵的影響
- LASSO迴歸
線性迴歸的改進-嶺迴歸
帶有L2正則化的線性迴歸-嶺迴歸
API
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)機器學習
- 具備l2正則化的線性迴歸
- alpha:正則化力度,也叫 λ
- solver:會根據數據自動選擇優化方法
- sag:若是數據集、特徵都比較大,選擇該隨機梯度降低優化
- normalize:數據是否進行標準化
- normalize=False:能夠在fit以前調用preprocessing.StandardScaler標準化數據
- Ridge.coef_:迴歸權重
- Ridge.intercept_:迴歸偏置
Ridge方法至關於SGDRegressor(penalty='l2', loss="squared_loss"),只不過SGDRegressor實現了一個普通的隨機梯度降低學習,推薦使用Ridge(實現了SAG)
sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)函數
- 具備l2正則化的線性迴歸,能夠進行交叉驗證
- coef_:迴歸係數
案例-波士頓房價預測
def linear3():
"""
嶺迴歸的優化方法對波士頓房價預測
"""
#獲取數據
boston=load_boston()
#劃分數據集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
#標準化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#預估器
estimator=Ridge(alpha=0.0001, max_iter=100000)
estimator.fit(x_train,y_train)
#得出模型
print("嶺迴歸-權重係數爲:\n",estimator.coef_)
print("嶺迴歸-偏置爲:\n",estimator.intercept_ )
#模型評估
y_predict = estimator.predict(x_test)
print("預測房價:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("嶺迴歸-均方差偏差:\n", error)
return None
if __name__ == '__main__':
linear3()
結果爲:性能
分類算法-邏輯迴歸與二分類
邏輯迴歸的應用場景
- 廣告點擊率
- 是否爲垃圾郵件
- 是否患病
- 金融詐騙
- 虛假帳號
看到上面的例子,咱們能夠發現其中的特色,那就是都屬於兩個類別之間的判斷。邏輯迴歸就是解決二分類問題的利器學習
邏輯迴歸的原理
輸入
邏輯迴歸的輸入就是一個線性迴歸的結果。測試
激活函數
- 迴歸的結果輸入到sigmoid函數當中
- 輸出結果:[0, 1]區間中的一個機率值,默認爲0.5爲閾值
輸出結果解釋(重要):假設有兩個類別A,B,而且假設咱們的機率值爲屬於A(1)這個類別的機率值。如今有一個樣本的輸入到邏輯迴歸輸出結果0.6,那麼這個機率值超過0.5,意味着咱們訓練或者預測的結果就是A(1)類別。那麼反之,若是得出結果爲0.3那麼,訓練或者預測結果就爲B(0)類別。
因此接下來咱們回憶以前的線性迴歸預測結果咱們用均方偏差衡量,那若是對於邏輯迴歸,咱們預測的結果不對該怎麼去衡量這個損失呢?咱們來看這樣一張圖
那麼如何去衡量邏輯迴歸的預測結果與真實結果的差別呢?優化
損失以及優化
損失
邏輯迴歸的損失,稱之爲對數似然損失,公式以下:spa
接下來咱們呢就帶入上面那個例子來計算一遍,就能理解意義了。
邏輯迴歸API
sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
- solver:優化求解方式(默認開源的liblinear庫實現,內部使用了座標軸降低法來迭代優化損失函數)
- penalty:正則化的種類
- C:正則化力度
案例:癌症分類預測-良/惡性乳腺癌腫瘤預測
相關數據:https://archive.ics.uci.edu/ml/machine-learning-databases/
分析
代碼:
在不少分類場景當中咱們不必定只關注預測的準確率!!!!!
好比以這個癌症舉例子!!!咱們並不關注預測的準確率,而是關注在全部的樣本當中,癌症患者有沒有被所有預測(檢測)出來。
分類的評估方法
精確率與召回率
在分類任務下,預測結果(Predicted Condition)與正確標記(True Condition)之間存在四種不一樣的組合,構成混淆矩陣(適用於多分類)
- 精確率:預測結果爲正例樣本中真實爲正例的比例(瞭解)
- 召回率:真實爲正例的樣本中預測結果爲正例的比例(查的全,對正樣本的區分能力)
還有其餘的評估標準,F1-score,反映了模型的穩健型
分類評估報告API
- sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
-
- y_true:真實目標值
- y_pred:估計器預測目標值
- labels:指定類別對應的數字
- target_names:目標類別名稱
- return:每一個類別精確率與召回率
ROC曲線與AUC指標
知道TPR與FPR
- TPR = TP / (TP + FN)
- FPR = FP / (FP + FN)
ROC曲線
- ROC曲線的橫軸就是FPRate,縱軸就是TPRate,當兩者相等時,表示的意義則是:對於不論真實類別是1仍是0的樣本,分類器預測爲1的機率是相等的,此時AUC爲0.5
AUC指標
- AUC的機率意義是隨機取一對正負樣本,正樣本得分大於負樣本的機率
- AUC的最小值爲0.5,最大值爲1,取值越高越好
- AUC=1,完美分類器,採用這個預測模型時,無論設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。
- 0.5<AUC<1,優於隨機猜想。這個分類器(模型)妥善設定閾值的話,能有預測價值。
最終AUC的範圍在[0.5, 1]之間,而且越接近1越好
AUC計算API
- from sklearn.metrics import roc_auc_score
- sklearn.metrics.roc_auc_score(y_true, y_score)
- 計算ROC曲線面積,即AUC值
- y_true:每一個樣本的真實類別,必須爲0(反例),1(正例)標記
- y_score:每一個樣本預測的機率值
總結
- AUC只能用來評價二分類
- AUC很是適合評價樣本不平衡中的分類器性能