[机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现
作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:[機器學習與scikit-learn-20]:算法-邏輯回歸-線性邏輯回歸linear_model.LogisticRegression與代碼實現_文火冰糖(王文兵)的博客-CSDN博客
目錄
第1章 scikit-learn線性邏輯回歸的實現
第2章 linear_model.LogisticRegression類參數詳解
2.1 類原型
2.2 正則化
2.3 類參數說明
第3章 線性邏輯回歸代碼示例
3.1 步驟1:生成、構建訓練數據集
3.2 步驟2:構建模型并訓練模型
3.3 步驟3:可視化模型預測的分類邊界
第1章 scikit-learn線性邏輯回歸的實現
第2章 linear_model.LogisticRegression類參數詳解
2.1 類原型
class sklearn.linear_model.LogisticRegression (
????????penalty=’l2’,
????????dual=False, tol=0.0001, C=1.0,
????????fit_intercept=True,
????????intercept_scaling=1,
????????class_weight=None,
????????random_state=None,
????????solver=’warn’,
????????max_iter=100,
????????multi_class=’warn’,
????????verbose=0, warm_start=False, n_jobs=None)
2.2 正則化
正則化是用來防止模型過擬合的過程,常用的有L1正則化和L2正則化兩種選項,分別通過在損失函數后加上參數向量 的L1范式和L2范式的倍數來實現。
這個增加的范式,被稱為“正則項”,也被稱為"懲罰項"。
損失函數改變,基于損失函數的最優化來求解的參數取值必然改變,我們以此來調節模型擬合的程度。其中L1范式表現為參數向量中的每個參數的絕對值之和,L2范數表現為參數向量中的每個參數的平方和的開方值。
2.3 類參數說明
(1)penalty='l2'?: 正則化參數類型,字符串‘l1’或‘l2’,默認‘l2’。
(2)dual=False?:
對偶或者原始方法。Dual只適用于正則化相為l2的‘liblinear’的情況,通常樣本數大于特征數的情況下,默認為False。
(3)C=1.0?: C為正則化系數λ的倒數,必須為正數,默認為1。
和SVM中的C一樣,值越小,代表正則化越強。
(4)fit_intercept=True?: 是否存在截距,默認存在。
(5)intercept_scaling=1?: 僅在正則化項為‘liblinear’,且fit_intercept設置為True時有用
(6)solver='liblinear'?: solver參數決定了我們對邏輯回歸損失函數的優化方法,有四種算法可以選擇。
- a) liblinear:使用了開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數。
- b) lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
- c) newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
- d) sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數據多的時候。
從上面的描述可以看出,newton-cg、lbfgs和sag這三種優化算法時都需要損失函數的一階或者二階連續導數,因此不能用于沒有連續導數的L1正則化,只能用于L2正則化。而liblinear通吃L1正則化和L2正則化。
同時,sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候不要選擇它,而如果樣本量非常大,比如大于10萬,sag是第一選擇。但是sag不能用于L1正則化,所以當你有大量的樣本,又需要L1正則化的話就要自己做取舍了。要么通過對樣本采樣來降低樣本量,要么回到L2正則化。
但是liblinear也有自己的弱點!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準確一些。而liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。
第3章 線性邏輯回歸代碼示例
線性回歸是指模型是用“直線”擬合,用直線回歸、然后分類。
適合于數據的分布界限是:直線可以分割的。
3.1 步驟1:生成、構建訓練數據集
# 導入庫 import numpy as np import matplotlib.pyplot as plt# 創建自動生成的數據集 np.random.seed(0)# 生成二維隨機向量點(X1,X2) X = np.random.normal(0, 1, size=(200, 2)) X1 = X[:,0] X2 = X[:,1] print(X.shape) print(X1.shape) print(X2.shape)# 生成樣本二分類的標簽: # 2X+X2 > 1的點標簽為1 # 2X+X2 =< 1的點標簽為0 # 邊界:直線邊界 X1^2 + X2 Y = np.array((X1**2 + X2) > 1, dtype='int') print(Y.shape) print(Y)# 隨機抽取 20個樣本,強制其分類為 1, # 相當于更改數據,添加噪音 for _ in range(10):Y[np.random.randint(200)] = 1# 所有標簽y=0的點 plt.scatter(X[Y==0, 0], X[Y==0, 1])# 所有標簽y=1的點 plt.scatter(X[Y==1, 0], X[Y==1, 1])plt.show() (200, 2) (200,) (200,) (200,) [1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 00 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 11 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 00 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 10 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 00 0 0 0 0 1 1 0 0 1 0 0 0 1 1]3.2 步驟2:構建模型并訓練模型
# 構建模型并訓練模型 from sklearn.model_selection import train_test_splitX_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)from sklearn.linear_model import LogisticRegression#log_reg = LogisticRegression() log_reg = LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,penalty='l2', random_state=None, solver='liblinear', tol=0.0001,verbose=0, warm_start=False) log_reg.fit(X_train, Y_train) score_train = log_reg.score(X_train, Y_train) score_test = log_reg.score(X_test, Y_test) print("訓練集分數",score_train) print("測試集分數:",score_test) 訓練集分數 0.7933333333333333 測試集分數: 0.8備注:從上圖可以看出,用直線去擬合拋物線分布的向量點,準確率并不高。
下一篇文章看如何優化,使用多項式來進行預測。
3.3 步驟3:可視化模型預測的分類邊界
# 可視化訓練結果#可視化決策邊界:通過兩種預測分類的顏色不同來展示決策的邊界 # 背景數據:為二維網格數據點:meshgrid # 所有用模型預測為1的點,標注紅色 # 所有用模型預測為0的點,標注為藍色 def plot_decision_boundary(model, axis):# 生成二維度的網格數據x1, x2 = np.meshgrid(np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1))print("x1.shape", x1.shape)print("x2.shape", x2.shape)# 組合X1,X2, 得到(X1,X2)向量點X = np.c_[x1.ravel(), x2.ravel()]print("X.shape", X.shape)# 模型預測分類y_predict = model.predict(X)print("y_predict.shape=", y_predict.shape)# 把一維預測值轉換成網格上的點的分類類型y = y_predict.reshape(x1.shape)print("y.shape=", y.shape)print(y)from matplotlib.colors import ListedColormapcustom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])# 彩色打印網格點,網格點的顏色由y的類型確定# y的類型,由模型對網格點的預測得到plt.contourf(x1, x2, y, linewidth=5, cmap=custom_cmap)plot_decision_boundary(log_reg, axis=[-3, 3, -3, 3])# 可視化源樣本點 plt.scatter(X[Y==0,0], X[Y==0,1]) plt.scatter(X[Y==1,0], X[Y==1,1])plt.show() x1.shape (600, 600) x2.shape (600, 600) X.shape (360000, 2) y_predict.shape= (360000,) y.shape= (600, 600) [[0 0 0 ... 0 0 0][0 0 0 ... 0 0 0][0 0 0 ... 0 0 0]...[1 1 1 ... 1 1 1][1 1 1 ... 1 1 1][1 1 1 ... 1 1 1]]作者主頁(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網址:[機器學習與scikit-learn-20]:算法-邏輯回歸-線性邏輯回歸linear_model.LogisticRegression與代碼實現_文火冰糖(王文兵)的博客-CSDN博客
總結
以上是生活随笔為你收集整理的[机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不上网电脑安装python_离线安装py
- 下一篇: pt-online-schema-cha