回歸與聚類算法 學習筆記


4.回歸與聚類算法

4.1 線性回歸

4.1.1 線性回歸的原理

1 線性回歸應用場景

  • 房價預測
  • 銷售額度預測
  • 金融:貸款額度預測、利用線性回歸以及系數分析因子

2 什么是線性回歸

1) 定義與公式

線性回歸(Linear regression)是利用回歸方程(函數)對一個或多個自變量(特征值)和因變量(目標值)之間關系進行建模的一種分析方式。

  • 特點:只有一個自變量的情況稱為單變量回歸,多於一個自變量情況的叫做多元回歸

通用公式:\(h(w) = w1x1+w2x2+w3x3...+b=w^Tx+b\)

其中w,x可以理解為矩陣:

\(w=\begin{pmatrix} b \\ w1 \\ w2 \end{pmatrix},x=\begin{pmatrix} 1 \\ x1 \\ x2 \end{pmatrix}\)

特征值與目標值之間建立了一個關系,這個關系可以理解為線性模型。

2) 線性回歸的特征與目標的關系分析

線性回歸當中線性模型有兩種,一種是線性關系,另一種是非線性關系。

注:單特征與目標值的關系呈直線關系,或者兩個特征與目標值呈現平面的關系
更高維度的我們不用自己去想,記住這種關系即可

如果是非線性關系那么回歸方程可以理解為:w1x1 + w2x2^2 + w3x3^2

線性模型包括:

  • y = w1x1 + w2x2 + w3x3 + ... + wnxn + b
  • y = w1x1 + w2x2^2 + w3x3^2 + b

線性關系&線性模型

  • 線性關系一定是線性模型
  • 線性模型不一定是線性關系

4.1.2 線性回歸的損失和優化原理(理解記憶)

目標:求模型參數 → 模型參數能夠使得預測准確

1 損失函數

損失函數/cost/成本函數/目標函數

總損失定義為:

\[J(\theta) = (h_w(x_1)-y_1)^2 + (h_w(x_2)-y_2)^2+...+(h_w(x_m)-y_m)^2 \\ = \sum_{i=1}^m(h_w(x_i) - y_i) ^2 \]

  • yi為第i個樣本的真實值
  • h(xi)為第i個訓練樣本特征值組合預測函數
  • 又稱最小二乘法

減少這個損失的過程稱為損失優化

2 優化算法

線性回歸經常使用的兩種優化算法

  • 正規方程
    天才 - 直接求解w
    $ w = (XTX){-1}X^Ty$

    理解:X為特征值矩陣,y為目標值矩陣,直接求到最好的結果
    缺點:當特征值過多過復雜時,求解速度太慢且得不到結果

  • 梯度下降(Gradient Descent)
    勤奮努力的普通人 - 不斷試錯、改進
    \(w1' := w1 - \alpha\frac{\theta (w0+w1x1)}{\theta w1}\)
    \(w0' := w0 - \alpha\frac{\theta (w0+w1x1)}{\theta w1}\)

    理解:α為學習速率,需要手動指定(超參數),α旁邊的整體表示方向,沿着這個函數下降的方向找,最后就能找到山谷的最低點,然后更新W值
    使用:面對訓練數據規模十分龐大的任務,能夠找到較好的結果

4.1.3 線性回歸API

  • sklearn.linear_moder.LinearRegression(fit_intercept=True)
    • 通過正規方程優化
    • fit_intercept:是否計算偏置
    • LinearRegression.coef_:回歸系數
    • LinearRegression.intercept_:偏置
  • sklearn.linear_moder.SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate='invscaling',eta0=0.01)
    • SGDRegressor類實現了隨機梯度下降學習,它支持不同的loss函數和正則化懲罰項來擬合線性回歸模型。
    • loss:損失類型
      • loss="squared_loss":普通最小二乘法
    • fit_intercept:是否計算偏置
    • learning_rate:string,optional
      • 學習率填充
      • 'constant':eta = eta0
      • 'optimal':eta = 1.0/(alpha *(t+t0))[default]
      • 'invscaling':eta = eta0 / pow(t,power_t)
        power_t=0.25:存在父類當中
      • 對於一個常數值的學習率來說,可以使用learning_rate='constant',並使用eta0來指定學習率。
    • SGDRegressor.coef_:回歸系數
    • SGDRegressor.intercept_:偏置

sklearn提供給我們兩種實現的API,可以根據選擇使用

4.1.4 波士頓房價預測

1 分析

回歸當中的數據大小不一致,會導致結果影響較大。所以需要做標准化處理。

  • 數據分割與標准化處理
  • 回歸預測
  • 線性回歸的算法效果評估

2 回歸性能評估

均方誤差(Mean Squared Error)MSE 評價機制:

\(MSE = \frac{1}{m} \sum_{i=1}^{m}(y^i(預測值)-\bar{y}(真實值))^2\)

  • sklearn.metrics.mean_squared_error(y_true, y_pred)
    • 均方誤差回歸損失
    • y_true:真實值
    • y_pred:預測值
    • return:浮點數結果

3 代碼

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_squared_error

def linear1():
    """
    正規方程的優化方法對波士頓房價進行預測
    :return:
    """
    # 1)獲取數據
    boston = load_boston()
    
    # 2)划分數據集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    
    # 3)標准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    
    # 4)預估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    
    # 5)得到模型
    print("正規方程-權重系數為:",estimator.coef_)
    print("正規方程-偏置為:",estimator.intercept_)
    
    # 6)模型評估
    y_predict = estimator.predict(x_test)
    print("預測房價:\n",y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("正規方程-均方誤差為:\n",error)
    
    return None

def linear2():
    """
    梯度下降的優化方法對波士頓房價進行預測
    :return:
    """
    # 1)獲取數據
    boston = load_boston()
    
    # 2)划分數據集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    
    # 3)標准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    
    # 4)預估器
    estimator = SGDRegressor() 
    # SGDRegressor()可以設置(調參)
    estimator.fit(x_train, y_train)
    
    # 5)得到模型
    print("梯度下降-權重系數為:",estimator.coef_)
    print("梯度下降-偏置為:",estimator.intercept_)
    
    # 6)模型評估
    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__':
    # 代碼1:正規方程的優化方法對波士頓房價進行預測
    linear1()
	# 代碼2:梯度下降的優化方法對波士頓房價進行預測
    linear2()

4 回歸方程和梯度下降對比

  • 文字對比

    梯度下降 正規方程
    需要選擇學習率 不需要
    需要迭代求解 一次運算得出
    特征數量較大可以使用 需要計算方程,時間復雜度高O(n3)
  • 選擇:

    • 小規模數據:
      • LinearRegression(不能解決擬合問題)
      • 嶺回歸
    • 大規模數據:SGDRegressor

正規方程不一定比梯度下降好,梯度下降靈活性高,參數設置不一樣結果不一樣。梯度下降通用性強,正規方程局限性大

4.1.5 拓展-關於優化方法GD、SGD、SAG

1 GD

梯度下降(Gradient Descent),原始的梯度下降法需要計算所有樣本的值才能夠得出梯度,計算量大,所以后面才有一系列的改進。

2 SGD

隨機梯度下降(Stoochatic gradient descent)是一個優化方法,它在一次迭代時只考慮一個訓練樣本。

  • SGD的優點是:
    • 高效
    • 容易實現
  • SGD的缺點是:
    • SGD需要許多超參數:比如正規項參數、迭代數
    • SGD對於特征標准化是敏感的。

3 SAG

隨機平均梯度法(Stochasitc Average Gradient),由於收斂的速度太慢,有人提出SAG等基於梯度下降的算法

Scikit-learn:嶺回歸、邏輯回歸等當中都會有SAG優化

4.2 欠擬合與過擬合

4.2.1 什么是過擬合與欠擬合

定義

  • 過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合,但是在測試數據集上卻不能很好的擬合數據,此時認為這個假設出現了過擬合現象。(模型過於復雜)
  • 欠擬合:一個假設在訓練數據上不能獲得更好的擬合,並且在測試數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合現象。(模型過於簡單)

4.2.2 原因以及解決方法

  • 欠擬合原因以及解決方法
    • 原因:學習到數據的特征過少
    • 解決方法:解決數據的特征數量
  • 過擬合原因以及解決方法
    • 原因:原始特征過多,存在一些嘈雜特征,模型過於復雜是因為模型嘗試去兼顧各個測試數據點
    • 解決方法:正則化(盡量減小高次項特征的影響)

1 正則化類別

  • L2正則化

    • 作用:可以使得其中一些w都很小,都接近於0,削弱某個特征的影響

    • 優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象。

    • Ridge回歸

    • 加入L2正則化后的損失函數:
      \(J(w) = \frac{1}{2m} \sum_{i=1}^m(h_w(x_i)-y_i)^2 + \lambda \sum_{j=1}^n w_j^2\)

      損失函數 + 懲罰系數λ*懲罰項(平方)
      注:m為樣本數,n為特征數

  • L1正則化

    • 作用:可以使得其中一些W的值直接為0,刪除這個特征的影響
    • LASSO回歸
    • 損失函數 + 懲罰系數λ*懲罰項(絕對值)

4.3 線性回歸的改進 - 嶺回歸

4.3.1帶有L2正則化的線性回歸-嶺回歸

嶺回歸,其實也是一種線性回歸。只不過在算法建立回歸方程時,加上正則化的限制,從而達到解決過擬合的效果。

1 API

  • sklearn.linear_model.Ridge(alpha=1.0,fit_intercept=True,solver="auto",normalize=False)
    • 具有L2正則化的線性回歸
    • alpha:正則化力度,也叫λ
      • λ取值:0~1 1~10
    • 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_:回歸系數

2 觀察正則化程度的變化,對結果的影響?

  • 正則化力度越大,權重系數會越小
  • 正則化力度越小,權重系數會越大
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

def linear3():
    """
    嶺回歸對波士頓房價進行預測
    :return:
    """
    # 1)獲取數據
    boston = load_boston()
    
    # 2)划分數據集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    
    # 3)標准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    
    # 4)預估器
    estimator = Ridge()
    estimator.fit(x_train, y_train)
    
    # 5)得到模型
    print("嶺回歸-權重系數為:",estimator.coef_)
    print("嶺回歸-偏置為:",estimator.intercept_)
    
    # 6)模型評估
    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__':
    # 代碼3:嶺回歸對波士頓房價進行預測
    linear3()

4.4 分類算法-邏輯回歸與二分類

4.4.1 邏輯回歸的應用場景

  • 廣告點擊率 → 是否被點擊
  • 是否為垃圾郵件
  • 是否患病
  • 是否為金融詐騙
  • 是否為虛假賬號

都屬於二分類問題

4.4.2 邏輯回歸的原理

1 輸入

\(h(w) = w_1x_1+w_2x_2+w_3x_3 ... + b\)

邏輯回歸的輸入就是一個線性回歸的結果

2 激活函數

  • sigmoid函數 \(g(\theta^Tx) = \frac{1}{1+e^{-(\theta^Tx)}}\)
  • 分析
    • 回歸的結果輸入到sigmoid函數當中
    • 輸出結果:[0,1]區間中的一個概率值,默認為0.5為閾值(如果輸出大於閾值就屬於這個類別,小於則不屬於這個類別)

3 損失以及優化

1 損失

邏輯回歸的損失,稱之為對數似然損失,公式如下:

  • 分開類別:

    \[cost(h_\theta (x),y) = \begin{cases} -log(h_\theta (x)) &\text{if } y=1 \\ -log(1-h_\theta (x)) &\text{if } y=0 \end{cases} \]

  • 綜合完整損失函數

    \[cost(h_\theta (x),y) = \sum_{i=1}^m -y_i log(h_\theta (x)) - (1 - y_i)log(1-h_\theta (x)) \]

2 優化

同樣使用梯度下降優化算法,去減少損失函數的值。這樣去更新邏輯回歸前面對應算法的權重參數,提升原本屬於1類別的概率,降低原本是0類別的概率。

4.4.3 邏輯回歸API

  • sklearn.linear_model.LogisticRegression(solver='liblinear',penalty='l2',C=1.0)

    • solver:優化求解方式(默認開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數)
    • penalty:正則化的種類
    • C:正則化力度

    默認將類別數量少的當做正例

    LogisticsRegression方法相當於SGDClassifier(loss="log",penalty=" "),SGDClassifier實現了一個普通的隨機梯度下降學習,也支持平均隨機梯度下降法(ASGD),可以通過設置average = True。而使用LogisticsRegression(實現了SAG)

    4.4.4 案例:癌症分類預測

    流程分析:

    1. 獲取數據(讀取時加上names
    2. 數據處理(處理缺失值
    3. 數據集划分
    4. 特征工程(無量綱化處理—標准化
    5. 邏輯回歸預估值
    6. 模型評估
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    
    def logisticregression():
        """
        邏輯回歸進行癌症預測
        :return:None
        """
        # 1 讀取數據,處理缺失值以及標准化
        column_name=['列名1','列名2',...,'列名n']
        data = pd.read_csv("數據地址",names=column_name)
        
        # 2 缺失值處理
        # 1)替換→np.nan
        data = data.replace(to_replace="?",value=np.nan)
        # 2)刪除缺失樣本
        data.dropna()
        
        # 3 划分數據集
        # 篩選特征值和目標值
        x = data.iloc[:,1:-1]
        y = data["目標值列名"]
        x_train, x_test, y_train, y_test = train_test_split(x,y)
        
        # 4 特征工程   標准化
        transfer = StandardScaler()
        x_train = transfer.fit_transform(x_train)
        x_test = transfer.transform(x_test)
        
        # 5 邏輯回歸預估值
        estimator = LogisticRegression()
        estimator.fit(x_train, y_train)
        
        # 6 模型評估
        # 方法1:直接對比真實值和預測值
        y_predict = estimator.predict(x_test)
        print("y_predict:\n",y_predict)
        print("直接對比真實值和預測值:\n",y_test == y_predict)
    
        # 方法2:計算准確率
        score = estimator.score(x_test,y_test)
        print("准確率為:\n",score)
        
        return None
    

4.4.5 分類的評估方法

1 精確率與召回率

1 混淆矩陣

在分類任務下,預測結果與正確標記之間存在四種不同的組合,構成混淆矩陣(適用於多分類)

預測結果為正例 預測結果為偽例
真實結果為正例 真正例TP 偽反例FN
真實結果為偽例 偽正例FP 真反例TN
2 精確率(Precision)與召回率(Recall)
  • 精確率:預測結果為正例樣本中真實為正例的比例(查的對不對)\(\frac{TP}{TP+FP}\)
  • 召回率:真實為正例樣本中預測結果為正例的比例(查的全不全)\(\frac{TP}{TP+FN}\)
  • 還有其他的評估標准,F1-score,反映了模型的穩健型\(F12 = \frac{2TP}{2TP+FN+FP} = \frac{2*Precision*Recall}{Precision+Recall}\)
3 分類評估報告API
  • sklearn.metrics.classification_report(y_true,y_pred,labels=[],target_names=None)
    • y_true:真實目標值
    • y_pred:預估器預測目標值
    • labels:指定類別對應數字
    • target_name:目標類別名稱
    • return:每個類別精確率與召回率
# 查看精確率、召回率、F1-score
from sklearn.metrics import classification_report
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

def logisticregression():
    """
    邏輯回歸進行癌症預測
    :return:None
    """
    # 1 讀取數據,處理缺失值以及標准化
    column_name=['列名1','列名2',...,'列名n']
    data = pd.read_csv("數據地址",names=column_name)
    
    # 2 缺失值處理
    # 1)替換→np.nan
    data = data.replace(to_replace="?",value=np.nan)
    # 2)刪除缺失樣本
    data.dropna()
    
    # 3 划分數據集
    # 篩選特征值和目標值
    x = data.iloc[:,1:-1]
    y = data["目標值列名"]
    x_train, x_test, y_train, y_test = train_test_split(x,y)
    
    # 4 特征工程   標准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    
    # 5 邏輯回歸預估值
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)
    
    # 6 模型評估
    # 方法1:直接對比真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接對比真實值和預測值:\n",y_test == y_predict)

    # 方法2:計算准確率
    score = estimator.score(x_test,y_test)
    print("准確率為:\n",score)
    
    # 查看精確率、召回率、F1-score
    report = classification_report(y_test, y_predict. labels=[2,4],target_names=["良性","惡性"])
    print(report)
    
    return None
	

2 ROC曲線與AUC指標

1 知道TPR與FPR
  • TPR = TP / (TP + FN) —— 召回率
    • 所有真實類別為1的樣本中,預測類別為1的比例
  • FPR = FP / (FP + TN)
    • 所有真實類別為0的樣本中,預測類別為1的比例
2 ROC曲線
  • ROC曲線的橫軸就是FPRate,縱軸就是TPRate,當兩者相等時,表示的意義則是:對於不論真實類別是1還是0的樣本,分類器預測為1的概率是相等的,此時AUC為0.5

3 AUC指標
  • AUC的概率意義是隨機取一對正負樣本,正樣本得分大於負樣本的概率
  • AUC的最小值為0.5,最大值為1,取值越高越好
  • AUC=1,完美分類器,采用這個預測模型時,不管設定什么閾值都能得出完美預測。絕大多數預測的場合,不存在完美的分類器。
  • 0.5<AUC<1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。

最終AUC的范圍在[0.5,1]之間,並且越接近1越好

4 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:預測得分,可以是正類的估計概率、置信值或者分類器方法的返回值
y_true = np.where(y_test > 3, 1, 0)

print("AUC指標:",roc_auc_score(y_true,y_predict)
5 總結
  • AUC只能用來評價二分類
  • AUC非常適合評價樣本不平衡中的分類器性能

4.5 模型保存和加載

4.5.1 sklearn模型的保存和加載API

  • from sklearn.externals import joblib
    • 保存:joblib.dump(rf預估器,'test.pkl')
    • 加載:estimator = joblib.load('test.pkl')

4.5.2 線性回歸的模型保存加載案例

  • 保存
    # 4)預估器
    estimator = Ridge()
    estimator.fit(x_train, y_train)
    
    # 保存模型
    joblib.dump(estimator,"my_ridge.pkl")

  • 加載
 # 加載模型
    estimator = joblib.load("my_ridge.pkl")

4.6 無監督學習 k-means算法

4.6.1 什么是無監督學習

從無標簽的數據開始學習

4.6.2 無監督學習包含算法

  • 聚類
    • K-means(K均值聚類)
  • 降維
    • PCA

4.6.3 K-means原理

K-means聚類步驟

  • 1、隨機設置K個特征空間內的點作為初始的聚類中心(K — 超參數。取值→1)看需求,2)調節超參數)
  • 2、對於其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類中心點作為標記類別
  • 3、全部標記后,重新計算出每個聚類的新中心點(平均值)
  • 4、如果計算得出的新中心點與原中心點一樣,那么結束,否則重新進行第二步

4.6.4 K-means API

  • sklearn.cluster.KMeans(n_clusters=8,init='k-means++')
    • k-means聚類
    • n_clusters:開始的聚類中心數量
    • init:初始化方法,默認為'k-means++'
    • labels_:默認標記的類型,可以和真實值比較(不是值比較)

4.6.5 案例:K-means對Instacart Market用戶聚類

1 分析

降維后的數據

  • 預估器流程
  • 看結果
  • 模型評估
# 預估器流程
from sklearn.cluster import KMeans

estimator = KMeans(n_clusters=3)
estimator.fit(data)
estimator.predict(data)

4.6.6 K-means性能評估指標

1 輪廓系數

\(SC_i = \frac{b_i-a_i}{max(b_i,a_i)}\)

注:對於每個點i為已聚類數據中的樣本,bi為i到其它族群的所有樣本的距離最小值,ai為i到本身族的距離平均值。最終計算出所有的樣本點的輪廓系數平均值

2 輪廓系數值分析

uploading-image-569648.png

3 結論

如果bi>>ai:趨近於1,效果越好;bi<<ai:趨近於-1,效果不好。輪廓系數的值是介於[-1,1],越趨近於1代表內聚度和分離度都相對較優。

4 輪廓系數API

  • sklearn.metrics.silhouette_score(X,labels)
    • 計算所有樣本的平均輪廓系數
    • X:特征值
    • labels:被聚類標記的目標值
# 模型評估 - 輪廓系數
from sklearn.metrics import silhouette_score

silhouette_score(data,y_predict)

4.6.7 K-means總結

  • 特點分析:采取迭代式算法,直觀易懂並且非常實用
  • 缺點:容易收斂到局部最優解(多次類聚)

注意:聚類一般坐在分類之前


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM