文章目錄
- 四、回歸與聚類演算法
- 4.1 線性回歸
- 4.1.1 線性回歸的原理
- 4.1.2 線性回歸的損失和優化原理
- 4.1.3 線性回歸API
- 4.1.4 波士頓房價預測
- 4.1.5 梯度下降的擴展:GD、SGD、SAG
- 4.1.6 總結
- 4.2 欠擬合與過擬合
- 4.2.1 什么是過擬合與欠擬合
- 4.2.2 原因以及解決方法
- 4.3 線性回歸的改進---嶺回歸
- 4.3.1 帶有L2正則化的線性回歸--嶺回歸
- 4.4 分類演算法--邏輯回歸與二分類
- 4.4.1 邏輯回歸的應用場景
- 4.4.2 邏輯回歸的原理
- 4.4.3 邏輯回歸API
- 4.4.4 案例:癌癥分類預測-良/惡性乳腺癌腫瘤預測
- 4.4.5 分類的評估方法
- 4.5 模型保存和加載
- 4.5.1 模型的保存和加載API
- 4.5.2 線性回歸的模型保存加載案例
- 4.6 無監督學習:K-means演算法
- 什么是無監督學習
- 4.6.2 無監督學習包含演算法
- 4.6.3 K-means原理
- 4.6.4 K-means API
- 4.6.5 案例:k-means對instacart Market用戶聚類
- 4.6.6 K-means性能評估指標
- 4.6.7 K-means總結
四、回歸與聚類演算法
4.1 線性回歸
學習目標:
- 記憶線性回歸的原理程序
- 應用LinearRegression或SGDRegressor實作回歸預測
- 記憶回歸演算法的評估標準及其公式
4.1.1 線性回歸的原理
1 線性回歸應用場景

2 什么是線性回歸
不同權重加權

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

4.1.2 線性回歸的損失和優化原理
1 損失函式:最小二乘法

2 優化演算法
- 正規方程:直接求解W
- 梯度下降:試錯,改進
正規方程:直接求解W

梯度下降(Gradient Descent)

4.1.3 線性回歸API
1)線性回歸:
sklearn.linear_model.LinearRegression(fit_intercept=True)
- fit_intercept:是否計算偏置
- LinearRegression.coef_:回歸系數
- LinearRegression.intercept_:偏置
2)梯度下降:
sklearn.linear_model.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)
- SGDRegression.coef_:回歸系數
- SGDRegression.intercept_:偏置

4.1.4 波士頓房價預測


流程:
1)獲取資料集
2)劃分資料集
3)特征工程:無量綱化 - 標準化
4)預估器流程:fit() -> 模型,coef_ intercept_
5)模型評估
2 回歸性能評估
均方誤差(Mean Squared Error)(MSE)評價機制

sklearn.metrics.mean_squared_error(y_ture, 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 linner1():
"""
正規方程的優化方法
: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("正規方程權重系數為:\n", estimator.coef_)
print("正規方程偏置為:\n", 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 linner2():
"""
梯度下降的優化方法
:return:
"""
# 1)獲取資料
boston = load_boston()
print("特征數量:\n", boston.data.shape) # 幾個特征對應幾個權重系數
# 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(learning_rate="constant", eta0=0.001, max_iter=10000)
estimator.fit(x_train, y_train)
# 5)得出模型
print("梯度下降權重系數為:\n", estimator.coef_)
print("梯度下降偏置為:\n", 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__':
linner1()
linner2()
正規方程權重系數為:
[-0.64817766 1.14673408 -0.05949444 0.74216553 -1.95515269 2.70902585
-0.07737374 -3.29889391 2.50267196 -1.85679269 -1.75044624 0.87341624
-3.91336869]
正規方程偏置為:
22.62137203166228
預測房價:
[28.22944896 31.5122308 21.11612841 32.6663189 20.0023467 19.07315705
21.09772798 19.61400153 19.61907059 32.87611987 20.97911561 27.52898011
15.54701758 19.78630176 36.88641203 18.81202132 9.35912225 18.49452615
30.66499315 24.30184448 19.08220837 34.11391208 29.81386585 17.51775647
34.91026707 26.54967053 34.71035391 27.4268996 19.09095832 14.92742976
30.86877936 15.88271775 37.17548808 7.72101675 16.24074861 17.19211608
7.42140081 20.0098852 40.58481466 28.93190595 25.25404307 17.74970308
38.76446932 6.87996052 21.80450956 25.29110265 20.427491 20.4698034
17.25330064 26.12442519 8.48268143 27.50871869 30.58284841 16.56039764
9.38919181 35.54434377 32.29801978 21.81298945 17.60263689 22.0804256
23.49262401 24.10617033 20.1346492 38.5268066 24.58319594 19.78072415
13.93429891 6.75507808 42.03759064 21.9215625 16.91352899 22.58327744
40.76440704 21.3998946 36.89912238 27.19273661 20.97945544 20.37925063
25.3536439 22.18729123 31.13342301 20.39451125 23.99224334 31.54729547
26.74581308 20.90199941 29.08225233 21.98331503 26.29101202 20.17329401
25.49225305 24.09171045 19.90739221 16.35154974 15.25184758 18.40766132
24.83797801 16.61703662 20.89470344 26.70854061 20.7591883 17.88403312
24.28656105 23.37651493 21.64202047 36.81476219 15.86570054 21.42338732
32.81366203 33.74086414 20.61688336 26.88191023 22.65739323 17.35731771
21.67699248 21.65034728 27.66728556 25.04691687 23.73976625 14.6649641
15.17700342 3.81620663 29.18194848 20.68544417 22.32934783 28.01568563
28.58237108]
正規方程-均分誤差為:
20.62751376309541
特征數量:
(506, 13)
梯度下降權重系數為:
[-0.49204282 0.90600442 -0.425408 0.78122193 -1.64479112 2.83475726
-0.13698271 -3.10445426 1.64364102 -0.88718517 -1.70440114 0.86728865
-3.89585718]
梯度下降偏置為:
[22.64133018]
預測房價:
[28.32988027 31.59628165 21.47291021 32.62500214 20.25743881 19.25430704
21.38515208 19.41801029 19.65928761 32.85198424 21.37546131 27.39056689
15.66170121 20.03328423 37.07101073 18.63258981 9.77520186 18.65105864
30.75325523 24.22837635 19.22472715 34.09165 29.44791249 17.56977717
34.7787419 26.45428709 34.22802121 27.29578864 19.32013582 15.73108309
30.8244829 14.45690648 37.39673182 9.17153635 16.4192231 16.95257013
8.02155337 19.91710981 40.38852095 29.15121021 25.24407119 18.010192
39.44673115 6.88236339 21.66834002 25.00581309 20.93463887 20.7354025
16.93857116 26.53856695 9.76725711 27.08260975 30.57506666 16.93015199
9.7853468 35.48002407 31.38771996 22.92251304 17.5887466 21.81266956
23.59614589 23.90931722 20.36883456 38.1178319 25.69501252 19.84073947
14.34417444 6.91806577 42.47139663 21.77826021 16.84647155 22.57258974
40.93987894 21.67674727 36.91202332 27.13881344 21.80877794 20.7595932
25.25423255 23.79657533 31.47394835 20.13480903 23.8995206 31.35105601
27.26683269 21.0353684 29.04765138 21.97300518 26.75012864 18.76796591
25.07915162 23.89632104 20.11003321 18.24837709 15.66456151 18.41027271
24.51065473 16.92998012 20.79986196 26.80312356 20.88746429 18.18470202
24.16520581 23.24517214 20.27485512 36.41503937 16.03109086 22.43965602
32.59510994 33.78438794 20.55420887 25.91441489 23.37496527 17.74240561
21.45360217 21.65660718 27.41255864 25.15738326 23.64996403 14.61343906
15.9240983 3.86335915 29.20453051 20.82989445 22.24521707 28.00451562
28.39269673]
梯度下降-均分誤差為:
21.42768961540712

4.1.5 梯度下降的擴展:GD、SGD、SAG

4.1.6 總結
線性回歸的損失函式:均方誤差
線性回歸的優化方法:正規方程、梯度下降
線性回歸的性能衡量方法:均方誤差
4.2 欠擬合與過擬合
學習目標:
- 說明線性回歸(不帶正則化)的缺點
- 說明過擬合與欠擬合的原因以及解決方法
問題:訓練資料訓練的很好啊,誤差也不大,為什么在測驗集上有問題呢?
過擬合
4.2.1 什么是過擬合與欠擬合
欠擬合:

過擬合:



4.2.2 原因以及解決方法
欠擬合原因以及解決方法
- 原因:學習到資料的特征過少
- 解決方法:增加資料的特征數量
過擬合原因以及解決方法 - 原因:學到的特征過多,存在一些嘈雜特征,模型過于復雜
- 解決辦法:正則化

1 正則化類別 - L1正則化
- L2正則化,更常用
L2正則化:
- 作用:可以使得其中一些W都很小,都接近于0,削弱某個特征的影響
- 優點:越小的引數說明模型越簡單,越簡單的模型也不容易產生過擬合現象
- Ridge回歸
- 加入L2正則化后的損失函式:
損失函式+懲罰項

L1正則化:
- 作用:可以使得其中一些W的值直接為0,洗掉這個特征的影響
- LASSO回歸
4.3 線性回歸的改進—嶺回歸
學習目標:
- 說明嶺回歸的原理即與線性回歸的不同之處
- 說明正則化對于權重引數的影響
- 說明L1和L2正則化的區別
4.3.1 帶有L2正則化的線性回歸–嶺回歸
嶺回歸,其實也是一種線性回歸,只不過在演算法建立回歸方程時候,加上正則化的限制,從而達到解決過擬合的效果
1 API
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, solver='auto', normalize=False)
- alpha:正則化力度,取值范圍:0-1,1-10
- solver:會根據資料自動選擇優化方法
-
- sag:如果資料集、特征都較大,選擇該隨機梯度下降優化
- normalize:資料是否進行標準化
-
- normalize=False:可以在fit之前呼叫preprocessing.StandardScaler標準化資料
- Ridge.coef_:回歸權重
- Ridge.intercept_:回歸偏置


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, Ridge
from sklearn.metrics import mean_squared_error
def linner1():
"""
正規方程的優化方法
: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("正規方程權重系數為:\n", estimator.coef_)
print("正規方程偏置為:\n", 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 linner2():
"""
梯度下降的優化方法
:return:
"""
# 1)獲取資料
boston = load_boston()
print("特征數量:\n", boston.data.shape) # 幾個特征對應幾個權重系數
# 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(learning_rate="constant", eta0=0.001, max_iter=10000)
estimator.fit(x_train, y_train)
# 5)得出模型
print("梯度下降權重系數為:\n", estimator.coef_)
print("梯度下降偏置為:\n", 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 linner3():
"""
嶺回歸
:return:
"""
# 1)獲取資料
boston = load_boston()
print("特征數量:\n", boston.data.shape) # 幾個特征對應幾個權重系數
# 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(alpha=0.5, max_iter=10000) # 可默認引數
estimator.fit(x_train, y_train)
# 5)得出模型
print("嶺回歸-權重系數為:\n", estimator.coef_)
print("嶺回歸-下降偏置為:\n", 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__':
linner1()
linner2()
linner3()

4.4 分類演算法–邏輯回歸與二分類
學習目標:
- 說明邏輯回歸的損失函式
- 說明邏輯回歸的優化方法
- 說明sigmoid函式
- 知道邏輯回歸的應用場景
- 知道精確率、召回率指標的區別
- 知道F-score指標說明召回率的實際意義
- 說明如何解決樣本不均衡情況下的評估
- 了解ROC曲線的意義,說明AUC指標大小
- 應用classificiation_report實作精確率、召回率計算
- 應用roc_auc_score實作指標計算
4.4.1 邏輯回歸的應用場景
- 廣告點擊率:是否會被點擊
- 是否為垃圾郵件
- 是否患病
- 金融詐騙
- 虛假賬號
以上都是二分類(正例,反例),邏輯回歸就是解決二分類的利器
4.4.2 邏輯回歸的原理

線性回歸的輸出就是邏輯回歸的輸入


3 損失以及優化



2 優化
同樣使用梯度下降優化演算法,去減少損失函式的值,這樣去更新邏輯回歸前面對應演算法的權重引數,提升原本屬于1類別的概率,降低原本是0類別的概率
4.4.3 邏輯回歸API
sklearn.linear_model.LogisticRefression(solver='liblinear', penalty='l2, C=1.0)
- penalty:正則化種類
- C:正則化力度
- solver:優化求解方式(默認開源的liblinear庫實作)

4.4.4 案例:癌癥分類預測-良/惡性乳腺癌腫瘤預測

流程分析:
1)獲取資料:讀取的時候加上names
2)資料處理:處理缺失值
3)資料集劃分
4)特征工程:無量綱化處理—標準化
5)邏輯回歸預估器
6)模型評估
import pandas as pd
import numpy as np
# 1、讀取資料
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(path, names=column_name) #699 rows × 11 columns
# 2、缺失值處理
# 1)替換-》np.nan
data = data.replace(to_replace="?", value=np.nan)
# 2)洗掉缺失樣本
data.dropna(inplace=True) #683 rows × 11 columns
# 3、劃分資料集
from sklearn.model_selection import train_test_split
# 篩選特征值和目標值
x = data.iloc[:, 1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 4、標準化
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
from sklearn.linear_model import LogisticRegression
# 5、預估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 邏輯回歸的模型引數:回歸系數和偏置
estimator.coef_ # 權重
estimator.intercept_ # 偏置
# 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)
4.4.5 分類的評估方法
1 精確率與召回率
1 混淆矩陣
真的患癌癥的,能夠被檢查出來的概率

2 精確率(Precision)與召回率(Recall)



3 分類評估報告API
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None)
- y_true:真實目標值
- y_pred:估計器預測目標值
- labels:指定類別對應的數字
- target_names:目標類別名稱
- return:每個類別精確率與召回率
# 查看精確率、召回率、F1-score
from sklearn.metrics import classification_report
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "惡性"])


衡量樣本不均衡下的評估:
2 ROC曲線與AUC指標
TPR就是召回率



4 AUC計算API
from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_score)
- y_true:每個樣本的真實類別,必須為0(反例)和1(正例)
- y_score:預測得分,可以是正類的估計概率、置信值或者分類器方法的回傳值
# y_true:每個樣本的真實類別,必須為0(反例),1(正例)標記
# 將y_test 轉換成 0 1
y_true = np.where(y_test > 3, 1, 0)
from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_predict)

5 總結
- AUC只能用來評價二分類
- AUC非常適合評價樣本在不平衡中的分類器性能
4.5 模型保存和加載
學習目標:
- 應用joblib實作模型的保存于加載
4.5.1 模型的保存和加載API
import joblib
- 保存:joblib.dump(rf, ‘test.pkl’)
- 加載:estimator = joblib.load(‘test.pkl’)
4.5.2 線性回歸的模型保存加載案例
1、保存模型

2、加載模型

4.6 無監督學習:K-means演算法
學習目標:
- 說明K-means演算法原理
- 說明K-means的性能評估標準輪廓系數
- 說明K-means的優缺點
什么是無監督學習
沒有目標值(無標簽)—無監督學習

4.6.2 無監督學習包含演算法
聚類:K-means
降維:PCA
4.6.3 K-means原理

4.6.4 K-means API
sklearn.cluster.KMeans(n_cluster=8, init='k-means++')
- n_clusters:開始聚類中心數量
- init:初始化方法,默認為‘k-means++’
- labels_:默認標記的型別,可以和真實值比較(不是值比較)
from sklearn.cluster import KMeans
estimator = KMeans(n_clusters=3)
estimator.fit(data_new)
y_predict = estimator.predict(data_new)

4.6.5 案例:k-means對instacart Market用戶聚類
1 分析
- 1)降維之后的資料
- 2)預估器流程:k-means聚類
- 3)聚類結果顯示
- 4)模型評估
4.6.6 K-means性能評估指標
1 輪廓系數

2 輪廓系數值分析

3 結論

4 輪廓系數API
sklearn.metrics.silhouette_score(X, labels)
- 計算所有樣本的平均輪廓系數
- X:特征值
- labels:被聚類標記的目標值
from sklearn.metrics import silhouette_score
silhouette_score(data_new, y_predict)

4.6.7 K-means總結
特點分析:采用迭代式演算法,直觀易懂并且非常實用
缺點:容易收斂到區域最優解(多次聚類)
注意:聚類一般坐在分類之前

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279599.html
標籤:python
