風控中機器學習演算法比較
前言
風控在哪種業務中最有作用
我認為這种放貸業務至少要有兩個主要特徵:
a.業務量巨大,每天的貸款量都在2w以上;
b.金額少,每筆貸款金額都在1k到2k之間。
為了規避壞賬的風險,如果你有兩千萬,不考慮人力成本(互聯網金融貸款業務早就實現了自動化),你會選擇貸給兩萬人,每人一千,還是帶給一千人每人兩萬,自然是前者,更細的分配可以更好的分擔壞賬。
何為風控
所謂風控,就是利用用戶的歷史數據預測其未來的行為,好(會還款)還是壞(不會還款),這些數據一般有:
①客戶的通話數據(電話,簡訊,流量);
②阿里數據(芝麻分,支付寶交易數據);
③徵信數據(同盾分);
④爬蟲數據(手機內部信息,比如通訊錄,app,公積金,社保等);
⑤信用卡數據。
背景
傳統銀行風控都是用邏輯回歸(SAS實現),互聯網金融會用SAS或Python來做風控,SAS沒有SVM,GBDT,RF等演算法的包,所以SAS只能做邏輯回歸,Python有強大的SKlearn來支持機器學習演算法,但機器學習真的有最近吹捧的那樣,在風控領域也神乎其技嗎?
目的
基於相同的數據下不同風控演算法的比較
數據來源
數據是經過woe處理的真實數據,數據共35331,G:B=31323:4280 ,16個特徵.
模型評價指標
JINI = (auc-0.5)*2
演算法比較
結論
對於風控建模,將數據經過WOE處理後,傳統的SAS邏輯回歸結果並不弱於機器學習演算法,但是邏輯回歸演算法的解釋性非常強,可以根據每個特徵的貢獻做成詳細的評分卡,但是SVM,RF,GBDT,神經網路,全是黑箱操作,根本無法解釋,實現也很複雜。但是這些機器學習演算法可以作為邏輯回歸演算法的一個參考,讓風控模型更穩健。
註解
WOE:
WOE的全稱是「Weight of Evidence」,即證據權重。WOE是對原始自變數的一種編碼形式,或者看成一種數據的標準化。要對一個變數進行WOE編碼,需要首先把這個變數進行分組處理(也叫分欄、分箱),然後計算ln(好壞比)。具體參考 數據挖掘模型中的IV和WOE詳解 - 一些雜七雜八的想法 - 博客頻道 - CSDN.NET
我認為WOE的好處有:
①泛化能力強,用WOE可以避免過擬合
②可以完美處理缺失值和異常值
③任何分類問題都能用WOE這套方法解決
代碼
# 參數並不是最優,但已經嘗試了,再怎麼調參也不會使GINI提升0.5%import numpy as npimport pandas as pdfrom sklearn.cross_validation import train_test_splitfrom sklearn.metrics import confusion_matrix#數據導入df = pd.read_csv("C:/Users/Hanyee/Desktop/model_data.csv")x_columns = [x for x in df.columns if x not in "flag"]X = df[x_columns]y = df["flag"]X_train,X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=1)#邏輯回歸from sklearn.linear_model import LogisticRegressionlr = LogisticRegression()lr.fit(X_train,y_train)#preds 就是一個得分是用來畫ROC曲線,從而計算GINIpreds=lr.predict_proba(X_test)prob = pd.DataFrame(lr.predict_proba(X_test),columns=["B","G"])preds = prob["G"]#SVM 模型from sklearn.svm import SVCsvc = SVC(kernel = "rbf",class_weight="balanced",probability = True)svc.fit(X_train,y_train)#preds 就是一個得分是用來畫ROC曲線,從而計算GINIprob = pd.DataFrame(svc.predict_proba(X_test),columns=["B","G"])preds = prob["G"]#RadomForestfrom sklearn.ensemble import RandomForestClassifierrf = RandomForestClassifier(n_estimators = 100 ,min_samples_split = 60 ,max_depth = 3,max_features = 4,class_weight= "balanced")rf.fit(X_train, y_train)#進行模型的訓練#preds 就是一個得分是用來畫ROC曲線,從而計算GINIprob = pd.DataFrame(rf.predict_proba(X_test),columns=["B","G"])preds = prob["G"]t.predict(X_test)#GBDTfrom sklearn.ensemble import GradientBoostingClassifiergbdt = GradientBoostingClassifier(max_depth=2,max_features=12,n_estimators=100,loss = "exponential",learning_rate = 0.1 ,min_samples_leaf = 50))gbdt.fit(X_train,y_train)#preds 就是一個得分是用來畫ROC曲線,從而計算GINIprob = pd.DataFrame(gbdt.predict_proba(X_test),columns=["B","G"])preds = prob["G"]#建立MLPClassifiermlp = MLPClassifier(hidden_layer_sizes = (15,12), activation = "relu", max_iter = 100)mlp.fit(X_train , y_train)#preds 就是一個得分是用來畫ROC曲線,從而計算GINIprob =pd.DataFrame(mlp.predict_proba(X_test),columns=["B","G"])preds = prob["G"]#模型評估from sklearn.metrics import roc_auc_scoreauc = roc_auc_score(y_test, preds)GINI = (auc-0.5)*2#precision recall f1-scorefrom sklearn.metrics import classification_report
推薦閱讀: