日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征工程(下)

發(fā)布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征工程(下) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 工作中常用的特征工程有哪些方法呢?首先,我們需要了解業(yè)務中的模型會遇到什么問題,定位了問題才能找到貼合業(yè)務場景的特征工程方法。這比你會一些處理特征的騷操作重要很多,畢竟模型落地不是在打比賽,某個評價指標提高一點點就行,需要考慮的方面更多,比如變量的可解釋性、模型的可解釋性、模型的部署和監(jiān)控等等。

? 下面是我們在業(yè)務中的模型中會遇到的問題:

  • 模型效果不好
  • 訓練集效果好,跨時間測試效果不好
  • 跨時間測試效果也好,上線之后效果不好(一定是變量邏輯出問題,特征出現(xiàn)穿越)
  • 上線之后效果還好,幾周之后分數(shù)分布開始下滑(有一兩個變量跨時間測試不好)
  • 一兩個月內(nèi)都比較穩(wěn)定,突然分數(shù)分布驟降(關注外部環(huán)境)
  • 沒有明顯問題,但模型每個月逐步失效(無解)

? 以上問題是建模的核心,個人覺得比高大上的算法重要得多,可以針對這些問題多深入思考原因。然后我們來考慮一下業(yè)務所需要的變量是什么。

  • 變量必須對模型有貢獻,也就是說必須能對客群加以區(qū)分
  • 邏輯回歸要求變量之間線性無關
  • 邏輯回歸評分卡也希望變量呈現(xiàn)單調(diào)趨勢 (有一部分也是業(yè)務原因,但從模型角度來看,單調(diào)變量未必一定比有轉折的變量好)
  • 客群在每個變量上的分布穩(wěn)定,分布遷移無可避免,但不能波動太大

import pandas as pd import numpy as np df_train = pd.read_csv('train.csv') df_train.head() #數(shù)據(jù)集為kaggle上的Titanic數(shù)據(jù)集。

變量重要性

  • IV值
  • 卡方檢驗
  • 模型篩選
    這里我們使用IV值或者模型篩選多一點(一般一種方法就行,差別不大)

分箱、WOE、IV

import numpy as np import pandas as pd from scipy import statsdef mono_bin(Y,X,n=20):r=0good = Y.sum()bad = Y.count()-goodwhile np.abs(r)< 1:d1=pd.DataFrame({"X":X,"Y":Y,"Bucket":pd.qcut(X,n)})d2=d1.groupby('Bucket',as_index=True)r,p=stats.spearmanr(d2.mean().X,d2.mean().Y)n=n-1d3=pd.DataFrame(d2.X.min(),columns=['min'])d3['min']=d2.min().Xd3['max']=d2.max().Xd3['sum']=d2.sum().Yd3['total']=d2.count().Yd3['rate']=d2.mean().Yd3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))d3['iv']=(d3['rate']/(1-d3['rate']) - (good/bad)) * np.log((d3['rate']/(1-d3['rate']))/(good/bad))d4=(d3.sort_index(by='min')).reset_index(drop=True)print("="*60)print(d4)return d4


? 可以看到將年齡分為3箱,每一箱的最小值,最大值,壞樣本數(shù)量,總數(shù)量,壞樣本占比,WOE值,IV值。將IV值求和之后就是Age變量的IV值。
變量的IV值一般取大于0.02。
這里用到的分箱方法有時間在深入了解一下,和常用的卡方分箱還不一樣。

集成模型輸出特征重要性

? 集成學習方法可以評估特征重要性指標,一般評估指標有weight, gain, cover等,這里找了一篇博客,后續(xù)有時間會寫一篇文章講解。
https://blog.csdn.net/sujinhehehe/article/details/84201415

#lightGBM中的特征重要性 feature = pd.DataFrame({'name' : model.booster_.feature_name(),'importance' : model.feature_importances_}).sort_values(by = ['importance'],ascending = False)

共線性

  • 相關系數(shù)
  • 方差膨脹系數(shù)

    ? 可以用matplotlib畫個熱力圖啥的。

? 在多元回歸中,我們可以通過計算方差膨脹系數(shù)VIF來檢驗回歸模型是否存在嚴重的多重共線性問題。 定義:
VIF=11?R2VIF=\frac{1}{1-R^2}VIF=1?R21?
? 其中,RRR為自變量 對其余自變量作回歸分析的負相關系數(shù)。方差膨脹系數(shù)是容忍度1?R21-R^21?R2的倒數(shù)。

? 方差膨脹系數(shù)VIF越大,說明自變量之間存在共線性的可能性越大。一般來講,如果方差膨脹因子超過10,則回歸模型存在嚴重的多重共線性。又根據(jù)Hair(1995)的共線性診斷標準,當自變量的容忍度大于0.1,方差膨脹系數(shù)小于10的范圍是可以接受的,表明白變量之間沒有共線性問題存在。
VIF函數(shù)詳細使用方法可以看statsmodels官方文檔.

單調(diào)性

  • bivar圖

? 這個是評分卡中比較獨特的一部分,市面上的課程講這個的很少,但是工作中用得很多,先來看結果。

# 等頻切分 df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'], 10) df_train.head() df_train = df_train.sort_values('Fare') alist = list(set(df_train['fare_qcut'])) badrate = {} for x in alist:a = df_train[df_train.fare_qcut == x]bad = a[a.label == 1]['label'].count()good = a[a.label == 0]['label'].count()badrate[x] = bad/(bad+good) f = zip(badrate.keys(),badrate.values()) f = sorted(f,key = lambda x : x[1],reverse = True ) badrate = pd.DataFrame(f) badrate.columns = pd.Series(['cut','badrate']) badrate = badrate.sort_values('cut') print(badrate) badrate.plot('cut','badrate')



? 對應上面的建模變量中,邏輯回歸評分卡也希望變量呈現(xiàn)單調(diào)趨勢 (有一部分也是業(yè)務原因,但從模型角度來看,單調(diào)變量未必一定比有轉折的變量好)。

穩(wěn)定性

  • PSI
  • 跨時間交叉檢驗

PSI

PSI公式如下:

? 對跨時間分箱的數(shù)據(jù)分別求PSI,因為預期占比需要建模之后根據(jù)模型來算,所以需要和集成學習輸出特征重要性一樣先計算出預期占比,不知道是不是這個意思,那也太麻煩了。。。
? 一般認為psi小于0.1時候模型穩(wěn)定性很高,0.1-0.25一般,大于0.25模型穩(wěn)定性差,建議重做。

跨時間交叉檢驗

? 就是將樣本按照月份切割,一次作為訓練集和測試集來訓練模型,取進入模型的變量之間的交集,但是要小心共線特征!

解決方法

  • 不需要每次都進入模型,大部分都在即可
  • 先去除共線性(這也是為什么集成模型我們也會去除共線性)

【作者】:Labryant
【原創(chuàng)公眾號】:風控獵人
【簡介】:某創(chuàng)業(yè)公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

總結

以上是生活随笔為你收集整理的特征工程(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。