根據已知用戶違約數據,預測用戶是否違約。
(參考了各種資料後純個人理解個人認爲已經是很通俗的白話文,可能中間與官放的原理講解會有些出入,此處經過了個人的理解翻譯,主要幫助瞭解一下原理,需要真正瞭解所有推導過程以及數學公式,還是需要另外搜一下其他大神的講解哦,菜鳥起步望多包涵,多指教):
①線性迴歸推導原理:
邏輯迴歸與線性迴歸有很多相似之處,線性迴歸——已知多個自變量矩陣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的包裏面均已經包裝
好,調用就行啦,如果感興趣的童鞋,建議還是去找純原理的文章學習觀摩一下,個人統計學和數學學得不好,純屬個
人理解大概原理,使用的都是先人研究的成果。
數據源:
邏輯迴歸過程:①源數據保留最後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()
不同的模型但看一個綜合評分是片面的,需要結合業務去看,比如看待銀行違約的行爲,要儘可能的規避違約的風險,那麼我們的模型出來的預測結果,寧願錯判段不違約的爲違約,進行用戶違約前做預警處理,也不願放過每一個違約的可能,一旦用戶違約就會對銀行造成損失,所以實際模型中需要深刻的理解混淆矩陣的意義,模型纔是能是最適合業務的。
準確率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