利用XGBoost和Databricks Runtime進行貸款風險分析
對於那些從客戶貸款利息中賺錢的公司來說,這總是關於增加底線。能夠評估貸款申請的風險可以為貸款人節省持有過多風險資產的成本。數據科學家的工作是對客戶數據進行分析,並製定將直接影響貸款批準的業務規則。
花時間構建這些機器學習模型的數據科學家是一種稀缺資源,他們經常被孤立在一個沙盒裏:
- 盡管他們每天都在處理數據,但他們依賴於數據工程師來獲得最新的表。
- 隨著數據以指數級速度增長,他們依賴於基礎設施團隊提供計算資源。
- 一旦模型構建過程完成,他們必須相信軟件開發人員能夠正確地將模型代碼轉換為可用於生產的代碼。
這就是數據庫的位置統一分析平台Beplay体育安卓版本可以幫助彌合工作流鏈不同部分之間的差距,並減少數據科學家、數據工程師和軟件工程師之間的摩擦。
除了減少操作摩擦,Databricks還是運行最新機器學習模型的中心位置。用戶可以使用原生Spark MLLib包或下載任何開源Python或R ML包。與Databricks運行時機器學習Databricks集群預先配置了XGBoost, scikit-learn和numpy以及流行的深度學習框架,如TensorFlow, Keras, Horovod及其依賴項。
在這篇博客中,我們將探討如何:
- 導入示例數據源以創建Databricks表
- 使用Databricks Visualizations探索您的數據
- 針對數據執行ETL代碼
- 執行ML管道,包括模型調優XGBoost邏輯回歸
導入數據
對於我們的實驗,我們將使用公開的Lending Club貸款數據。它包括2012年至2017年的所有融資貸款。每筆貸款都包括申請人提供的申請人信息,以及當前的貸款狀態(當前、逾期、全額支付等)和最新的付款信息。有關更多信息,請參閱Lending Club Data模式。
在本地下載數據之後,就可以在Databricks工作區中創建數據庫和表來加載這個數據集。要了解更多信息,請參見《數據庫文檔>用戶指南>數據庫和表>創建表》AWS或Azure.
在本例中,我們創建了Databricks數據庫艾米
和表loanstats_2012_2017
.下麵的代碼片段允許您通過PySpark訪問Databricks筆記本中的這個表。
#導入貸款統計表Loan_stats = spark.table(“amy.loanstats_2012_2017”)
探索你的數據
和數據庫一起顯示
命令時,您可以使用Databricks本機可視化。
查看我們數據的條形圖顯示器(loan_stats)
在本例中,我們可以通過查看貸款等級和貸款金額來查看資產配置。
使用PySpark DataFrame API修改數據
如在清潔大數據(福布斯)在美國,數據科學家80%的工作是數據準備,這通常是工作中最不愉快的方麵。但是使用PySpark,您可以編寫Spark SQL語句或使用PySpark DataFrame API來簡化數據準備任務。下麵是簡化數據過濾的代碼片段。
#進口貸款統計表格loan_stats=loan_stats。過濾器(\loan_stats.loan_status。型號(\[“違約”、“衝銷”、“已付清”]) \) .withColumn (“bad_loan”,(~(loan_stats.loan_status==“全部付訖”)).投(“字符串”))
完成此ETL過程後,您可以使用顯示
再次命令以查看散點圖中已清理的數據。
查看我們數據的條形圖顯示器(loan_stats)
要在地圖可視化中查看按州劃分的相同資產數據,可以使用顯示
命令結合了PySpark DataFrame API使用集團
語句與gg
(聚合),例如下麵的代碼片段。
#視圖地圖的我們的資產數據顯示器(loan_stats.groupBy(“addr_state”).agg ((數(坳(“annual_inc”))).alias(比率)))
使用XGBoost訓練我們的ML模型
雖然我們可以快速可視化我們的資產數據,但我們想看看是否可以創建一個機器學習模型,使我們能夠根據可用參數預測貸款是好是壞。正如下麵的代碼片段所指出的,我們將預測bad_loan
(定義為標簽
)通過構建我們的ML管道,如下所示:
- 執行一個
輸入
方法中填充缺失的值數字組成
屬性(輸出為numerics_out
) - 使用
索引器
來處理分類值,然後使用OneHotEncoder通過將它們轉換為向量oneHotEncoders
(輸出categoricals_class
). - 的
特性
為我們的ML管道定義categorical_class
和numerics_out
. - 接下來,我們將通過執行
VectorAssembler
. - 如前所述,我們將建立我們的
標簽
(即我們將要嚐試預測的內容)作為bad_loan
列。 - 在確定應用哪種算法之前,應用標準的縮放器來構建我們的管道數組(
pipelineAry
).
雖然前麵的代碼片段是用Python編寫的,但下麵的代碼示例是用Scala編寫的,以允許我們利用XGBoost4J-Spark。的筆記本係列包含在Parquet中保存數據並隨後在Scala中讀取數據的Python代碼。
//填充缺失值的估算器Val numerics_out =數字。地圖(_ +“找到”)Val imputers =新輸入().setInputCols(數字).setOutputCols (numerics_out)//為我們的分類數據應用StringIndexerVal categoricals_idx = categoricals。地圖(_ +“_idx”)Val索引器= categories .map(x= >新StringIndexer () .setInputCol (x)。setOutputCol (x +“_idx”) .setHandleInvalid (“保持”))//為StringIndexed分類數據應用OHEVal categoricals_class = categoricals。地圖(_ +“_class”)val oneHotEncoders =新OneHotEncoderEstimator ().setInputCols (categoricals_idx).setOutputCols (categoricals_class)//設置特征列val featureCols = categoricals_class ++ numerics_out//為我們的數字列創建彙編程序(包括標簽)Val彙編程序=新VectorAssembler ().setInputCols (featureCols).setOutputCol (“特征”)//建立標簽val labelIndexer =新StringIndexer ().setInputCol (“bad_loan”).setOutputCol (“標簽”)//應用StandardScalerVal標量=新StandardScaler ().setInputCol (“特征”).setOutputCol (“scaledFeatures”).setWithMean (真正的).setWithStd (真正的)//構建管道數組val pipelineAry = indexers ++數組(oneHotEncoders, imputers,彙編器,labelIndexer, scaler)
現在我們已經建立了我們的管道,讓我們創建XGBoost管道並將其應用到我們的訓練數據集中。
//創建XGBoostEstimatorval xgBoostEstimator =新XGBoostEstimator (地圖[字符串,任何)(“num_round”->5,“客觀”->“二進製:物流”,“nworkers”->16,“nthreads”->4)).setFeaturesCol (“scaledFeatures”).setLabelCol (“標簽”)//創建XGBoost管道val xgBoostPipeline =新管道()。setStages (pipelineAry + +數組(xgBoostEstimator))//基於訓練數據集創建XGBoost模型val xgBoostModel = xgBoostPipeline.fit(dataset_train)//根據驗證數據集測試我們的模型val預測= xgBoostModel.transform(dataset_valid)顯示器(predictions.select (“概率”,“標簽”))
注意,"nworkers" -> 16, "nthreads" -> 4
配置為使用的實例為16個虛擬機,每個虛擬機有4個vcpu和大約30gb的內存。
現在我們有了我們的模型,我們可以根據驗證數據集測試我們的模型預測
包含結果。
模型有效性評估
現在我們已經構建並訓練了XGBoost模型,讓我們通過使用BinaryClassficationEvaluator
.
//包含BinaryClassificationEvaluator進口org.apache.spark.ml.evaluation.BinaryClassificationEvaluator/ /評估Val評估器=新BinaryClassificationEvaluator ().setRawPredictionCol (“概率”)//計算驗證AUCVal accuracy = evaluator.evaluate(預測)
經計算,XGBoost驗證數據曲線下麵積(AUC)為:~0.6520。
使用MLlib交叉驗證優化模型
我們可以嚐試使用MLlib交叉驗證來調優我們的模型CrossValidator
如下麵的代碼片段所示。我們首先建立參數網格,這樣就可以使用包含不同參數值的網格執行多次運行。使用相同的BinaryClassificationEvaluator
我們用來測試模型有效性的方法,我們在更大的範圍內使用不同的參數組合通過結合BinaryClassificationEvaluator
和ParamGridBuilder
並應用到我們的CrossValidator ()
.
//構建參數網格val paramGrid =新ParamGridBuilder ().addGrid (xgBoostEstimator.maxDepth數組(4,7)).addGrid (xgBoostEstimator.eta數組(0.1,0.6)).addGrid (xgBoostEstimator.round數組(5,10)).build ()//將evaluator設置為BinaryClassificationEvaluatorVal評估器=新BinaryClassificationEvaluator ().setRawPredictionCol (“概率”)//建立交叉驗證器()Val CV =新CrossValidator ().setEstimator (xgBoostPipeline).setEvaluator(評估者).setEstimatorParamMaps (paramGrid).setNumFolds (4)//運行交叉驗證,並選擇最佳參數集。val cvModel = cv.fit(dataset_train)
注意,對於XGBoostEstimator的初始配置,我們使用num_round,但我們使用round (num_round不是估計器中的屬性)
此代碼片段將運行交叉驗證並選擇最佳參數集。然後我們可以重新運行我們的預測並重新計算準確性。
//根據cvModel和驗證數據集測試我們的模型val predictions_cv = cvModel.transform(dataset_valid)顯示器(predictions_cv.select (“概率”,“標簽”))//計算cvModel驗證AUCVal accuracy = evaluator.evaluate(predictions_cv)
我們的精度略有提高,值為~0.6734。
您還可以通過運行下麵的代碼片段查看bestModel參數。
//查看bestModel參數cvModel.bestModel.asInstanceOf [PipelineModel] .stages (11) .extractParamMap
量化業務價值
快速理解該模型的業務價值的一個好方法是創建一個混淆矩陣。我們的矩陣定義如下:
- 預測=1,標簽=1(藍色):正確發現不良貸款。Sum_net =避免的損失。
- 預測=1,標簽=0(橙色):錯誤標記的不良貸款。Sum_net =喪失利潤。
- 預測=0,標簽=1(綠色):錯誤標記的良好貸款。Sum_net =仍然發生的損失。
- 預測=0,標簽=0(紅色):正確發現好的貸款。Sum_net =留存利潤。
下麵的代碼段計算以下混淆矩陣。
顯示器(predictions_cv。groupBy(“標簽”,“預測”).agg ((總和(坳(“淨”))/(1 e6) .alias(“sum_net_mill”)))
為了確定從實現模型中獲得的價值,我們可以計算為
價值= -(避免損失-喪失利潤)
我們當前的XGBoost模型AUC = ~0.6734,這些值說明了實現XGBoost模型的顯著值增益。
- value (XGBoost): 22.076
注意,這裏引用的值是指從防止壞賬損失中節省的數百萬美元。
總結
方法快速執行貸款風險分析Databricks統一分析平台(UAP)Beplay体育安卓版本其中包括Databricks機器學習運行時。與Databricks運行時機器學習Databricks集群預先配置了XGBoost, scikit-learn和numpy以及流行的深度學習框架,如TensorFlow, Keras, Horovod及其依賴項。
通過消除通常與此類數據管道相關的數據工程複雜性,我們可以快速地將數據源導入Databricks表,使用Databricks Visualizations查看數據,針對數據執行ETL代碼,並使用XGBoost邏輯回歸構建、訓練和優化ML管道。試試這個筆記本係列今天在Databricks !