數(shù)據(jù)科學和人工智能技術(shù)筆記 十二、邏輯回歸

十二、邏輯回歸

作者:Chris Albon

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

C 超參數(shù)快速調(diào)優(yōu)

有時卒稳,學習算法的特征使我們能夠比蠻力或隨機模型搜索方法更快地搜索最佳超參數(shù)猾愿。

scikit-learn 的LogisticRegressionCV方法包含一個參數(shù)C鹦聪。 如果提供了一個列表,C是可供選擇的候選超參數(shù)值蒂秘。 如果提供了一個整數(shù)泽本,C的這么多個候選值,將從 0.0001 和 10000 之間的對數(shù)標度(C的合理值范圍)中提取姻僧。

# 加載庫
from sklearn import linear_model, datasets

# 加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 創(chuàng)建邏輯回歸的交叉驗證
clf = linear_model.LogisticRegressionCV(Cs=100)

# 訓(xùn)練模型
clf.fit(X, y)

'''
LogisticRegressionCV(Cs=100, class_weight=None, cv=None, dual=False,
           fit_intercept=True, intercept_scaling=1.0, max_iter=100,
           multi_class='ovr', n_jobs=1, penalty='l2', random_state=None,
           refit=True, scoring=None, solver='lbfgs', tol=0.0001, verbose=0) 
'''

在邏輯回歸中處理不平衡類別

像 scikit-learn 中的許多其他學習算法一樣规丽,LogisticRegression帶有處理不平衡類的內(nèi)置方法。 如果我們有高度不平衡的類撇贺,并且在預(yù)處理期間沒有解決它赌莺,我們可以選擇使用class_weight參數(shù)來對類加權(quán),確保我們擁有每個類的平衡組合松嘶。 具體來說艘狭,balanced參數(shù)會自動對類加權(quán),與其頻率成反比:

w_j = \frac{n}{kn_{j}}

其中 w_j 是類 j 的權(quán)重翠订,n 是觀察數(shù)巢音,n_j 是類 j 中的觀察數(shù),k 是類的總數(shù)尽超。

# 加載庫
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

# 加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 通過移除前 40 個觀測官撼,使類高度不均衡
X = X[40:,:]
y = y[40:]

# 創(chuàng)建目標向量,如果表示類別是否為 0
y = np.where((y == 0), 0, 1)

# 標準化特征
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 創(chuàng)建決策樹分類器對象
clf = LogisticRegression(random_state=0, class_weight='balanced')

# 訓(xùn)練模型
model = clf.fit(X_std, y)

邏輯回歸

盡管其名稱中存在“回歸”橙弱,但邏輯回歸實際上是廣泛使用的二分類器(即歧寺,目標向量只有兩個值)燥狰。 在邏輯回歸中,線性模型(例如 \beta_{0} + \beta_ {1} x)包含在 logit(也稱為 sigmoid)函數(shù)中斜筐,{\frac{1}{1 + e^{-z}}龙致,滿足:

P(y_i=1 \mid X)={\frac{1}{1+e^{-(\beta_{0}+\beta_{1}x)}}}

其中 P(y_i=1 \mid X) 是第 i 個觀測的目標值 y_i 為 1 的概率,X 是訓(xùn)練數(shù)據(jù)顷链,\beta_0\beta_1 是要學習的參數(shù)目代,e 是自然常數(shù)。

# 加載庫
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

# 加載只有兩個類別的數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data[:100,:]
y = iris.target[:100]

# 標準化特征
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 創(chuàng)建邏輯回歸對象
clf = LogisticRegression(random_state=0)

# 訓(xùn)練模型
model = clf.fit(X_std, y)

# 創(chuàng)建新的觀測
new_observation = [[.5, .5, .5, .5]]

# 預(yù)測類別
model.predict(new_observation)

# array([1]) 

# 查看預(yù)測的概率
model.predict_proba(new_observation)

# array([[ 0.18823041,  0.81176959]]) 

大量數(shù)據(jù)上的邏輯回歸

scikit-learn 的LogisticRegression提供了許多用于訓(xùn)練邏輯回歸的技術(shù)嗤练,稱為求解器榛了。 大多數(shù)情況下,scikit-learn 會自動為我們選擇最佳求解器煞抬,或警告我們霜大,你不能用求解器做一些事情。 但是革答,我們應(yīng)該注意一個特殊情況战坤。

雖然精確的解釋超出了本書的范圍,但隨機平均梯度下降使得我們在數(shù)據(jù)非常大時残拐,比其他求解器更快訓(xùn)練模型途茫。 但是,對特征尺度也非常敏感溪食,標準化我們的特征尤為重要囊卜。 我們可以通過設(shè)置solver ='sag'來設(shè)置我們的學習算法來使用這個求解器。

# 加載庫
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

# 加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 標準化特征
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 創(chuàng)建使用 SAG 求解器的邏輯回歸
clf = LogisticRegression(random_state=0, solver='sag')

# 訓(xùn)練模型
model = clf.fit(X_std, y)

帶有 L1 正則化的邏輯回歸

L1 正則化(也稱為最小絕對誤差)是數(shù)據(jù)科學中的強大工具错沃。 有許多教程解釋 L1 正則化栅组,我不會在這里嘗試這樣做。 相反枢析,本教程將展示正則化參數(shù)C對系數(shù)和模型精度的影響笑窜。

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

本教程中使用的數(shù)據(jù)集是著名的鳶尾花數(shù)據(jù)集。鳶尾花數(shù)據(jù)包含來自三種鳶尾花y登疗,和四個特征變量X的 50 個樣本嫌蚤。

數(shù)據(jù)集包含三個類別(三種鳶尾),但是為了簡單起見脱吱,如果目標數(shù)據(jù)是二元的,則更容易箱蝠。因此垦垂,我們將從數(shù)據(jù)中刪除最后一種鳶尾。

# 加載鳶尾花數(shù)據(jù)集
iris = datasets.load_iris()

# 從特征中創(chuàng)建 X
X = iris.data

# 從目標中創(chuàng)建 y
y = iris.target

# 重新生成變量劫拗,保留所有標簽不是 2 的數(shù)據(jù)
X = X[y != 2]
y = y[y != 2]

# 查看特征
X[0:5]

'''
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3\. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5\. ,  3.6,  1.4,  0.2]]) 
'''

# 查看目標數(shù)據(jù)
y

'''
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1]) 
'''

# 將數(shù)據(jù)拆分為測試和訓(xùn)練集
# 將 30% 的樣本放入測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

因為正則化懲罰由系數(shù)的絕對值之和組成,所以我們需要縮放數(shù)據(jù)页慷,使系數(shù)都基于相同的比例。

# 創(chuàng)建縮放器對象
sc = StandardScaler()

# 將縮放器擬合訓(xùn)練數(shù)據(jù)酒繁,并轉(zhuǎn)換
X_train_std = sc.fit_transform(X_train)

# 將縮放器應(yīng)用于測試數(shù)據(jù)
X_test_std = sc.transform(X_test)

L1 的用處在于它可以將特征系數(shù)逼近 0,從而創(chuàng)建一種特征選擇方法控妻。 在下面的代碼中州袒,我們運行帶有 L1 懲罰的邏輯回歸四次,每次都減少了C的值弓候。 我們應(yīng)該期望隨著C的減少郎哭,更多的系數(shù)變?yōu)?0。

C = [10, 1, .1, .001]

for c in C:
    clf = LogisticRegression(penalty='l1', C=c)
    clf.fit(X_train, y_train)
    print('C:', c)
    print('Coefficient of each feature:', clf.coef_)
    print('Training accuracy:', clf.score(X_train, y_train))
    print('Test accuracy:', clf.score(X_test, y_test))
    print('')

'''
C: 10
Coefficient of each feature: [[-0.0855264  -3.75409972  4.40427765  0\.        ]]
Training accuracy: 1.0
Test accuracy: 1.0

C: 1
Coefficient of each feature: [[ 0\.         -2.28800472  2.5766469   0\.        ]]
Training accuracy: 1.0
Test accuracy: 1.0

C: 0.1
Coefficient of each feature: [[ 0\.         -0.82310456  0.97171847  0\.        ]]
Training accuracy: 1.0
Test accuracy: 1.0

C: 0.001
Coefficient of each feature: [[ 0\.  0\.  0\.  0.]]
Training accuracy: 0.5
Test accuracy: 0.5 
'''

注意弓叛,當C減小時彰居,模型系數(shù)變小(例如撰筷,從C = 10時的4.36276075變?yōu)?code>C = 0.1時的0.0.97175097)陈惰,直到C = 0.001,所有系數(shù)都是零毕籽。 這是變得更加突出的抬闯,正則化懲罰的效果。

OVR 邏輯回歸

邏輯回歸本身只是二分類器关筒,這意味著它們無法處理具有兩個類別以上的目標向量溶握。 但是,邏輯回歸有一些聰明的擴展來實現(xiàn)它蒸播。 在 One-VS-Rest(OVR)邏輯回歸中睡榆,針對每個類別訓(xùn)練單獨的模型,預(yù)測觀測是否是該類(因此使其成為二分類問題)袍榆。 它假定每個分類問題(例如是不是類 0)是獨立的胀屿。

# 加載庫
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

# 加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 標準化特征
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 創(chuàng)建 OVR 邏輯回歸對象
clf = LogisticRegression(random_state=0, multi_class='ovr')

# 訓(xùn)練模型
model = clf.fit(X_std, y)

# 創(chuàng)建新的觀測
new_observation = [[.5, .5, .5, .5]]

# 預(yù)測類別
model.predict(new_observation)

# array([2]) 

# 查看預(yù)測概率
model.predict_proba(new_observation)

# array([[ 0.0829087 ,  0.29697265,  0.62011865]]) 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市包雀,隨后出現(xiàn)的幾起案子宿崭,更是在濱河造成了極大的恐慌,老刑警劉巖才写,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葡兑,死亡現(xiàn)場離奇詭異奖蔓,居然都是意外死亡,警方通過查閱死者的電腦和手機讹堤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門吆鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕劝,你說我怎么就攤上這事檀头。” “怎么了岖沛?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵暑始,是天一觀的道長。 經(jīng)常有香客問我婴削,道長廊镜,這世上最難降的妖魔是什么唉俗? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任虫溜,我火速辦了婚禮,結(jié)果婚禮上吱雏,老公的妹妹穿的比我還像新娘歧杏。我一直安慰自己迷守,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著礼华,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晨雳,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音血久,去河邊找鬼帮非。 笑死末盔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翠拣。 我是一名探鬼主播游盲,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谜慌,長吁一口氣:“原來是場噩夢啊……” “哼莺奔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弊仪,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤驳癌,失蹤者是張志新(化名)和其女友劉穎役听,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典予,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡衣摩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年捂敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了既琴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫恩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡磺箕,死狀恐怖抛虫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情击困,我是刑警寧澤阅茶,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布谅海,位于F島的核電站,受9級特大地震影響撞蜂,放射性物質(zhì)發(fā)生泄漏侥袜。R本人自食惡果不足惜枫吧,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颁湖。 院中可真熱鬧例隆,春花似錦镀层、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盯蝴,卻和暖如春听怕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尿瞭。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工黑竞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疏旨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓遏匆,卻偏偏與公主長得像幅聘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帝蒿,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容