[轉(zhuǎn)載] python之sklearn-分類算法-3.4 邏輯回歸與二分類

參考鏈接: Python中的邏輯門

一,邏輯回歸的應(yīng)用場景?

廣告點擊率是否為垃圾郵件是否患病金融詐騙虛假賬號?

二瓢剿,邏輯回歸的原理?

1废膘,輸入?

邏輯回歸的輸入是線性回歸的結(jié)果:??

2酝惧,激活函數(shù)?

1)sigmoid函數(shù)?

? 回歸的結(jié)果輸入到sigmod函數(shù)當(dāng)中?

輸出結(jié)果:[0渠啊,1]區(qū)間中的一個概率值,默認(rèn)為0.5的門限值?

2)注意:?

邏輯回歸的最終分類是通過某個類別的概率來判斷是否屬于某個類別担孔,并且這個類別默認(rèn)標(biāo)記為1(正例)江锨,另一個標(biāo)記為0(反例)。默認(rèn)目標(biāo)值少的為正例糕篇。?

3啄育,損失函數(shù)?

1)對數(shù)似然損失公式?

邏輯回歸的損失,稱之為對數(shù)似然損失拌消,公式如下:? ??

2)綜合完整損失函數(shù)如下:?


3)理解對數(shù)似然損失示例如下:?

?如上可知挑豌,降低損失需要(正例減少sigmoid返回結(jié)果,反例增加sigmod返回結(jié)果)?

4墩崩,優(yōu)化方法?

同樣使用梯度下降優(yōu)化算法氓英,去減少損失函數(shù)的值,這樣去更新邏輯回歸前面對應(yīng)算法的權(quán)重參數(shù)鹦筹,提升原本屬于1類別的概率铝阐,降低原本為0類別的概率。?

三盛龄,邏輯回歸API?

sklearn.linear_model.LogisticRegression(solver=‘liblinear’,penalty=‘i2’,c=1.0)?

solver:優(yōu)化求解方式(默認(rèn)開源的liblinear庫實現(xiàn)饰迹,內(nèi)部使用了坐標(biāo)軸下降法來迭代優(yōu)化損失函數(shù))?

? sag:根據(jù)數(shù)據(jù)集自動選擇,隨機平局梯度下降 penalty:正則化種類c:正則化力度?


?默認(rèn)將類別數(shù)量少的當(dāng)正例?


四余舶,案例:癌癥分類預(yù)測?

數(shù)據(jù)源:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/?

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

def logisticregression():

? ? '''邏輯回歸癌癥預(yù)測'''

? ? # 確定數(shù)據(jù)columns數(shù)值

? ? columns = ["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("breast-cancer-wisconsin.data",names=columns)

? ? # 去掉缺失值

? ? data.replace(to_replace="?",value=np.nan,inplace=True)

? ? data.dropna(axis=0,inplace=True,how="any")

? ? # 提取目標(biāo)值

? ? target = data["Class"]

? ? # 提取特征值

? ? data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

? ? # 切割訓(xùn)練集和測試集

? ? x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

? ? # 進(jìn)行標(biāo)準(zhǔn)化

? ? std = StandardScaler()

? ? x_train = std.fit_transform(x_train)

? ? x_test = std.fit_transform(x_test)

? ? # 邏輯回歸進(jìn)行訓(xùn)練和預(yù)測

? ? lr = LogisticRegression()

? ? lr.fit(x_train,y_train)

? ? print("邏輯回歸權(quán)重:",lr.coef_)

? ? print("邏輯回歸偏置:",lr.intercept_)

? ? # 邏輯回歸測試集預(yù)測結(jié)果

? ? pre_result = lr.predict(x_test)

? ? print(pre_result)

? ? # 邏輯回歸預(yù)測準(zhǔn)確率

? ? sore = lr.score(x_test,y_test)

? ? print(sore)

if __name__ == '__main__':

? ? logisticregression()


五啊鸭,二分類的評估方法–(精確率(Precision)與召回率(Recall))?

1,精確率:?

預(yù)測結(jié)果為正例樣本中真是為整理的比例(查的準(zhǔn))??

2匿值,召回率:?

真是為正例的樣本中預(yù)測結(jié)果為正例的比例(查的全赠制,對正樣本的區(qū)分能力)??

3,F(xiàn)1-score?

反應(yīng)了模型的穩(wěn)健型??

4挟憔,模型評估API?

sklearn.metrics.classification_report(y_true,y_pred,target_names=None)?

y_true: 真實目標(biāo)值y_pred: 估計器預(yù)測目標(biāo)值target_names: 目標(biāo)類名稱return: 每個類別精準(zhǔn)率與召回率?

5钟些,代碼?

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report

def logisticregression():

? ? '''邏輯回歸癌癥預(yù)測'''

? ? # 確定數(shù)據(jù)columns數(shù)值

? ? columns = ["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("breast-cancer-wisconsin.data",names=columns)

? ? # 去掉缺失值

? ? data.replace(to_replace="?",value=np.nan,inplace=True)

? ? data.dropna(axis=0,inplace=True,how="any")

? ? # 提取目標(biāo)值

? ? target = data["Class"]

? ? # 提取特征值

? ? data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

? ? # 切割訓(xùn)練集和測試集

? ? x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

? ? # 進(jìn)行標(biāo)準(zhǔn)化

? ? std = StandardScaler()

? ? x_train = std.fit_transform(x_train)

? ? x_test = std.fit_transform(x_test)

? ? # 邏輯回歸進(jìn)行訓(xùn)練和預(yù)測

? ? lr = LogisticRegression()

? ? lr.fit(x_train,y_train)

? ? # 得到訓(xùn)練集返回數(shù)據(jù)

? ? # print("邏輯回歸權(quán)重:",lr.coef_)

? ? # print("邏輯回歸偏置:",lr.intercept_)

? ? # 邏輯回歸測試集預(yù)測結(jié)果

? ? pre_result = lr.predict(x_test)

? ? # print(pre_result)

? ? # 邏輯回歸預(yù)測準(zhǔn)確率

? ? sore = lr.score(x_test,y_test)

? ? print(sore)

? ? # 精確率(Precision)與召回率(Recall)

? ? report = classification_report(y_test,pre_result,target_names=["良性","惡性"])

? ? print(report)

if __name__ == '__main__':

? ? logisticregression()


六,ROC曲線與AUC指標(biāo)?


?問題:如何衡量樣本不均衡下的評估绊谭??


1政恍,ROC曲線與FPR?

TPR = TP / (TP + FN)?

? 所有真實類別為1的樣本中,預(yù)測類別為1的比例 FPR = FP / (TP + FN)?

? 所有真實類別為0的樣本中达传,預(yù)測類別為1的比例??

2篙耗,ROC曲線?

ROC曲線的橫軸就是FPRate,縱軸就是TPRate宪赶,當(dāng)二者相等時宗弯,表示的意義則是:對于不論真實類別時1還是0的樣本,分類器預(yù)測為1的概率是相等的搂妻,此時AUC為0.5 蒙保。??

3,AUC指標(biāo)?

AUC的概率意義時隨機取一對正負(fù)樣本欲主,正樣本得分大于負(fù)樣本的概率邓厕。AUC的最小值為0.5逝嚎,最大值為1,取值越高越好邑狸。AUC=1,完美分類器懈糯,采用這個預(yù)測模型時,不管設(shè)定什么門限值都能得出完美預(yù)測单雾。絕大多數(shù)預(yù)測的場合赚哗,不存在完美分類器。0.5<AUC<1,優(yōu)于隨機猜測. 這個分類器(模型)妥善設(shè)定限制的話,能有預(yù)測價值硅堆。AUC=0.5屿储,跟隨機猜測一樣(例:丟銅板),模型沒有預(yù)測價值渐逃。AUC<0.5够掠,比隨機猜測還差;但只要總是反預(yù)測而行茄菊,就優(yōu)于隨機猜測疯潭,因此不存在AIC<0.5的情況?


?最終AUC的范圍在[0.5,1],并且越接近1越好面殖。?


4竖哩,AUC計算API?

from sklearn.metrics import roc_auc_score?

sklearn.metrics.roc_auc_score(y_true,y_score)?

? 計算ROC曲線面積,即AUC值y_true:每個樣本的真是類別脊僚,必須為0(反例)相叁,1(正例)標(biāo)記y_score:每個樣本預(yù)測的概率值??

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report,roc_auc_score

def logisticregression():

? ? '''邏輯回歸癌癥預(yù)測'''

? ? # 確定數(shù)據(jù)columns數(shù)值

? ? columns = ["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("breast-cancer-wisconsin.data",names=columns)

? ? # 去掉缺失值

? ? data.replace(to_replace="?",value=np.nan,inplace=True)

? ? data.dropna(axis=0,inplace=True,how="any")

? ? # 提取目標(biāo)值

? ? target = data["Class"]

? ? # 提取特征值

? ? data = data.drop(["Sample code number"],axis=1).iloc[:,:-1]

? ? # 切割訓(xùn)練集和測試集

? ? x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3)

? ? # 進(jìn)行標(biāo)準(zhǔn)化

? ? std = StandardScaler()

? ? x_train = std.fit_transform(x_train)

? ? x_test = std.fit_transform(x_test)

? ? # 邏輯回歸進(jìn)行訓(xùn)練和預(yù)測

? ? lr = LogisticRegression()

? ? lr.fit(x_train,y_train)

? ? # 得到訓(xùn)練集返回數(shù)據(jù)

? ? # print("邏輯回歸權(quán)重:",lr.coef_)

? ? # print("邏輯回歸偏置:",lr.intercept_)

? ? # 邏輯回歸測試集預(yù)測結(jié)果

? ? pre_result = lr.predict(x_test)

? ? # print(pre_result)

? ? # 邏輯回歸預(yù)測準(zhǔn)確率

? ? sore = lr.score(x_test,y_test)

? ? print(sore)

? ? # 精確率(Precision)與召回率(Recall)

? ? report = classification_report(y_test,pre_result,target_names=["良性","惡性"])

? ? print(report)

? ? # 查看AUC指標(biāo)

? ? y_test = np.where(y_test>2.5,1,0)

? ? print(y_test)

? ? auc_score = roc_auc_score(y_test,pre_result)

? ? print(auc_score)


if __name__ == '__main__':

? ? logisticregression()


5,總結(jié)?

AUC只能用來評價二分類AUC非常適合評價樣本不平衡中的分類器性能AUC會比較預(yù)測出來的概率辽幌,而不僅僅是標(biāo)簽類AUC指標(biāo)大于0.7增淹,一般都是比較好的分類器?

七,Scikit-learn的算法實現(xiàn)總結(jié)?

scikit-learn把梯度下降求解的單獨分開乌企,叫SGDclassifier和SGDRegressor虑润,他們的損失都是分類和回歸對應(yīng)的損失,比如分類:有l(wèi)og loss, 和 hingle loss(SVM)的加酵,回歸如:比如 均方誤差, 其它的API是一樣的損失端辱,求解并不是用梯度下降的,所以一般大規(guī)模的數(shù)據(jù)都是用scikit-learn其中SGD的方式求解虽画。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荣病,隨后出現(xiàn)的幾起案子码撰,更是在濱河造成了極大的恐慌,老刑警劉巖个盆,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖岛,死亡現(xiàn)場離奇詭異朵栖,居然都是意外死亡,警方通過查閱死者的電腦和手機柴梆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門陨溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绍在,你說我怎么就攤上這事门扇。” “怎么了偿渡?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵臼寄,是天一觀的道長。 經(jīng)常有香客問我溜宽,道長吉拳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任适揉,我火速辦了婚禮留攒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫉嘀。我一直安慰自己炼邀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布吃沪。 她就那樣靜靜地躺著汤善,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票彪。 梳的紋絲不亂的頭發(fā)上红淡,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音降铸,去河邊找鬼在旱。 笑死,一個胖子當(dāng)著我的面吹牛推掸,可吹牛的內(nèi)容都是我干的桶蝎。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丰泊!你這毒婦竟也來了嘉抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤胜茧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻顽,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雹顺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了廊遍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嬉愧。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喉前,靈堂內(nèi)的尸體忽然破棺而出没酣,到底是詐尸還是另有隱情,我是刑警寧澤被饿,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布四康,位于F島的核電站,受9級特大地震影響狭握,放射性物質(zhì)發(fā)生泄漏闪金。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一论颅、第九天 我趴在偏房一處隱蔽的房頂上張望哎垦。 院中可真熱鬧,春花似錦恃疯、人聲如沸漏设。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郑口。三九已至,卻和暖如春盾鳞,著一層夾襖步出監(jiān)牢的瞬間犬性,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工腾仅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乒裆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓推励,卻偏偏與公主長得像鹤耍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子验辞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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