您當前的位置:首頁 > 動漫

傳統的邏輯迴歸演算法仍然金槍不倒

作者:由 韓琦兒 發表于 動漫時間:2017-05-27

前言

好久沒更新文章了,我的藉口是:最近換了份工作,很多新東西需要學

目的

對傳統的風控模型演算法——邏輯迴歸演算法和常見機器學習演算法進行比較,發現優缺點

資料來源

保密(真實資料需要保密)

資料類別主要有

①客戶的通話資料(電話,簡訊,流量);

②阿里資料(芝麻分,支付寶交易資料);

③徵信資料(同盾分);

④爬蟲資料(手機內部資訊,比如通訊錄,app,郵件等)

⑤信用卡資料

分析

風控模型簡單理解,就是根據已有的資料,來預測這個客戶未來貸款的還款情況,因為還款情況只有還款(flag = 1),不還款(flag = 0),所以不能用線性迴歸演算法,傳統做法是採用邏輯迴歸演算法,其實原理都一樣

我們都假設

y = α + βx + ζ

①線性迴歸時我們假設ζ服從正態分佈

②邏輯迴歸時我們假設ζ服從logistic分佈

注:logistic分佈函式如下:

傳統的邏輯迴歸演算法仍然金槍不倒

傳統的邏輯迴歸演算法仍然金槍不倒

定義域是R,值域是[0 , 1],典型的機率空間,

建模過程

一。提取特徵(需要了解業務邏輯&建模經驗)

二。資料清洗(缺失值,異常值)

三。資料轉化(將資料轉化為WOE值)

四。資料建模 (邏輯迴歸,逐步迴歸)

五。模型評價(AUC,JINI)

六。資料模擬(證明用你的模型比現有的模型要好,一般是保證透過率的情況下看逾期率能降低多少)

注:

WOE:WOE的全稱是“Weight of Evidence”,即證據權重。WOE是對原始自變數的一種編碼形式。要對一個變數進行WOE編碼,需要首先把這個變數進行分組處理(也叫分欄、分箱)。

我認為WOE的好處有:

①泛化能力強,用WOE基本上可以避免過擬合的情況

②可以完美處理缺失值和異常值

③可以處理字元值

④任何分類問題都能用WOE這套方法解決

GBDT演算法(Gradient Boosting Decision Tree)

gbdt演算法就是決策樹的增強版,原理是根據梯度下降計算損失函式的最小值(這種原理簡單,計算複雜非常適合計算機處理),GBDT本來就是黑箱演算法,解釋性超差。原理在此不贅述了,後面給出Python程式碼

GBDT和LR的比較

經過多次對相同真實資料的建模,得到GBDT與傳統邏輯迴歸(LR)比較

①在特徵數量較小(<5)時,GBDT(用原始值,不用WOE值)得出的JINI值比LR(用WOE值)要高不少,原因是GDBT考慮到了特徵之間的互動,而LR無法利用特徵之間的互動

②特徵數量較大(>20)時,GBDT的效果就不明顯了,可能是由於高數量特徵的貢獻大於特徵之間的互動

總結

①LR解釋性強,但特徵數量較少(<5)時,預測效果沒有GBDT好;

②GBDT演算法應用簡單,資料輸入,結果輸出,全是黑箱操作,解釋性差,在特徵數量較大(>20)時,比LR的效果並不強多少,所以在風控領域,萬金油般的傳統演算法邏輯迴歸依然屹立不倒。

GBDT程式碼

import numpy as np

import pandas as pd

from sklearn。ensemble import GradientBoostingRegressor

from sklearn。cross_validation import train_test_split

df = pd。read_csv(‘C:/Users/Hanyee/Desktop/temp0518_reg。csv’)

#temp0518_reg。csv中Y是‘gbflag’,其他列都是自變數(特徵)

x_columns = [x for x in df。columns if x not in ‘gbflag’]

X = df[x_columns]

y = df[‘gbflag’]

gbdt=GradientBoostingRegressor(

loss=‘ls’

, learning_rate=0。1

, n_estimators=200

, subsample=1

, min_samples_split=50

, min_samples_leaf=10

, max_depth=4

, init=None

, random_state=None

, max_features=4

, alpha=0。9

, verbose=0

, max_leaf_nodes=None #定義了決定樹裡最多能有多少個終點節點

, warm_start=False

X_train,X_test, y_train, y_test = train_test_split(X,y,test_size=0。4, random_state=0)

gbdt。fit(X_train,y_train)

preds = gbdt。predict(X_test)

#模型評估

from sklearn。metrics import roc_auc_score

auc= roc_auc_score(y_test, preds)

JINI_reg = (auc-0。5)*2

JINI_reg

端 午 快 樂

標簽: woe  GBDT  演算法  test  資料