Python實現變數分箱及應用
之前發的內容里,代碼看不清,此篇為重發。
個人觀點,信貸行業中,模型穩定性往往比模型效果更重要。信貸行業所做的任何規則、政策、模型的調整,都需要較長時間才能知道結果如何,模型迭代周期相較於其他行業可能更長,因此一個模型的穩定性至關重要。當然在模型迭代周期較短的場景下,可以去追求更好的模型效果,比如有些反欺詐場景,模型模型迭代快,模型可以快速及時調整。但對於大多數其他情況,無論是做評分卡還是機器學習,個人在實踐中會為了穩定性犧牲掉一些效果。
提高模型的穩定性往往就是防止模型過擬合,當然不同演算法中有很多防止過擬合的技術 上的細節,除去演算法上的技術處理,還有一個非常重要的一點,就是對入模的特徵進行處理, 其中一點就是變數分箱。分箱是將變數離散化(類別變數的分箱,也可以理解為「離散化」, 因為分箱後整理類別會變少),挖掘出變數的主要趨勢,剔除變數的噪音。
之前使用SAS和R實現過分箱,學了Python後,就把R的代碼翻譯成python代碼,因為R和 python太像了。
將代碼封裝在函數cut_bin里,函數中各參數分別為,df待分箱的數據集, Kvar數據集主鍵, Yvar數據集y值, max_depth決策樹深度, p決策樹葉節點數據佔比。 代碼如下:
該函數輸出兩個對象,df_bin分箱後的數據集,dict_bin為存放各變數分箱結果的字典。df_bin分箱後的數據集示例:
dict_bin示例:
某變數分箱結果,從Bad_Rate可以看出該變數風險遞增,有很好的趨勢和業務解釋性:
在訓練樣本上分箱後,如何將分箱結果應用到測試樣本呢?下面函數實現了將訓練樣本上分箱方式「套進」 測試樣本里。其中df是測試樣本數據集,Kvar是主鍵,Yvar是y值,lst_bin是訓練樣本上的分箱結果的字典。該函數也輸出兩個對象,df_bin是測試樣本分箱結果,dict_bin是測試樣本變數分箱結果的字典。具體示例和上面結果相似。
上面的兩個函數實現了變數分箱的自動化,現在想看看訓練樣本和測試樣本里某個變數的趨勢是否一致。編了兩個函數實現該功能。train_test_bindict_trend里的參數為訓練和測試樣本的分箱結果的字典,train_test_bin_trend參數為訓練和測試樣本的分箱數據集。
運行後的結果如下,左側為該變數在訓練樣本上的趨勢,右側為測試樣本上的趨勢,從圖中可以看出該變數的趨勢比較穩定,但為了業務上更好解釋,可以將2和3進行合併,這樣趨勢就更明顯也更好解釋,也會在某種程度上消除掉一些噪音。
現在我想改變上面這個變數的分箱,比如分箱的個數更多一些或更少一些,或改變每段的最少佔比等。
如改變每段佔比至少10%,看看趨勢如何:
※一小時學會開發一套學員管理系統demo
※快來學學Python非同步IO,輕鬆管理10k+並發連接
TAG:Python |