日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sklearn综合示例3:逻辑回归

發布時間:2024/1/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sklearn综合示例3:逻辑回归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • API
      • 模型參數
        • penalty
        • dual
        • tol
        • C
        • fit_intercept
        • class_weight
        • random_state
        • solver
        • max_iter
        • verbose
        • warm_start
        • n_jobs
      • 模型對象
      • 模型方法
    • mnist數據集
    • iris數據集

關于邏輯回歸的完整參數,可以參考:https://scikitlearn.com.cn/0.21.3/2/#1111-logistic

API

參考:https://zhuanlan.zhihu.com/p/39780207

import numpy as np import pandas as pd import sklearn

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=‘liblinear’,
max_iter=100, multi_class=‘ovr’, verbose=0, warm_start=False, n_jobs=1)?

模型參數

penalty

正則化選擇參數,參數可選值為l1和l2,分別對應l1正則化和l2正則化,默認是l2正則化。

調整該參數的目的主要是為了防止過擬合,一般penalty選擇l2正則化就夠啦,但是如果選擇l2正則化發現依然過擬合,即預測效果還是很差的時候,就可以考慮l1正則化。如果模型的特征非常多,我們希望做一些特征選擇(即把一些不重要的特征過濾掉),這個時候也可以考慮用l1正則化。

penalty參數的選擇會影響我們損失函數優化算法的選擇,即參數solver的選擇,如果是l2正則化,可選的優化算法 {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以選擇。但是如果penalty是L1正則化的話,就只能選擇‘liblinear’了。這是因為L1正則化的損失函數不是連續可導的,而{‘newton-cg’, ‘lbfgs’,‘sag’}這三種優化算法時都需要損失函數的一階或者二階連續導數。而‘liblinear’并沒有這個依賴。這幾個優化方法在solver參數環節進行講述。

dual

用來指明是否將原問題改成他的對偶問題,對偶問題可以理解成相反問題,比如原問題是求解最大值的線性規劃,那么他的對偶問題就是轉化為求解最小值的線性規劃,適用于樣本較小的數據集,因樣本小時,計算復雜度較低。

tol

殘差收斂條件,默認是0.0001,也就是只需要收斂的時候兩步只差<0.0001就停止,可以設置更大或更小。(邏輯回歸模型的損失函數是殘差平方和)

C

正則化系數,正則化強度的導數,必須是一個正數,值越小,正則化強度越大,即防止過擬合的程度更大。

fit_intercept

是否將截距/方差加入到決策模型中,默認為True。

class_weight

class_weight是很重要的一個參數,是用來調節正負樣本比例的,默認是值為None,也就是正負樣本的權重是一樣的,你可以以dict的形式給模型傳入任意你認為合適的權重比,也可以直接指定一個值“balanced”,模型會根據正負樣本的絕對數量比來設定模型最后結果的權重比。

比如,有一數據集的正負樣本絕對數量比為4:6,如果你給參數class_weight賦予balanced值,那么最后模型結果中,正負樣本的權重比就會變成6:4。

random_state

隨機種子的設置,默認是None,如果設置了隨機種子,那么每次使用的訓練集和測試集都是一樣的,這樣不管你運行多少次,最后的準確率都是一樣的;如果沒有設置,那么每次都是不同的訓練集和測試集,最后得出的準確率也是不一樣的。

solver

用來指明損失函數的優化方法,默認是‘liblinear’方法,sklearn自帶了如下幾種:

參數值優化方法liblinear使用了坐標軸下降法來迭代優化損失函數lbfgs擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數newton-cg也是牛頓法法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數sag即隨機平均梯度下降,是梯度下降法的變種,是一種線性收斂算法,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數據多的時候

newton-cg, lbfgs和sag這三種優化算法時都需要損失函數的一階或者二階連續導數,因此不能用于沒有連續導數的L1正則化,只能用于L2正則化。而liblinear對L1正則化和L2正則化都適用。同時,因sag每次僅僅使用了部分樣本進行梯度迭代,所以當數據量較少時不宜選用,而當數據量很大時,為了速度,sag是第一選擇。

max_iter

算法收斂的最大迭代次數,即求取損失函數最小值的迭代次數,默認是100,multi_class:分類方法參數選擇,‘ovr’和‘multinomial’兩個值可以選擇,默認值為‘ovr’,如果分類問題是二分類問題,那么這兩個參數的效果是一樣的,主要體現在多分類問題上。

對于多分類問題,"ovr"分類方法是:針對每一類別進行判斷時,都會把這個分類問題簡化為是/非兩類問題;而‘multinomial’是從眾多類別中選出兩個類別,對這兩個類別進行判斷,待判斷完成后,再從剩下的類別中再選出兩類進行判斷,直至最后判斷完成。

verbose

英文意思是”冗余“,就是會輸出一些模型運算過程中的東西(任務進程),默認是False,也就是不需要輸出一些不重要的計算過程。

warm_start

是否使用上次的模型結果作為初始化,默認是False,表示不使用。

n_jobs

并行運算數量(核的數量),默認為1,如果設置為-1,則表示將電腦的cpu全部用上。

模型對象

coef_:返回各特征的系數,絕對值大小可以理解成特征重要性
intercept_:返回模型的截距n_iter_:模型迭代次數

模型方法

decision_function(X):返回決策函數值(比如svm中的決策距離)predict_proba(X):返回每個類別的概率值(有幾類就返回幾列值)predict_log_proba(X):返回概率值的log值(即將概率取對數)
predict(X):返回預測結果值(0/1)
score(X, y=None):返回函數
get_params(deep=True):返回估計器的參數
set_params(**params):為估計器設置參數

mnist數據集

本示例中,我們使用邏輯回歸做一個簡單的分類示例,主要用于展示sklearn中LogisticRegression的使用方式。

import numpy as np import pandas as pd import sklearn import matplotlib.pyplot as plt from sklearn.linear_model import SGDClassifier,LogisticRegression

我們使用mnist數據集,但LR是一個二分類模型,所以我們本次不是將數字分為0-9,而是判斷數字是否5。

我們先獲取數據:

注意:fetch_openml()返回一個bundle,在sklearn0.24前,其data字段為一個ndarray, 0.24改成了datafame。

可以把dataframe轉換成ndarray,或者直接使用datafame,然后用iloc()索引數據。

from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784', version=1) X,y = pd.DataFrame.to_numpy(mnist['data']), pd.DataFrame.to_numpy(mnist['target'])

看一下數據:

print(sklearn.__version__) print(type(mnist)) print(type(X)) print(type(mnist)) print(mnist.keys()) print(X.shape, y.shape) print(type(X[0])) 0.24.2 <class 'sklearn.utils.Bunch'> <class 'numpy.ndarray'> <class 'sklearn.utils.Bunch'> dict_keys(['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url']) (70000, 784) (70000,) <class 'numpy.ndarray'>

我們可以看到mnist有70000個樣本。我們取出第一個畫個圖看看:

first_digit_image = X[0].reshape(28,28) plt.imshow(first_digit_image, cmap='binary') <matplotlib.image.AxesImage at 0x170be32b0>

數據準備好以后,我們開始模型訓練:

X_train, X_test = X[:6000], X[6000:] # 注意,mnist的標簽是字符,我們先轉化為數字。 y_train, y_test = y[:6000].astype(np.uint8), y[6000:].astype(np.uint8) y_train_5 = (y_train == 5) y_test_5 = (y_test == 5)# model = LogisticRegression() model = SGDClassifier(loss='log') model.fit(X_train, y_train_5) SGDClassifier(loss='log')

也可以使用SGDClassifier,默認情況,SGDClassfier的loss=‘hinge’,對應SVM,如果想要使用LR,則設置loss=‘log’。

我們使用上述模型預測第一個圖片:

model.predict([X[0]]) array([ True])

我們規范一點,使用交叉驗證測試準確率。

sklearn提供了很方便的函數cross_val_score()來交叉驗證:

from sklearn.model_selection import cross_val_score cross_val_score(model, X_train, y_train_5, cv=3, scoring='accuracy') array([0.964 , 0.95 , 0.9625])

注意,使用cross_val_score()只是用于驗證模型,最終還需要使用fit()來訓練模型。

更靈活的方式是,計算出來預測值,然后根據metric計算。比如以下方式用于計算mse:

y_pred = model.predict(X_test) from sklearn.metrics import mean_squared_error mse_pred = mean_squared_error(y_test, y_pred) print(mse_pred) 27.444828125

完整代碼如下:

from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784', version=1) X,y = pd.DataFrame.to_numpy(mnist['data']), pd.DataFrame.to_numpy(mnist['target'])X_train, X_test = X[:6000], X[6000:] y_train, y_test = y[:6000].astype(np.uint8), y[6000:].astype(np.uint8) y_train_5 = (y_train == 5) y_test_5 = (y_test == 5)model = SGDClassifier(loss='hinge') model.fit(X_train, y_train_5) print(model.predict([X[0]]))from sklearn.model_selection import cross_val_score cross_val_score(model, X_train, y_train_5, cv=3, scoring='accuracy') [ True]array([0.956 , 0.958 , 0.9665])

iris數據集

我們在看一下使用iris數據集做分類示例。同時還簡單的示范了如何使用LogisticRegression解決多分類問題。

from sklearn import datasets from sklearn.linear_model import LogisticRegression iris = datasets.load_iris()X = iris['data'] y = (iris['target'] == 2).astype(int) #看是否屬于類別2log_reg = LogisticRegression(penalty='l2', C=0.1) log_reg.fit(X, y) LogisticRegression(C=0.1)

我們看一下效果:

from sklearn.model_selection import cross_val_score cross_val_score(log_reg, X, y, cv=3, scoring='accuracy') array([0.94, 0.94, 0.88])

上述例子中,我們只把樣本預測為是否類別2,下面我們嘗試一下把它預測到正確的類別,也就是多分類問題。

當用兩個以上的類訓練時,ScikitLearn的LogisticRegressio默認選擇使用的是一對多的訓練方式,不過將超參數multi_class設置為"multinomial",可以將其切換成Softmax回歸。你還必須指定一個支持Softmax回歸的求解器,比如"lbfgs"求解器(詳見ScikitLearn文檔)。默認使用L2正則化,你可以通過超參數C進行控制:

X = iris['data'] y = iris['target']softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10, max_iter=1000) softmax_reg.fit(X, y) LogisticRegression(C=10, max_iter=1000, multi_class='multinomial') cross_val_score(softmax_reg, X, y, cv=3, scoring='accuracy') array([0.98, 0.98, 0.96])

總結

以上是生活随笔為你收集整理的sklearn综合示例3:逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。