【機器學習】邏輯斯蒂回歸概率計算和手動計算對比

在這里插入圖片描述

二分類,邏輯斯蒂回歸概率計算

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_splitX,y = datasets.load_iris(True)cond = y!=2X = X[cond]
y = y[cond]result = train_test_split(X,y,test_size = 0.2) 
lr = LogisticRegression()
#默認參數是multi_class  =‘ ovr’
lr.fit(result[0],result[2])w = lr.coef_
b = lr.intercept_
print(w,b)

[[-0.34810833 -1.44374096 2.10532233 0.92880099]] [-0.2257872]

# X_test = result[1]
proba_ = lr.predict_proba(result[1])
proba_[:5]

array([[0.97156547, 0.02843453],
[0.02694131, 0.97305869],
[0.0148049 , 0.9851951 ],
[0.89064238, 0.10935762],
[0.08131901, 0.91868099]])

# 手動計算概率
h = result[1].dot(w[0].T) + b
# 類別1的概率,p;另一類的概率是 1-p
# sigmoid函數中計算概率
p = 1/(1 + np.e**(-h))
np.c_[1-p,p][:5]

array([[0.97156547, 0.02843453],
[0.02694131, 0.97305869],
[0.0148049 , 0.9851951 ],
[0.89064238, 0.10935762],
[0.08131901, 0.91868099]])

多分類概率計算

X,y = datasets.load_iris(True)X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2) 
'''{'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},              
optional (default='liblinear')'''#三個特征的時候選用 multinomial  指定solver = ‘saga’
lr = LogisticRegression(multi_class = 'multinomial',solver = 'saga') 
lr.fit(X_train,y_train) 
proba_ = lr.predict_proba(X_test)
proba_[:5]

array([[2.83886375e-03, 3.43540675e-01, 6.53620461e-01],
[7.01459536e-05, 5.08027666e-02, 9.49127087e-01],
[2.25910422e-02, 8.48058248e-01, 1.29350710e-01],
[1.66217061e-02, 7.49819482e-01, 2.33558812e-01],
[1.78524805e-04, 7.47710404e-02, 9.25050435e-01]])

exi∑i=0Nexi\frac{e^{x_i}}{\sum_{i=0}^Ne^{x_i}}i=0N?exi?exi??

x = np.array([1,3,-1,10])
# softmax 軟最大:將數值轉化成概率,比較
p = np.e**(x)/((np.e**(x)).sum())
p

array([1.23280114e-04, 9.10923680e-04, 1.66841492e-05, 9.98949112e-01])

p.sum()

1.0

# 三分類,三個方程,每個方程中4個系數
w = lr.coef_b = lr.intercept_
b

array([ 0.72228862, 1.00179962, -1.72408823])

h = X_test.dot(w.T) + b 
# softmax
# 根據 softmax數學公式,計算了類別的概率
p = np.e**h/((np.e**h).sum(axis = 1).reshape(-1,1))
p[:5]

array([[2.83886375e-03, 3.43540675e-01, 6.53620461e-01],
[7.01459536e-05, 5.08027666e-02, 9.49127087e-01],
[2.25910422e-02, 8.48058248e-01, 1.29350710e-01],
[1.66217061e-02, 7.49819482e-01, 2.33558812e-01],
[1.78524805e-04, 7.47710404e-02, 9.25050435e-01]])

proba_[:5]

array([[2.83886375e-03, 3.43540675e-01, 6.53620461e-01],
[7.01459536e-05, 5.08027666e-02, 9.49127087e-01],
[2.25910422e-02, 8.48058248e-01, 1.29350710e-01],
[1.66217061e-02, 7.49819482e-01, 2.33558812e-01],
[1.78524805e-04, 7.47710404e-02, 9.25050435e-01]])

sklearn.linear_model.LogisticRegression()函數全稱是Logistic回歸(aka logit,MaxEnt)分類器。

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=‘lbfgs’, max_iter=100, multi_class=‘auto’, verbose=0,
warm_start=False, n_jobs=None, l1_ratio=None)

參數:

penalty:懲罰項,str類型,可選參數為l1和l2,默認為l2。用于指定懲罰項中使用的規范。newton-cg、sag和lbfgs求解算法只支持L2規范。L1G規范假設的是模型的參數滿足拉普拉斯分布,L2假設的模型參數滿足高斯分布,所謂的范式就是加上對參數的約束,使得模型更不會過擬合(overfit),但是如果要說是不是加了約束就會好,這個沒有人能回答,只能說,加約束的情況下,理論上應該可以獲得泛化能力更強的結果。

dual: 對偶或原始方法,bool類型,默認為False。對偶方法只用在求解線性多核(liblinear)的L2懲罰項上。當樣本數量>樣本特征的時候,dual通常設置為False。
tol: 停止求解的標準,float類型,默認為1e-4。就是求解到多少的時候,停止,認為已經求出最優解。
c:正則化系數λ的倒數,float類型,默認為1.0。必須是正浮點型數。像SVM一樣,越小的數值表示越強的正則化。
fit_intercept: 是否存在截距或偏差,bool類型,默認為True。
intercept_scaling: 僅在正則化項為”liblinear”,且fit_intercept設置為True時有用。float類型,默認為1。
class_weight: 用于標示分類模型中各種類型的權重,可以是一個字典或者balanced字符串,默認為不輸入,也就是不考慮權重,即為None。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權重,或者自己輸入各個類型的權重。舉個例子,比如對于0,1的二元模型,我們可以定義class_weight={0:0.9,1:0.1},這樣類型0的權重為90%,而類型1的權重為10%。如果class_weight選擇balanced,那么類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。當class_weight為balanced時,類權重計算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples為樣本數,n_classes為類別數量,np.bincount(y)會輸出每個類的樣本數,例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]。
那么class_weight有什么作用呢? 在分類模型中,我們經常會遇到兩類問題:
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類為合法用戶的代價很高,我們寧愿將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不愿將非法用戶分類為合法用戶。這時,我們可以適當提高非法用戶的權重。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法用戶,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類劃分到高權重的類別,從而可以解決上面兩類問題。
random_state: 隨機數種子,int類型,可選參數,默認為無,僅在正則化優化算法為sag,liblinear時有用。
solver: 優化算法選擇參數,只有五個可選參數,即newton-cg,lbfgs,liblinear,sag,saga。默認為liblinear。solver參數決定了我們對邏輯回歸損失函數的優化方法,有四種算法可以選擇,分別是:

  • liblinear: 使用了開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數。

  • lbfgs: 擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。

  • newton-cg: 也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。

  • sag:
    即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數據多的時候。

  • saga: 線性收斂的隨機優化算法的的變重。

總結:

liblinear適用于小數據集,而sag和saga適用于大數據集因為速度更快。

對于多分類問題,只有newton-cg,sag,saga和lbfgs能夠處理多項損失,而liblinear受限于一對剩余(OvR)。啥意思,就是用liblinear的時候,如果是多分類問題,得先把一種類別作為一個類別,剩余的所有類別作為另外一個類別。一次類推,遍歷所有類別,進行分類。
newton-cg,sag和lbfgs這三種優化算法時都需要損失函數的一階或者二階連續導數,因此不能用于沒有連續導數的L1正則化,只能用于L2正則化。而liblinear和saga通吃L1正則化和L2正則化。
同時,sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候不要選擇它,而如果樣本量非常大,比如大于10萬,sag是第一選擇。但是sag不能用于L1正則化,所以當你有大量的樣本,又需要L1正則化的話就要自己做取舍了。要么通過對樣本采樣來降低樣本量,要么回到L2正則化。
從上面的描述,大家可能覺得,既然newton-cg, lbfgs和sag這么多限制,如果不是大樣本,我們選擇liblinear不就行了嘛!錯,因為liblinear也有自己的弱點!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準確一些。郁悶的是liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。
max_iter:算法收斂最大迭代次數,int類型,默認為10。僅在正則化優化算法為newton-cg, sag和lbfgs才有用,算法收斂的最大迭代次數。
**multi_class:分類方式選擇參數,str類型,可選參數為ovr和multinomial,默認為ovr。**ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯回歸,ovr和multinomial并沒有任何區別,區別主要在多元邏輯回歸上
OvR和MvM有什么不同?
OvR的思想很簡單,無論你是多少元邏輯回歸,都可以看做二元邏輯回歸。具體做法是,對于第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例,然后在上面做二元邏輯回歸,得到第K類的分類模型。其他類的分類模型獲得以此類推。
而MvM則相對復雜,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本里面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負例,進行二元邏輯回歸,得到模型參數。我們一共需要T(T-1)/2次分類。
可以看出OvR相對簡單,但分類效果相對略差(這里指大多數樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。如果選擇了ovr,則4種損失函數的優化方法liblinear,newton-cg,lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。
verbose:日志冗長度,int類型。默認為0。就是不輸出訓練過程,1的時候偶爾輸出結果,大于1,對于每個子模型都輸出。
warm_start:熱啟動參數,bool類型。默認為False。如果為True,則下一次訓練是以追加樹的形式進行(重新使用上一次的調用作為初始化)。
n_jobs:并行數。int類型,默認為1。1的時候,用CPU的一個內核運行程序,2的時候,用CPU的2個內核運行程序。為-1的時候,用所有CPU的內核運行程序。
還有其他參數:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456109.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WPF快速指導2:模板

WPF快速指導2:模板 本文摘要: 1:模板作用; 2:樣式模板; 3:數據模板; 4:如何使用ControlTemplate; 5:如何使用DataTempla…

五個最佳媒體格式轉換器

我們經常會遇到下載的視頻文件格式不對,無法在其他播放設備(如手機、DVD)中使用的問題,現在,我們介紹五個功能強大且易于使用的媒體轉換器,用于轉換不同類型的視頻文件。   Super (Windows) Super是一個免…

【機器學習】六種算法在人臉補全中的應用比較(K緊鄰,線性,決策樹,嶺回歸,套索回歸,ElasticNet)

需求: 根據人的上半邊臉預測下半邊臉,用各種算法取得的結果與原圖比較 思考: 這是一個回歸問題,不是分類問題(人臉數據不固定) 數據集一共包含40個人,每一個人10張照片,分布規律 每…

性能優化之NSDateFormatter

為什么要優化NSDateFormatter?首先,過度的創建NSDateFormatter用于NSDate與NSString之間轉換,會導致App卡頓,打開Profile工具查一下性能,你會發現這種操作占CPU比例是非常高的。據官方說法,創建NSDateForma…

QuickTime文件格式解析

QuickTime文件格式解析Peter Lee 2008-06-14 一、簡介 QuickTime是Apple公司開發的一套完整的多媒體平臺架構,可以用來進行多種媒體的創建,生產,和分發,并為這一過程提供端到端的支持:包括媒體的實時捕捉,…

python的數據類型轉換

數據類型轉換 將數據由當前類型變化為其他類型的操作就是數據類型轉換。數據類型轉換分為兩類,分別是自動數據類型轉換 和 強制數據類型轉換。 自動轉換(隱式轉換) 自動轉換時程序根據運算要求進行的轉換,不許要人工干預。 1.自動類型轉換不需要人工干…

Linux文件屬性及如何修改文件屬性

ls -al:顯示文件的文件名與相關屬性并列出所有文件詳細的權限與屬性 dr-xr-x---. 7 root root 4096 Apr3 12:31 . 權限 連接 所有者 用戶組 文件容量 修改日期 文件名 第一個字符代表這個文件是“目錄,文件&#x…

SyntaxError:identifier starts immediately after numeric literal

1、錯誤描寫敘述2、錯誤原因因為在改動方法傳參的過程,須要傳個id,可是這個id是字符串類型,傳入的是數值型3、解決的方法在傳參時,須要加入“”,變成字符串類型User.modify("id");

python中的運算和運算符

運算和運算符 運算: 由一個以上的值經過變化得到新值得過程,就是運算。 運算符: 用于運算的符號,就是運算符 運算的分類: 1.算數運算 2.比較運算/關系運算 3.賦值運算 4.邏輯運算 5.位運算 6.成員運算 7.身份運算算術…

【數據分析】reshape(-1,1)和numpy的廣播機制

在創建DataFrame的時候常常使用reshape來更改數據的列數和行數。 reshape可以用于numpy庫里的ndarray和array結構以及pandas庫里面的DataFrame和Series結構。 源數據 reshape函數 reshape(行,列)可以根據指定的數值將數據轉換為特定的行數和…

藍橋杯-組素數-java

/* (程序頭部注釋開始) * 程序的版權和版本聲明部分 * Copyright (c) 2016, 廣州科技貿易職業學院信息工程系學生 * All rights reserved. * 文件名稱: 藍橋杯賽題 * 作 者: 彭俊豪 * 完成日期&#xf…

AVI文件規范

AVI文件規范PeterLee 2007-10-14 一、AVI文件簡介 AVI的英文全稱為Audio Video Interleaved,即音頻視頻交錯格式,是將語音和影像同步組合在一起的文件格式。AVI于1992年被Microsoft公司推出,隨Windows3.1一起被人們所認識和熟知。AVI文件格式…

python中的流程控制

流程控制 流程: 計算機執行代碼的順序,就是流程。 流程控制: 對計算機代碼執行順序的控制,就是流程控制。 流程分類: 流程控制一共分為三類,分別是 順序結構、分支(選擇)結構、循環結構。 順序結構 順序…

tomcat jdbc SlowQueryReport的實現解讀

為什么80%的碼農都做不了架構師?>>> ##序 tomcat提供了JdbcInterceptor可以用來監控jdbc的執行情況,默認提供了好幾個現成的interceptor可以用,SlowQueryReport以及SlowQueryReportJmx就是其中的兩個。 ##JdbcInterceptor的基本原…

【機器學習】Bagging和Boosting的區別(面試準備)

Baggging 和Boosting都是模型融合的方法,可以將弱分類器融合之后形成一個強分類器,而且融合之后的效果會比最好的弱分類器更好。 Bagging: 先介紹Bagging方法: Bagging即套袋法,其算法過程如下: 從原始樣本集中抽取訓…

python中的循環結構

循環結構 循環結構可以減少源程序重復書寫的工作量(代碼量),用來描述重復執行某段算法的問題,這是程序設計中最能發揮計算機特長的程序結構。 Python中循環結構分為兩類,分別是 while 和 for .. in while 格式1: num1,num2 3…

線性判別結合源碼分析LDA原理

1. LDA的思想 LDA線性判別分析也是一種經典的降維方法,LDA是一種監督學習的降維技術,也就是說它的數據集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。LDA的思想可以用一句話概括,就是“投影后類內方…

RIFF文件規范

RIFF文件規范Peter Lee 2007-10-02 摘要:RIFF全稱為資源互換文件格式(Resources Interchange File Format),RIFF文件是windows環境下大部分多媒體文件遵循的一種文件結構,常見的如WAV文件、AVI文件等。RIFF可以看成一種…

FB宣布將回購60億美元股票 首席會計官將離職

11月19日消息,據美國媒體報道,Facebook宣布將回購60億美元股票,回購計劃將在明年第一季度開始實施。另外,該公司還宣布首席會計官賈斯艾特瓦爾將離職。 短期回購股票可使Facebook贏得時間,緩解投資長期項目如Instagram…

2017小目標

最美人間四月天,沒有三月的傲寒,沒有五月的燥熱,桃花剛偷去了紅,楊柳在風中扭著腰,櫻花正開的爛漫。工作繁忙之余。做一下深呼吸,沾衣欲濕杏花雨,吹面不含楊柳風。不知不覺2017第一季度已經結束…