逻辑回归三部曲——逻辑回归项目实战(信贷数据+Python代码实现)
??
??邏輯回歸已經在各大銀行和公司都實際運用于業務,已經有很多前輩寫過邏輯回歸。本文將從我實際應用的角度闡述邏輯回歸的由來,致力于讓邏輯回歸變得清晰、易懂。邏輯回歸又叫對數幾率回歸,是一種廣義線性回歸分析模型。雖然名字里有回歸,但其實是分類模型,常用于二分類。
??
??這篇文章是邏輯回歸三部曲中的第三部,介紹sklearn庫中邏輯回歸參數的含義和使用方法,并給出項目實戰的Python代碼。如果想要了解邏輯回歸的來源和原理,參見公眾號中的文章:邏輯回歸由來和邏輯回歸原理
??
文章目錄
- 一、在Python中如何實現邏輯回歸建模
- 1.1 調用sklearn庫
- 1.2 邏輯回歸常用參數詳解
- 二、邏輯回歸模型項目實戰
- 2.1 導入基本庫并設置文件存放路徑
- 2.2 導入待建模的數據
- 2.3 分析數據基本情況
- 2.3.1 用head函數看下數據表頭和前幾行數據
- 2.3.2 用value_counts函數觀測因變量y的數據分布
- 2.3.3 用describe函數查看數據分布
- 2.4 用IV挑選變量
- 2.4.1 用等頻分割的方法計算單個變量的IV值
- 2.4.2 用等頻分割的方法批量計算IV值
- 2.5 建立模型
- 2.5.1 用挑選好的變量建立原始模型
- 2.5.2 把挑選好的變量轉成woe再建立模型
- 2.6 把模型轉成評分卡的形式
??
??
一、在Python中如何實現邏輯回歸建模
??
1.1 調用sklearn庫
from sklearn.linear_model import LogisticRegression as lr??
1.2 邏輯回歸常用參數詳解
??
??邏輯回歸函數中有很多參數,可以根據自己的數據進行相應調整。如果覺得純看參數解釋會有點枯燥,可以先看本文第二部分項目實戰,有需要的時候再回過頭來看這部分。
??
參數說明:
solver:求解邏輯回歸損失函數對應參數的優化算法。str類型,有以下五種算法可以選擇,默值為’lbfgs’。
liblinear:使用開源的liblinear庫實現,內部使用坐標軸下降法來迭代優化損失函數,適用于小數據集。
lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣(海森矩陣)來迭代優化損失函數。
newton-cg:牛頓法家族中的一種,利用損失函數二階導數矩陣(海森矩陣)來迭代優化損失函數。
sag:隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數據多的時候。
saga:線性收斂的隨機優化算法的的變種,適用于大數據集。
??
注1:對于常見的多元邏輯回歸(OvR)和(MvM),一般(MvM)比(OvR)分類相對準確一些,但是liblinear只支持(OvR)不支持(MvM)。這意味著我們需要相對精確的多元邏輯回歸時,不能選擇liblinear,從而也不可以使用優化算法只能選擇liblinear的L1正則。
??
注2:sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候最好不要選擇它。而如果樣本量非常大,比如大于10萬,sag是第一選擇。但是sag不能用于L1正則化(沒有連續導數)。如果你有大量的樣本,同時模型的特征非常多,想要用L1正則化讓模型系數稀疏化,這時就需要進行取舍。要么通過對樣本采樣來降低樣本量 ,要么通過特征篩選提前挑選出重要變量,要么回到L2正則化。
??
penalty:為了解決過擬合問題,給模型加一個懲罰項。可選{‘l1’,‘l2’, ‘elasticnet’,‘none’},默認值為’l2’,如果選擇’none’是不加懲罰項。
如果模型的特征非常多,我們希望一些不重要的特征系數歸為零,從而讓模型系數稀疏化的話,可以使用L1正則化(這個可以考慮用在變量挑選,把使用L1正則化系數為0的變量剔除掉)。penalty參數的選擇會影響我們損失函數優化算法的選擇。即參數solver的選擇。
如果是L1正則化,只能選擇’liblinear’。這是因為L1正則化的損失函數不是連續可導的,而使用{‘newton-cg’,‘lbfgs’,‘sag’}這三種優化算法時都需要損失函數的一階或者二階連續導數,而’liblinear’并沒有這個依賴。如果是L2正則化,4種算法{‘newton-cg’,‘lbfgs’, ‘liblinear’, ‘sag’}都可以選擇。
??
class_weight:由于樣本不平衡,導致樣本不是總體樣本的無偏估計,使得模型的預測能力下降。
為解決樣本不均衡問題,可通過調節樣本權重,使某種類型的樣本量越多則權重越低,樣本量越少則權重越高。可選參數為{dict,‘balanced’},默認值為None,即不調節樣本權重。當class_weight為balanced時,類權重的計算方法為:n_samples/(n_classes*np.bincount(y)),其中n_samples為樣本數,n_classes為類別數,np.bincount(y)會輸出每個類的樣本數。
比如當樣本標簽為[1,1,0,0,0,0,0,0,0,0]時,n_samples為10,n_classes為2,np.bincount(y)為[2,8],類權重為10/(2*[2,8]),結果為[2.5,0.625]。即1的樣本權重為2.5,0的樣本權重為0.625,從而可以讓標簽數量少的樣本占更高的權重。當class_weight為自定義時,對于0,1二元模型,我們可以定義class_weight={0:0.2,1:0.8},這樣類型0的權重為20%,類型1的權重為80%。
什么情況下要對class_weight進行調整?下面舉兩個例子(只是為了舉例說明,不是真實統計數據):
樣本高度失衡。比如在第三方支付公司的欺詐領域,由于欺詐商戶是極少一的部分,絕大部分的商戶是正常商戶。在建立欺詐模型的時候,99901個商戶是正常商戶,99個商戶是欺詐商戶。即0.1%的商戶是欺詐商戶,99.9%的商戶是正常商戶。如果我們不考慮權重,把所有商戶都預測成正常商戶,那么模型的預測準確率為99.9%,但是這種預測結果是沒有任何意義的,沒有抓到任何欺詐商戶。
誤分類代價很高。如果我們將欺詐商戶分類為正常商戶,可能會帶來上萬的損失。這時,在模型上我們可能愿意誤判一些正常商戶,讓監控運營進行甄別,盡可能多地識別出欺詐商戶,減少資金損失。
針對以上兩種情況,我們可以選擇balanced,或者自己確定各個類別的權重,讓類庫自動提高數量少的樣本的權重。提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類劃分到高權重的類別,從而可以解決上述問題。
注1:建模時使用balance這個參數,對于兩端的數據可能會比較均勻。即不使用balance參數在高分區出現的壞樣本占比可能會高于使用balance參數的模型(可能和行業數據有關)。如果想要在高分段準確率更高,要慎用balance參數。
注2:調節樣本權重的方法有兩種,第一種是在class_weight中使用balanced。另一種是在調用fit函數時,通過sample_weight來自己調節每個樣本權重。那么樣本的真正權重是:class_weight*sample_weight。
??
tol:迭代終止的條件。float類型,默認值為0.0001。
比如我們想要求取使得損失函數最小化的參數θ,現用梯度下降法進行求解,每迭代一次,損失函數的值都會減少一點,當迭代前后損失函數的差值小于0.0001時,迭代停止。
??
random_state:隨機數種子。int類型,默認為None。僅在正則化優化算法為sag、liblinear時使用。
比如要隨機產生一個初始值,可以設置種子的值為20,那么每次隨機產生的值都是20這個種子對應的值,可以用此方法復現建模時的數據。
??
C:正則化系數的倒數。float類型,默認值為1.0,該值越小正則化越強。
??
fit_intercept:確定是否有一個**常數項(截距項)**應該添加到邏輯函數中的線性表達式中。bool類型,默認值為True。
??
intercept_scaling:僅在正則化項為‘liblinear’且fit_intercept設置為True時有用。float類型,默認值為1。
??
??
二、邏輯回歸模型項目實戰
??
??項目背景:由于公司發展車貸業務,需要判斷新進來的申請人有多大的概率會逾期,根據逾期的概率和資金的松緊程度決定是否放貸。現在有一批歷史上是否違約的客戶樣本數據(由于數據涉及安全問題,也是職業操守要求,故此數據不是原始數據,是經過處理的)。想根據這批歷史數據訓練邏輯回歸模型,得到模型參數,預測未來新申請的客戶逾期概率。從而決定新申請人是通過、轉人工核驗還是拒絕。
??
2.1 導入基本庫并設置文件存放路徑
??
從Python中導入最常使用的數據處理庫,并設置數據的存放的地址。
??
2.2 導入待建模的數據
??
data = pd.read_csv('testtdmodel.csv',sep=',',encoding='gb18030')注:由于數據中存在中文,如果不使用encoding對編碼進行申明會報如下錯誤:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 2: invalid start byte把endcoding的值設置為gb18030或gbk可以解決此類問題,成功導入數據。
??
2.3 分析數據基本情況
??
2.3.1 用head函數看下數據表頭和前幾行數據
??
??我選擇看前兩行的數據,如果括號里為空默認展示前五行的數據,可以根據需要把2改為你想展示的行數。也可以用tail函數展示后幾行數據。
??
結果:
??
2.3.2 用value_counts函數觀測因變量y的數據分布
??
??在信貸中,有些客戶因為忘記了還款日期、或者資金在短期內存在缺口(不是惡意不還),可能會導致幾天的逾期,在催收后會及時還款。故一般不把歷史逾期不超過x天(根據公司的實際業務情況和數據分析結果得出)的客戶定義為壞客戶(這里的壞不是壞人的意思,純粹指逾期超過x天的客戶)。在本文把逾期超過20天的客戶標簽y定義為1(壞客戶),沒有逾期和逾期不超過20天的客戶標簽y定義為0(好客戶)。
??
結果:
??本文總計樣本數量為7252,其中7155個樣本是好客戶,97個樣本是壞客戶。說明0和1的分布很不均勻,我們統計一下占比:
??
??發現0的占比達到了98.6%,1的占比不到2%,這是典型的樣本不均衡問題。如果我們把所有的客戶都預測成好客戶,模型可以達到98.6%的準確率。但是這個結果是毫無意義的,因為模型沒起到區分逾期和非逾期客戶的作用,沒有達到建模的目的。可以用前文提到的class_weight和sample_weight對權重進行調整,讓標簽是1的樣本占更多的權重。
??
??實際中很多問題可能都是數據分布不均勻的,比如患病的人數和不患病的人數、欺詐商戶和正常商戶、逾期的客戶和不逾期的客戶等等。不過這些都是正常現象,想一想如果逾期客戶數超過了不逾期的人數,公司早就倒閉了好吧。那么建模的目的就是想把錢盡可能多地貸給能按期還錢的客戶,盡可能多地拒絕可能會逾期的客戶。這樣公司的錢才能掙得更多的利息,產生更少的壞賬,總收益才能最大化。
??
2.3.3 用describe函數查看數據分布
??
??一般建模之前要看下數據的缺失情況、檢查一下數據是不是存在錯誤。如果數據存在缺失值考慮刪除這個樣本,或用0值或中位數等統計變量去填充。如果刪除存在缺失值的樣本,模型用到的信息量就會減少。如果數據存在錯誤,考慮從源頭糾正錯誤數據或刪除該樣本。在Python中可以用describe()函數方便地獲取樣本數量,變量均值,變量最小值、25%分位數、50%分位數、75%分位數、最大值等信息。
??
結果:
??
那根據describe得到的結果可以在建模中做什么?
??
??
??
??
??
??對外拓展感覺有說不完的注意事項,本文著重講邏輯回歸的實現,故后文不再在細枝末節處做過多說明。有小細節需要注意的地方,我會在后續文章中分專題詳細闡述。在變量缺失值處理好,并驗證數據沒有問題后。可以把數據集割分成訓練集、測試集、驗證集。由于本文中的標簽1只有97個,再細分可能出現1過少,導致信息過少,不滿足統計特性。故不區分訓練集、測試集、驗證集,直接把所有數據都當成訓練集。接下來我們一起挑選重要變量,建立邏輯回歸模型。
??
2.4 用IV挑選變量
??
??挑選變量的方法多種多樣,可以用IV、GBDT、隨機邏輯回歸、隨機森林、逐步回歸、cluster等等(我在建模中實際用到)。本文采用信貸中最常用的方法IV進行闡述,其它方法會在本公眾號后續挑選變量專題中進行詳細闡述。對于用IV挑選變量,在風控建模中的IV和WOE一文中有詳細的闡述,感興趣的可以仔細閱讀一遍,本文只引用計算函數。
??
2.4.1 用等頻分割的方法計算單個變量的IV值
??
等頻計算IV的函數如下:
先用如下語句整理好原始自變量和因變量:
columns_x =['7天內申請人在多個平臺申請借款','1個月內申請人在多個平臺申請借款','3個月內申請人在多個平臺申請借款','7天內借款人手機申請借款平臺數','1個月內借款人手機申請借款平臺數','3個月內借款人手機申請借款平臺數','7天內借款人身份證申請借款平臺數','1個月內借款人身份證申請借款平臺數','3個月內借款人身份證申請借款平臺數','7天內關聯P2P網貸平臺數','1個月內關聯P2P網貸平臺數','3個月內關聯P2P網貸平臺數','7天內申請人關聯融資租賃平臺數','1個月內申請人關聯融資租賃平臺數','3個月內申請人關聯融資租賃平臺數','1個月內申請人關聯一般消費分期平臺數','3個月內申請人關聯一般消費分期平臺數','風險名單占比','一度關聯節點個數','二度關聯節點個數','一度風險名單個數','二度風險名單個數','一度風險名單占比','二度風險名單占比','X3個月內申請人手機號作為第二聯系人手機號出現的次數','X3個月內申請人手機號作為前三聯系人手機號出現的次數','是否命中法院執行模糊名單','是否命中法院結案模糊名單','是否命中手機風險關注名單','是否命中身份證風險關注名單','命中中風險關注名單筆數','客戶異常借款筆數','信用異常筆數','執行標的','申請人執行標的是否超過100000','3個月手機號關聯身份證數','3個月身份證關聯手機號數','三個月銀行相關平臺數' ] #自變量名稱 X = data[columns_x] #生成自變量數據框 Y = data['y'] #生成因變量y再用調用等頻法算IV的函數,計算單個變量的IV值,并打印結果。
IV,cut,WOEi,d4 = bin_frequency(X['1個月內申請人在多個平臺申請借款'], Y) print('IV=',IV) d4得到結果:
2.4.2 用等頻分割的方法批量計算IV值
??
??在變量one-by-one分析之前可以用等頻切分的方法,快速算出所有變量的IV值,一般挑選IV值大于0.02的變量進入后續建模。可以用如下語句批量計算變量的IV值,并打印每個變量的分箱woe情況:
得到結果:
??
可以用如下語句把所有變量的IV值匯總輸出到csv文件中:
??
得到結果(部分截圖):
??
??在用IV值大于0.02的規則挑選完變量后可以用相關性、vif、逐步回歸等方法進一步挑選變量。注:IV值多少可以進入模型,需要根據公司的數據情況進行調整,一般IV值低于0.02的變量幾乎沒有預測效果。如果很多變量的IV值都很高,閾值可以相應提高。如果變量整體的IV值都不高,根據業務邏輯也可以加一些IV值不是很高的變量測試模型效果。挑選好變量后可以調用sklearn中的lr函數建模。
??
2.5 建立模型
2.5.1 用挑選好的變量建立原始模型
??
columns_model = ['1個月內借款人身份證申請借款平臺數','7天內關聯P2P網貸平臺數','3個月內關聯P2P網貸平臺數','3個月手機號關聯身份證數','3個月內申請人關聯融資租賃平臺數','二度風險名單個數','是否命中身份證風險關注名單','原始分','一度風險名單個數']X_model = data[columns_model] #生成入模自變量y = data['y'] #生成入模因變量 from sklearn.linear_model import LogisticRegression as lr #導入邏輯回歸庫lr_model_1 = lr() #調用邏輯回歸lr_model_1_y = lr_model_1.fit(X_model, y) #用樣本數據訓練邏輯回歸模型y_proba_model_1 = lr_model_1_y.predict_proba(X_model) #用訓練好的模型預測y_proba_model_1注:本文為了不泄露公司的數據信息,挑選的變量已經經過數據替換,不是真實數據,只是為了數據展示。
得到結果:
可以用如下語句得到模型的系數和截距:
??
得到結果:
??
??把擬合好的系數和截距代入邏輯回歸函數中,得到的結果就是逾期的概率值。以上邏輯回歸模型的訓練直接采用默認參數,沒有考慮樣本不均衡的問題,可以在邏輯回歸模型中引入參數class_weight,即lr(class_weight=‘balanced’)讓因變量1的權重變高,0的權重變低。
??
2.5.2 把挑選好的變量轉成woe再建立模型
??
??在建完原始模型后一般要把變量轉成woe后,再用邏輯回歸訓練一次變量,得到相應的系數。因為把變量轉成woe后變量具有更好的魯棒性,模型會更加穩定。比如年齡這個變量,如果不分箱轉成woe,在客戶從25歲變到26歲時評分可能完全不一樣。而轉成woe后變量是一個一個的小箱子,在箱子內值的變動不會對模型分產生影響。如果25到26剛好在一個箱子里,這個人的評分不會因為年齡的改變而發生變化。由于篇幅問題,在本文中只給轉出轉woe后建模的結果:
??
??
2.6 把模型轉成評分卡的形式
??
??把變量轉成woe后,可以根據分箱情況和邏輯回歸的結果,通過轉換把變量變成評分卡的形式:
??
??
??其實在建模過程中,特征工程、數據準備、數據預處理、變量篩選、模型建立、模型評價、模型上線都是至關重要的。所有小的模塊都會在后續文章中陸續發布,歡迎持續關注。為了更清晰地理解邏輯回歸的求解和使用,建議對邏輯回歸的推導過程有一個大致的了解。而且理解了邏輯回歸的原理,有助于其它機器學習模型的學習。
??
??一直對邏輯回歸,這個風控建模中必不可少的一員,抱有很大的敬意。邏輯回歸三部曲的文章也從2月份斷斷續續準備到了4月份,今天終于和大家分享第三部-邏輯回歸項目實戰,如有偏頗的地方,或者有不懂的地方,大家可以加我的微信 阿黎逸陽進行咨詢。本文純屬技術分享文檔,幫助想要從事風控建模的朋友了解邏輯回歸,所有文字都非商業用途,如果需要本文項目實戰的數據可以到公眾號中私信我,可以免費獲取。
??
??之前由于工作需要,自己看了很多資料把邏輯回歸的結果轉成了評分卡的形式,寫完了Python的實現函數,在接下來的時間我會好好總結評分卡的內容,爭取評分卡的文章也早日和大家見面。
??
參考文獻
你可能感興趣:
用Python繪制皮卡丘
用Python繪制詞云圖
邏輯回歸三部曲——邏輯回歸和sigmod函數的由來
邏輯回歸三部曲——邏輯回歸(logistics regression)原理-讓你徹底讀懂邏輯回歸
Python畫好看的星空圖V2版——添加背景圖片和音樂
總結
以上是生活随笔為你收集整理的逻辑回归三部曲——逻辑回归项目实战(信贷数据+Python代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win2012 磁盘阵列 介绍和实操
- 下一篇: python中re.compile()用