逻辑回归模型 python_机器学习-逻辑回归分析(Python)
編輯推薦:
本文首先介紹這兩種方法的區別和聯系,然后對分類方法中的邏輯回歸進行較詳細的說明(包括其基本原理及評估指標),最后結合案例介紹如何利用Python進行邏輯回歸分析。
本文來自于csdn,由火龍果軟件Anna編輯、推薦。
前言
回歸和分類方法是機器學習中經常用到的方法
一、分類與回歸
1.1什么是分類和回歸
區分回歸問題和分類問題:
回歸問題:輸入變量和輸出變量均為連續變量的問題;
分類問題:輸出變量為有限個離散變量的問題。
因此分類及回歸分別為研究這兩類問題的方法。
1.2兩者區別與聯系
區別:從三個維度來對比分類和回歸方法:
聯系:從prediction角度來看,分類模型和回歸模型本質相同,分類模型是將回歸模型的輸出離散化,比如:
1、Logistic Regression 和 Linear Regression
Linear Regression:輸出一個標量wx+b,是連續值,用以處理回歸問題;
Logistic Regression:將標量wx+b通過sigmoid函數映射到(0,1)上,并劃分一個閾值,大于閾值的分為一類,其他歸為另一類,可處理二分分類問題;
對于N分類問題,先得到N組w值不同的wx+b,然后歸一化,比如用softmax函數,最后變成N個類上的概率,可處理多分類問題。
2、Support Vector Regression 和 Support Vector Machine
SVR:輸出wx+b,即某個樣本點到分類面的距離,是連續值,用以處理回歸問題;
SVM:將該距離通過sign(·)函數映射,距離為正的樣本點為一類,為負的是另一類,故為分類問題。
1.3相應有哪些常用方法
常見的分類方法:
邏輯回歸、決策樹分類、KNN(K-近鄰)分類、貝葉斯分類、人工神經網絡、支持向量機(SVM)等
常見的回歸方法:
線性回歸、多項式回歸、逐步回歸等
(常見的聚類方法:K-Means(K均值)聚類等)
二、邏輯回歸分析
2.1邏輯回歸
Logistic回歸主要思想是,根據現有數據對決策邊界建立回歸方程,然后將回歸方程映射到分類函數上實現分類。
2.2原理介紹
Logistic回歸的原理可以理解為以下四步:
1、利用回歸方程表示決策邊界
分類問題的目的是找到決策邊界,因此我們需要找到一個回歸方程來表示這個決策邊界: g(W,X)=W^X
,其中 W 代表權重向量。
2、利用 Sigmoid 函數對回歸關系進行映射
在面對二分分類問題時,可以用1和0分別代表一種情況,此時利用 Sigmoid
函數:
將回歸方程的結果映射到分類函數上,即用 Sigmoid 函數表示擬合函數,這種函數是 S 型的非線性函數。
3、在得到擬合函數后,利用損失函數來評價模型與實際值之間的差異大小
損失函數:
其中 x{i} 代表數據屬性值, y{i} 代表數據實際的分類結果, h{W}(x{i}) 代表利用擬合函數得到的預測值,可以用下圖表示:
損失函數應滿足三個特點,以y{i}=1 時為例:
遞減: h{W}(x{i}) 越小,則懲罰力度應越大;
導數絕對值遞減:h{W}(x{i}) 越趨近于零,該遞減函數的遞減幅度也應該越小;
定義域在[0,1]內時,變化幅度應較大。
因此利用滿足此條件的邏輯函數作為擬合函數。
4、求出損失函數取得極小值時對應的W ,從而得到擬合函數
損失函數求極值利用梯度下降法,本文不做介紹。
2.3評價指標
常見的分類模型性能指標有準確率(precision)、召回率(recall)、ROC曲線等。
1、混淆矩陣(confusion matrix)
包括分類器預測結果:真正TP(true positive)、真負TN(true negative)、假正FP(false
positive)、假負FN(false negative)的數量,其中真正和假負均為正確分類的結果。
2、準確率、真正率及假正率
預測誤差(error,ERR)和準確率(accuracy,ACC)都可以表示誤分類樣本數量的相關信息,
ACC=1-ERR=TN+TP}/{TN+TP+FN+FP} 。
真正率(TPR)和假正率(FPR)也是很有參考價值的性能指標, TPR={TP}/{AP} 表示預測與實際均為正類別樣本數量
與 實際正樣本數量的比值, FPR={FP}/{AN} 表示預測為正類別實際為負類別樣本數量 與 實際負樣本數量的比值。
3、ROC曲線(receiver operator characteristic)
ROC曲線由變量1-Specificity和Sensitivity繪制,其中橫軸1-Specificity=假正率(FPR)、縱軸Sensitivity=真正率(TPR),ROC曲線的對角線表示隨機猜測,若ROC曲線在對角線下表示分類器性能比隨機猜測還差,ROC曲線下的區域面積(area
under the curve,AUC)表示分類模型的性能,反映了模型將正例排在反例前的比例(當AUC=1時,說明將所有正例均排在反例之前)。
原理:
給定 m^{+} 個正例和 n^{-} 個反例,根據學習器預測結果對樣例進行排序,然后將分類閾值設置為最大,即所有樣例均預測為反例,此時真正例率和假正例率均為0,即在坐標(0,0)處標記一個點。
然后,將分類閾值依次設為每個樣例的預測值,即依次將每個樣例劃分為正例。
設前一個標記點坐標為 (x,y) ,當前若為真正例,則對應標記點坐標為
若當前為假正例,則對應標記點坐標為
然后用線段連接相鄰點即得。
意義:
有助于選擇最佳閾值:ROC曲線越靠近左上角,模型查全率越高,最靠近左上角的ROC曲線上的點是分類錯誤最少的最好閾值,其假正例和假反例總數最少。
可以比較不同學習器的性能:將各個學習器的ROC曲線繪制在同一坐標中,直觀比較,越靠近左上角的ROC曲線代表的學習器準確性越高。
AUC同時考慮了學習器對于正例和負例的分類能力,在樣本不平衡的情況下,依然能對分類器做出合理評價(如癌癥預測)。
三、邏輯回歸的Python實現
利用Python中sklearn包進行邏輯回歸分析。
3.1提出問題
根據已有數據探究“學習時長”與“是否通過考試”之間關系,并建立預測模型。
3.2理解數據
1、導入包和數據
#1.導入包
import warnings
import pandas as pd
import numpy as np
from collections import OrderedDict
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
#2.創建數據(學習時間與是否通過考試)
dataDict={'學習時間':list(np.arange(0.50,5.50,0.25)),
'考試成績':[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1]}
dataOrDict=OrderedDict(dataDict)
dataDf=pd.DataFrame(dataOrDict)
dataDf.head()
>>>
學習時間 考試成績
0 ?0.50? 0
1 ?0.75? 0
2 ?1.00? 0
3 ?1.25? 0
4 ?1.50 ?0
2、查看數據
#查看數據具體形式
dataDf.head()
#查看數據類型及缺失情況
dataDf.info()
>>>
RangeIndex: 20 entries, 0 to 19
Data columns (total 2 columns):
學習時間 20 non-null float64
考試成績 20 non-null int64
dtypes: float64(1), int64(1)
memory usage: 400.0 bytes
#查看描述性統計信息
dataDf.describe()
>>>
學習時間 考試成績
count 20.00000 20.000000
mean 2.87500 0.500000
std 1.47902 0.512989
min 0.50000 0.000000
25% 1.68750 0.000000
50% 2.87500 0.500000
75% 4.06250 1.000000
max 5.25000 1.000000
3、繪制散點圖查看數據分布情況
#提取特征和標簽
exam_X=dataDf['學習時間']
exam_y=dataDf['考試成績']
#繪制散點圖
plt.scatter(exam_X,exam_y,color='b',label='考試數據')
plt.legend(loc=2)
plt.xlabel('學習時間')
plt.ylabel('考試成績')
plt.show()
從圖中可以看出當學習時間高于某一閾值時,一般都能夠通過考試,因此我們利用邏輯回歸方法建立模型。
3.3構建模型
1、拆分訓練集并利用散點圖觀察
#1.拆分訓練集和測試集
from sklearn.cross_validation import train_test_split
exam_X =exam_X.values.reshape(-1,1)
exam_y =exam_y.values.reshape(-1,1)
train_X,test_X,train_y,test_y =train_test_split (exam_X,exam_y,train_size=0.8)
print ('訓練集數據大小為', train_X.size,train_y.size)
print ('測試集數據大小為', test_X.size,test_y.size)
>>>
訓練集數據大小為 16 16
測試集數據大小為 4 4
#2.散點圖觀察
plt.scatter (train_X,train_y, color='b', label='train
data')
plt.scatter (test_X,test_y, color='r', label='test
data')
#plt.plot (test_X,pred_y,color='r')
plt.legend(loc=2)
plt.xlabel('Hours')
plt.ylabel('Scores')
plt.show()
2、導入模型
#3.導入模型
from sklearn.linear_model import LogisticRegression
modelLR=LogisticRegression()
3、訓練模型
#4.訓練模型
modelLR.fit(train_X,train_y)
3.4模型評估
1、模型評分(即準確率)
modelLR.score(test_X,test_y)
>>>
0.75
2、指定某個點的預測情況
#學習時間確定時,預測為0和1的概率分別為多少?
#學習時間確定時,預測為0和1的概率分別為多少?
modelLR.predict_proba(3)
>>>
array([[0.36720478, 0.63279522]])
#學習時間確定時,預測能否通過考試?
modelLR.predict(3)
>>>
array([1])
3、求出邏輯回歸函數并繪制曲線
邏輯回歸函數
#先求出回歸函數y=a+bx,再代入邏輯函數中pred_y=1/(1+np.exp(-y))
b=modelLR.coef_
a=modelLR.intercept_
print('該模型對應的回歸函數為:1/(1+exp-(%f+%f*x))'%(a,b))
>>>
該模型對應的回歸函數為:1/(1+exp-(-1.527106+0.690444*x))
邏輯回歸曲線
#畫出相應的邏輯回歸曲線
plt.scatter (train_X,train_y,color='b', label='train
data')
plt.scatter (test_X,test_y,color='r', label='test
data')
plt.plot (test_X,1/ (1+np.exp(-(a+b*test_X))),color='r')
plt.plot (exam_X,1/ (1+np.exp(-(a+b*exam_X))),color='y')
plt.legend(loc=2)
plt.xlabel('Hours')
plt.ylabel('Scores')
plt.show()
4、得到模型混淆矩陣
from sklearn.metrics
import confusion_matrix
#數值處理
pred_y=1/(1+np.exp(-(a+b*test_X)))
pred_y=pd.DataFrame(pred_y)
pred_y=round(pred_y,0).astype(int)
#混淆矩陣
confusion_matrix(test_y.astype(str),pred_y.astype(str))
>>>
array([[1, 1],
[0, 2]])
從混淆矩陣可以看出:
該模型的準確率ACC為0.75;
真正率TPR和假正率FPR分別為0.50和0.00,說明該模型對負例的甄別能力更強(如果數據量更多,該指標更有說服性,而本案例中數據較少,因此受隨機影響較大)。
5、繪制模型ROC曲線
from sklearn.metrics
import roc_curve, auc ###計算roc和auc
# Compute ROC curve and ROC area for each class
fpr,tpr,threshold = roc_curve(test_y, pred_y)
###計算真正率和假正率
roc_auc = auc(fpr,tpr) ###計算auc的值
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='r',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
###假正率為橫坐標,真正率為縱坐標做曲線
plt.plot([0, 1], [0, 1], color='navy', lw=lw,
linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel ('False Positive Rate')
plt.ylabel ('True Positive Rate')
plt.title('Receiver operating characteristic
example')
plt.legend (loc="lower right")
plt.show()
紅線以下部分面積等于0.75,與模型準確率一致
紅線以下部分面積等于0.75,即誤將一個反例劃分為正例。
四、總結
理解回歸與分類的關系:兩者既有區別(三個維度理解),又有聯系(將回歸方程映射到分類函數);
邏輯回歸的參數及其含義:準確率(ACC:模型預測準確度)、真正率(TPR:模型將正例分類正確的能力)、假正率(FPR:模型將負例分類正確的能力)、ROC曲線(可以反映模型正確識別正/負例的能力,也可利用AUC反映模型準確度)
總結
以上是生活随笔為你收集整理的逻辑回归模型 python_机器学习-逻辑回归分析(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.4.在TypeScript中使用JQ
- 下一篇: python切换ip群发邮件_通过 py