信用違約判斷邏輯迴歸實例--LogisticRegression

1、目標

根據已知用戶違約數據,預測用戶是否違約。


2、邏輯迴歸模型知識準備

模型目標:    分類0-1, 得到指定屬性歸類爲1有多大概率,歸類爲0 有多大概率。--用於分類。
適用:            經典二分類問題
二元邏輯迴歸:迴歸結果分類0-1兩類;
多元邏輯迴歸:迴歸結果分類兩類以上。


邏輯迴歸推導原理

(參考了各種資料後純個人理解個人認爲已經是很通俗的白話文,可能中間與官放的原理講解會有些出入,此處經過了個人的理解翻譯,主要幫助瞭解一下原理,需要真正瞭解所有推導過程以及數學公式,還是需要另外搜一下其他大神的講解哦,菜鳥起步望多包涵,多指教):

①線性迴歸推導原理:

邏輯迴歸與線性迴歸有很多相似之處,線性迴歸——已知多個自變量矩陣X,通過尋求一組最優的參數矩陣θ,建立一個迴歸方程(模型),該模型直線將盡可能多的已知的點-相當於Y【Hθ(X)】值。


    A).    理論完美線性模型經過多有所有y點>>>Hθ(X)=θ.T * X  

          (相當於多元方程組 y=ax0+bx1+cx2 ,abc組合就是θ參數組合-θ.T爲矩陣轉置,X0等變量就是一列一列的矩陣)

    B).    實際是不可能畫出完全擬合(相當於穿過的意思)所有已知的y值點,那麼求出來的模型和時間y值必會有一個誤差那麼

             實際y值 = 預測y值 +誤差 =>y=Hθ(X)+損失值=>

    C).    我們的目標是經過儘可能多的點,那麼我們希望誤差值就是越小越好,誤差值用已知的x、y值替代,求誤差極小值,

             經過一系列的各種複雜的數據公式原理用似然以及求導等推導普通最小二乘法

            最後大神推斷出θ矩陣值=


#線性迴歸實際解決中:因求矩陣逆有條件限制,當逆矩陣不存在則找不出精確的θ,故目前θ一般用梯度機器迭代(理解即可:在求誤差最小值的過程中,通過設置θ初始組合和自定義距離以及迭代次數等,求一段距離範圍內的最大/最小值,每次迭代不滿足一定條件就更新θ值在繼續直到滿足條件。)的方式。在Python中只要學會調用模型包進行訓練即可,推導原理可以幫助更加深入的理解模型的出生背景。


①邏輯迴歸推導原理:

(邏輯迴歸看了很多的推導的原理,總是有種說不出的的感覺,感覺比線性迴歸原理好難理解好多- _ -||)

邏輯迴歸--求概率=>》實際上是預測z=某個值的時候概率有多大,概率大於0.5時分類爲1,小與0.5時分類爲0,z相當於線性迴歸的Hθ(X)

    a).    先了解一下sigmoid函數,橫座標【負無窮~正無窮】,這裏個人理解是已知一堆已知變量,構造出一個線性迴歸預測一個

            值z,再求sigmoid(z)=求概率。概率值y=

            

    b).    求解方法與線性迴歸基本相似,均是尋找一組最優的θ值,θ和X組合求出來的概率最大化。而此處,θ的求解應用了梯度

            下降法。目前求解過程有用梯度下降法、隨機梯度上升、改進梯度上升等方法。這些方法再Python的包裏面均已經包裝

            好,調用就行啦,如果感興趣的童鞋,建議還是去找純原理的文章學習觀摩一下,個人統計學和數學學得不好,純屬個

            人理解大概原理,使用的都是先人研究的成果。


邏輯迴歸Python實例

數據源:

邏輯迴歸過程:①源數據保留最後20條記錄做爲測試集,其他數據作爲訓練集,求分類模型

                        ②源數據先全部採用隨機邏輯迴歸模型,篩選出於違約相關性最大的屬性,再用這些屬性值進行①分類;

代碼如下:

#!/usr/bin/evn python
# -*-coding:utf8 -*-
import pandas as pd

# #初始化輸入文件
inputfile = 'F:\\kettle\\tbsales\\pyhon_seana\\chapter5\\demo\\data\\bankloan.xls'
outputfile = 'F:\\kettle\\tbsales\\pyhon_seana\\testresult\\bankloan_test2.xls'
#
data = pd.read_excel(inputfile,sheet_name='bankloan',header=0)
x = data.iloc[:,:8] #獲取所有行,8列數據([m:n] 表示索引編號m開始取,找到索引n,但是不包含索引n對應的數據),並生成一個矩陣。
y = data.iloc[:,8]#.as_matrix() #獲取所有行,編號=8的列數據,第9列,並生成一個矩陣。

x1 = data.iloc[:-20,:8].as_matrix()
y1 = data.iloc[:-20,8].as_matrix()
x1_test = data.iloc[-20:,:8].as_matrix()
y1_test = data.iloc[-20:,8].as_matrix()

def logic_train(a, b, a_test, b_test):
    from sklearn.linear_model import LogisticRegression as LR
    from sklearn.metrics import classification_report,confusion_matrix
    lr = LR(penalty='l2',solver='newton-cg',multi_class='ovr') #建立邏輯迴歸模型
    lr.fit(a, b) #用篩選後的特徵數據訓練模型
    pred_test = lr.predict(a_test)
    print(u'邏輯迴歸模型訓練結束')
    print('模型的準確率爲:{}'.format(lr.score(a,b)))
    print(classification_report(b_test, pred_test))
    print('y_test:   ', b_test)
    print('pred_test:', pred_test)

def logic_choose_train(a, b):
    '''  先篩選特徵,再進行邏輯迴歸分析  :param a: x  :param b: y  :return: 返回迴歸結果以及模型評價   '''  from sklearn.linear_model import RandomizedLogisticRegression as RLR #隨機邏輯迴歸模型,專門用來篩選特徵變量
    RLR = RLR()
    RLR.fit(a, b)
    RLR.get_support() #獲取特徵篩選結果,也可以通過.scroes_方法獲取各特徵的分數
    # print(RLR.scores_)
    # datax  = a.iloc[:,:8]
    print('有效特徵爲:{}'.format(','.join(a.columns[RLR.get_support()])))
    x = a[a.columns[RLR.get_support()]].iloc[:-20,:]
    y = b.iloc[:-20].as_matrix()
    x_test = a[a.columns[RLR.get_support()]].iloc[-20:,:]
    y_test = b.iloc[-20:].as_matrix()
    logic_train(x, y, x_test, y_test)
logic_choose_train(x,y)
print('我是分割線'.center(50,'='))
logic_train(x1,y1,x1_test,y1_test)
運行結果:



模型評價的含義:

#from sklearn.metrics import confusion_matrix

#tn, fp, fn, tp = confusion_matrix(y_test, y_pred=pred_test).ravel()

不同的模型但看一個綜合評分是片面的,需要結合業務去看,比如看待銀行違約的行爲,要儘可能的規避違約的風險,那麼我們的模型出來的預測結果,寧願錯判段不違約的爲違約,進行用戶違約前做預警處理,也不願放過每一個違約的可能,一旦用戶違約就會對銀行造成損失,所以實際模型中需要深刻的理解混淆矩陣的意義,模型纔是能是最適合業務的。


sklearn.metrics.confusion_matrix (混淆矩陣-TP-TN-FP-FN)
TP: 預測爲1(Positive),實際也爲1(Truth-預測對了)
TN: 預測爲0(Negative),實際也爲0(Truth-預測對了)
FP: 預測爲1(Positive),實際爲0(False-預測錯了)
FN: 預測爲0(Negative),實際爲1(False-預測錯了)
(P=1,N=0,T=分類正確,F分類錯誤)
總的樣本個數爲:TP+TN+FP+FN。


    準確率Accuracy :

                                    (預測正確的樣本數)/(總樣本數)=(TP+TN)/(TP+TN+FP+FN)

    精度/查準率Precision: 

                                    (預測爲1且正確預測的樣本數)/(所有預測爲1的樣本數) = TP/(TP+FP)  

                                    所有預測的1中,正確的預測的比例

    查全率Recall :

                                    (預測爲1且正確預測的樣本數)/(所有真實情況爲1的樣本數) = TP/(TP+FN)

                                    所有真正的1中,預測正確了的比例

     F1 :                             

                                        2*(Precision*Recall)/(Precision+Recall)

                                       綜合Precision/Recall