本文是《智能風控、算法和工程實踐》第五章學習筆記。
幸存者偏差
由于風控模型的拒絕屬性,會導緻幸存者偏差和樣本不均衡兩個問題。 幸存者偏差是指,每次模型叠代時,使用的樣本都是被前一個模型篩選過的,隻有高于前一版模型分數阈值的樣本,才可以進入當前模型訓練,于是樣本空間就會不完備。進入模型的樣本就是幸存者,它們不攜帶或者很少攜帶被拒絕的樣本的信息,導緻樣本逐漸偏離真實分布。
于是随着模型叠代,區分能力強的特征被弱化,甚至對模型起到完全相反的作用。想要修正有偏差的信息,就需要用無偏差的數據重新訓練模型。因此核心問題就是如何獲取無偏差的數據。 傳統的解決方法就是使用拒絕推斷為拒絕樣本添加僞标記和權重。拒絕推斷的方法見: 拒絕推斷
書中介紹的方法是一些其他的機器學習方法,具體有:
增量學習生成對抗網絡——GAN模型高斯混合模型——GMM算法 這裡就不再深入學習以上的算法了,因為實際工作中用不用得到拒絕推斷還是個問号。
樣本不均衡
在風控場景下,負樣本的占比要遠遠小于正樣本的占比。當不同類别的樣本量有較大差異時,在梯度下降的過程中就會很難收斂到最優解。因為在每一次梯度下降的過程中,負樣本所貢獻的信息有限,導緻模型無法很好地學習負樣本。通俗說就是,負樣本越多,模型的區分效果通常會越好,KS值會越大。
代價敏感加權方案
下探是解決不均衡問題最直接的方法。就是在拒絕域中随機接收一些樣本,以此來積累負樣本。但這樣風險較高,會犧牲一部分收益,而且較難量化每次下探的量。
對少數類樣本進行加權處理,使模型進行均衡訓練,即代價敏感加權方案,又叫作展開法。在邏輯回歸中,可以通過參數class_weight=balanced調整正負樣本的權重,大多數情況下樣本加權可以增強模型的表現。
類權重的計算方法如下:
$$weight=\frac{n\_samples}{n\_classes*np.bincount(y)}$$
其中,n_samples為樣本數,n_classes為類别數量,np.bincount(y)會輸出每個類别的樣本數。
插值過采樣方案
插值過采樣方案又叫作SMOTE算法,是機器學習中常用的采樣方法。基本思想就是在現有少數類樣本之間進行插值,人工合成新樣本。SMOTE算法的原理如下圖:
為了解決SMOTE算法的過拟合問題,Adaptive Synthetic Sampling方法被提出,主要包括:Borderline-SMOTE和Adaptive Synthetic Sampling(ADA-SYN)算法。
Borderline-SMOTE 對靠近邊界的minority樣本創造新數據。其與SMOTE的不同是:SMOTE是對每一個少數類樣本産生綜合新樣本,而Borderline-SMOTE僅對靠近邊界的少數樣本創造新數據。 Borderline-SMOTE算法隻對近鄰中多數類樣本大于少數類樣本的點進行合成新樣本。但是如果一個樣本的近鄰都是多數類樣本, 則會被認為是噪聲,不合成新樣本。
ADA-SYN 根據多數類和少數類的密度分布,動态改變權重,決定要生成多少少數類的新數據。
基于聚類的随機采樣(CBO) 可以用來解決類内不平衡問題,主要利用的聚類的方法。具體的過程如下:
随機選擇K個樣本作為K個簇,并且計算K類樣本在特征空間的平均值,作為聚類中心;
對于剩下的每一個樣本,計算它和K個聚類中心的歐氏距離,根據歐式聚類将其分配到最近的類簇中;
更新每個簇的聚類中心,直到所有的樣本都用完;
CBO會使用過采樣的方法填充多數類和少數類的類簇,所以每個類的樣本數相同。少數類的樣本個數為多數類樣本除以少數類的類别數。即上圖中60/2=30。
過采樣算法實戰
由于SMOTE算法是基于樣本空間進行插值,會放大數據集中的噪聲和異常,因此要對訓練樣本進行清洗。這裡使用lightgbm對數據進行拟合,将預測結果較差的樣本權重降低,并且不參與SMOTE算法的插值過程。列出核心代碼:
deflgb_test(train_x,train_y,test_x,test_y): clf=lgb.LGBMClassifier(boosting_type=gbdt, objective=binary, metric=auc, learning_rate=0.1, n_estimators=24, max_depth=4, num_leaves=25, max_bin=40, min_data_in_leaf=5, bagging_fraction=0.6, bagging_freq=0, feature_fraction=0.8, ) clf.fit(train_x,train_y,eval_set=[(train_x,train_y),(test_x,test_y)],eval_metric=auc) returnclf,clf.best_score_[valid_1auc], lgb_model,lgb_auc=lgb_test(train_x,train_y,test_x,test_y) feature_importance=pd.DataFrame({name:lgb_model.booster_.feature_name(), importance:lgb_model.feature_importances_}).sort_values(by=[importance],ascending=False) pred=lgb_model.predict_proba(train_x)[:,1] fpr_lgb,tpr_lgb,_=roc_curve(train_y,pred) print(abs(fpr_lgb-tpr_lgb).max()) pred=lgb_model.predict_proba(test_x)[:,1] fpr_lgb,tpr_lgb,_=roc_curve(test_y,pred) print(abs(fpr_lgb-tpr_lgb).max()) pred=lgb_model.predict_proba(evl_x)[:,1] fpr_lgb,tpr_lgb,_=roc_curve(evl_y,pred) print(abs(fpr_lgb-tpr_lgb).max())
sample=x[feature_lst] sample[bad_ind]=y sample[pred]=lgb_model.predict_proba(x)[:,1] sample=sample.sort_values(by=[pred],ascending=False).reset_index() sample[rank]=np.array(sample.index)/75522 defweight(x,y): ifx==0andy0.1: return0.1 elifx==1andy0.7: return0.1 else: return1 sample[weight]=sample.apply(lambdax:weight(x.bad_ind,x[rank]),axis=1) deflr_wt_predict(train_x,train_y,evl_x,evl_y,weight): lr_model=LogisticRegression(C=0.1,class_weight=balanced) lr_model.fit(train_x,train_y,sample_weight=weight) y_pred=lr_model.predict_proba(train_x)[:,1] fpr_lr,tpr_lr,_=roc_curve(train_y,y_pred) train_ks=abs(fpr_lr-tpr_lr).max() print(train_ks:,train_ks) y_pred=lr_model.predict_proba(evl_x)[:,1] fpr_lr,tpr_lr,_=roc_curve(evl_y,y_pred) evl_ks=abs(fpr_lr-tpr_lr).max() print(evl_ks:,evl_ks) lr_wt_predict(sample[feature_lst],sample[bad_ind],evl_x,evl_y,sample[weight])
這裡的思想就是使用集成模型對數據做異常點檢測,将難以辨别的樣本視為噪音。可以理解為大神都做不對的題目,就不讓普通學員做了。異常點檢測的邏輯為:低分段錯分比例和高分段錯分比例。 下面做基于borderline1的smote算法做過采樣。隻對weight=1的樣本進行過采樣。
osvp_sample=sample[sample.weight==1].drop([predindexweight],axis=1) osnu_sample=sample[sample.weight1].drop([predindex,],axis=1) train_x_osvp=osvp_sample[feature_lst] train_y_osvp=osvp_sample[bad_ind]
deflr_predict(train_x,train_y,evl_x,evl_y): lr_model=LogisticRegression(C=0.1,class_weight=balanced) lr_model.fit(train_x,train_y) y_pred=lr_model.predict_proba(train_x)[:,1] fpr_lr,tpr_lr,_=roc_curve(train_y,y_pred) train_ks=abs(fpr_lr-tpr_lr).max() print(train_ks:,train_ks) y_pred=lr_model.predict_proba(evl_x)[:,1] fpr_lr,tpr_lr,_=roc_curve(evl_y,y_pred) evl_ks=abs(fpr_lr-tpr_lr).max() print(evl_ks:,evl_ks) returntrain_ks,evl_ks fromimblearn.over_samplingimportSMOTE,RandomOverSampler,ADASYN smote=SMOTE(k_neighbors=15,kind=borderline1,m_neighbors=4,n_jobs=1, out_step=deprecated,random_state=0,ratio=None, svm_estimator=deprecated) rex,rey=smote.fit_resample(train_x_osvp,train_y_osvp) print(badpctn:,rey.sum()/len(rey)) df_rex=pd.DataFrame(rex) df_rex.columns=feature_lst df_rex[weight]=1 df_rex[bad_ind]=rey df_aff_ovsp=df_rex.append(osnu_sample) lr_predict(df_aff_ovsp[feature_lst],df_aff_ovsp[bad_ind],evl_x,evl_y)
采樣後的KS值會有一定的提升,且過拟合的風險不會很大。
半監督學習方案
SMOTE算法所産生的新樣本仍然是基于樣本産生的,并沒有為模型引入拒絕樣本信息。通過半監督學習對拒絕樣本進行預測,自動利用無标簽樣本提升學習性能。 書中介紹的兩種半監督學習模型是半監督支持向量機和标簽傳播算法。
S3VM
半監督支持向量機。基本思想是在不考慮無标簽樣本的情況下嘗試尋找最大間隔劃分超平面。
LP
标簽傳播算法,是一種基于圖的半監督學習方式。LP算法包括兩個步驟:
構造相似矩陣通過相似度進行傳播 下面通過一個例子介紹LP算法的應用。首先自動生成200個弧形分布的數據點,然後指定其中兩個點的标簽。使用LP算法根據有标簽樣本在樣本空間的位置進行标簽傳遞,最終使得每個樣本都有标簽。 importnumpyasnp importmatplotlib.pyplotasplt fromsklearn.semi_supervisedimportlabel_propagation fromsklearn.datasetsimportmake_moons #生成弧形數據 n_samples=200 X,y=make_moons(n_samples,noise=0.04,random_state=0) outer,inner=0,1 labels=np.full(n_samples,-1.) labels[0]=outer labels[-1]=inner #使用LP算法實現标簽傳遞 label_spread=label_propagation.LabelSpreading(kernel=rbf,alpha=0.8) label_spread.fit(X,labels) #輸出标簽 output_labels=label_spread.transduction_ plt.figure(figsize=(8.5,4)) plt.subplot(1,2,1) plt.scatter(X[labels==outer,0].X[labels==outer,1],color=navy,marker=,lw=0,label=outerlabeled,s=10) plt.scatter(X[labels==inner,0].X[labels==inner,1],color=,marker=,lw=0,label=innerlabeled,s=10) plt.scatter(X[labels==-1,0].X[labels==-1,1],color=darkorange,marker=,label=unlabeled,) plt.legend(scatterpoints=1,shadow=False,loc=upperright) plt.title(Rawdata(2classes=outerandinner))
左圖為原始數據分布,橘黃色的點代表無标簽樣本,深藍色的點為負樣本,淺藍色為正樣本;右圖為标簽傳播的結果。
小結
代價敏感加權實現較為簡單,使用廣泛;SMOTE算法需要進行樣本和特征清洗,再進行過采樣;半監督學習需要一定的無标簽樣本,泛化能力強,但精度無法保證。 半監督學習比過采樣算法泛化能力更強,因為是從無标簽樣本中召回負樣本。但準确率不好驗證,模型不夠穩定。
【作者】:Labryant
【原創公衆号】:風控獵人
【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~
,