使用AutoML Toolkit自動化貸款違約預測

下載以下的筆記本,並嚐試AutoML工具包今天:使用XGBoost評估貸款批準風險(0.90)|利用AutoML Toolkit簡化貸款風險分析XGBoost模型優化

本博客最初發布於2019年9月10日;已於2019年10月2日更新。

在之前的博客和筆記本中,用XGBoost進行貸款風險分析,我們探討了如何構建機器學習模型來改善不良貸款預測的不同階段。我們回顧了三種不同的線性回歸模型- GLM, GBT和XGBoost -在每個階段執行耗時的手工優化模型的過程。

Databricks統一分析平台Beplay体育安卓版本

在這篇博客文章中,我們將展示如何顯著地簡化構建、評估和優化機器學習模型的過程Databricks Labs AutoML Toolkit.使用AutoML Toolkit還將允許您顯著更快地交付結果,因為它允許您自動化各種機器學習管道階段。正如您將看到的,我們將使用XGBoost 0.90運行相同的貸款風險分析數據集,並使用AutoML Toolkit看到結果的顯著改進,AUC從0.6732到0.72。就業務價值而言(通過防止不良貸款而節省的資金),AutoML Toolkit生成的模型可能會節省6888萬美元(與使用原始技術節省的2322萬美元相比)。

有什麼問題嗎?

對於我們目前的實驗,我們將繼續使用公眾Lending Club貸款數據.它包括2012年至2017年的所有資金貸款。每筆貸款包括申請人提供的申請人信息,以及當前貸款狀態(當前、逾期、完全支付等)和最新的支付信息。

我們利用申請人的信息來確定我們是否可以預測貸款是否不良。有關更多信息,請參見基於XGBoost和Databricks運行時的機器學習貸款風險分析

讓我們從結尾開始

AutoML工具包提供了一種簡單的方法來自動化機器學習管道中的各種任務。在我們的示例中,我們將使用兩個組件:Feature Importances和Automation Runner,它們將自動完成從向量化特征到迭代和調優機器學習模型的任務。

簡而言之:

  • AutoML的FeatureImportances自動發現哪些特性(來自數據集的列)是重要的,在創建模型時應該包括在內。
  • AutoML的AutomationRunner自動化機器學習管道的構建、訓練、執行和調優,以創建最佳的ML模型。

當我們手動創建了一個新的ML模型基於XGBoost和Databricks運行時的機器學習貸款風險分析使用XGBoost 0.90,我們能夠將AUC從0.6732提高到0.72!

我錯過了什麼?

在傳統的ML管道中,有許多手工編寫的組件來執行特性化、模型構建和調優的任務。下圖提供了這些階段的圖形表示。

這些階段包括:

  • 工程特性:我們將首先定義潛在的特征,向量化它們(數字數據和分類數據需要不同的步驟),然後選擇我們將使用的特征。
  • 模型構建和調優:這些是高度重複的階段,包括構建和訓練我們的模型,執行模型和檢查度量,調優模型,對模型進行更改,並重複這個過程,直到最終構建我們的模型。

在接下來的幾節中,我們將進行討論

我們的功能演示

在獲得可靠和幹淨的數據後,數據科學家的第一步是確定哪些列(即。特性)將用於他們的模型。

識別重要特性:傳統ML管道

在選擇您想要為您的模型使用哪些特性時,通常有許多步驟。在我們的示例中,我們正在創建一個二進製分類器(這算不算不良貸款?),我們將需要定義潛在的特征,向量化數字和分類特征,並最終選擇將在模型創建中使用的特征。

展開可查看傳統識別重要特征的詳細信息

//加載貸款風險分析數據集val sourceData = spark.read("…")//查看數據顯示(sourceData)

從上表可以看出,貸款風險分析數據集包含數字列和類別列。這是一個重要的區別,因為對於數字列和類別列,最終組裝一個將用作ML模型輸入的向量需要不同的步驟集。

為了更好地理解自變量之間是否存在相關性,我們可以快速檢查sourceData使用顯示命令將此數據視為散點圖。

你可以通過計算相關係數來進一步分析這些數據;一個流行的方法是用熊貓載於().雖然我們的Databricks筆記本是用Scala編寫的,但我們可以快速輕鬆地使用下麵提到的Python pandas代碼。

%python #使用Pandas ' corr ' pdf_corr = spark計算。sql("select loan_amnt, emp_length, annual_inc, dti, delinq_2yrs, revol_util, total_acc, credit_length_in_years, int_rate, net, issue_year, label from sourceData"). topandas ().corr() #通過loan_amnt顯示(pdf_corr. sql)查看相關係數。loc [: [' loan_amnt ']])

如上述散點圖所示(展開上麵的細節),沒有明顯的高度相關的數值變量。基於此評估,我們將在創建模型時保留所有列。

識別重要功能:AutoML Toolkit

需要注意的是,識別重要特征的過程可能是一個高度迭代和耗時的過程。有很多不同的技巧可以應用,這個過程本身就是一本書。機器學習的特征工程:數據科學家的原理和技術).

AutoML Toolkit包含這個類FeatureImportances自動識別最重要的特征;這是全部完成通過下麵的代碼片段。

//計算特性重要性(fi) val fiConfig = ConfigurationGenerator。generateConfigFromMap("XGBoost", "classifier", genericMapOverrides) //因為我們在這裏使用XGBoost,我們不能有並行> 2倍的節點數量fiConfig. tunerconfig . tunerparallelism = nodeCount * 2 val fiMainConfig = ConfigurationGenerator.generateFeatureImportanceConfig(fiConfig) //生成特性重要性val重要性= new FeatureImportances(sourceData, fiMainConfig, "count", 20.0) .generateFeatureImportances() //顯示特性重要性顯示(imports .importances)

在這個特定的示例中,自動生成並執行了30個不同的Spark作業,以找到需要包含的最重要的特性。注意,啟動的Spark作業的數量取決於幾個因素。我們不需要花幾天或幾周的時間手工探索數據,隻需要四行代碼,而是在幾分鍾內確定了這些特性。

讓我們構建它!

現在我們已經確定了最重要的特性,讓我們為貸款風險數據集構建、訓練、驗證和調優ML管道。

傳統模型的建立和調整

下麵的步驟是一個節略版使用XGBoost評估貸款批準風險(0.90)筆記本電腦代碼。

展開以查看傳統模型構建和調優細節

首先,我們將定義類別列和數字列。

//定義我們的分類列和數字列val categoricals = Array("term", "home_ownership", "purpose", "addr_state","verification_status","application_type") val numerics = Array("loan_amnt","emp_length", "annual_inc","dti","delinq_2yrs","revol_util","total_acc","credit_length_in_years")

然後我們將構建ML管道,如下麵的代碼片段所示。正如代碼中的注釋所指出的,我們的管道有以下步驟:

  • VectorAssembler:根據下麵處理過的特征列組裝特征向量
    • 數據錄入員用於補全數值數據缺失值的估計器
    • StringIndexer將字符串值編碼為數值
    • OneHotEncoding將分類特征(由StringIndexer數值表示)映射到二進製向量
  • LabelIndexer:指定我們的標簽(即真實價值)與我們的預測標簽(即不良或良好貸款的預測價值)
  • StandardScaler:對我們的特征向量進行歸一化,使不同尺度特征值的影響最小化。

注意,這個例子是一個簡單的二進製分類例子;還有很多方法可以用來提取、轉換和選擇特征

import org.apache.spark.ml. feat.stringindexer //補全缺失值的Imputation估計器val numerics_out = numerics。map(_ + "_out") val imputers = new Imputer() . setinputcols (numerics) . setoutputcols (numerics_out) //為我們的分類數據應用StringIndexer。Map (_ + "_idx") val indexers = categories。map(x => new StringIndexer(). setinputcol (x)。setOutputCol(x + "_idx"). sethandleinvalid ("keep")) //為我們的StringIndexed類別數據應用OHE val categoricals_class = categoricals。地圖(_ + _class) val oneHotEncoders = new OneHotEncoderEstimator () .setInputCols (categoricals_idx) .setOutputCols (categoricals_class) / /設置特性列val featureCols = categoricals_class + + numerics_out / /為我們的數字列創建彙編程序(包括標簽)val彙編= new VectorAssembler () .setInputCols (featureCols) .setOutputCol(“特性”)/ /建立標簽val labelIndexer = new StringIndexer () .setInputCol .setOutputCol(“標簽”)(“predictedLabel”)/ / StandardScaler申請val scalineary = new StandardScaler() .setInputCol("features") .setOutputCol("scaledFeatures") .setWithMean(true) .setWithStd(true) //構建管道數組val pipelineAry = indexers ++數組(oneHotEncoders, imputers, assembler, labelIndexer, scaler)

隨著我們的管道和我們決定使用XGBoost模型(如在基於XGBoost和Databricks運行時的機器學習貸款風險分析),讓我們構建、訓練並驗證我們的模型。

//創建XGBoostClassifier val XGBoostClassifier = new XGBoostClassifier(Map[String, Any]("num_round" -> 5, "objective" -> "binary:logistic", "nworkers" -> 16, "nthreads" -> 4)). setfeaturescol ("scaledFeatures") . setlabelcol ("predictedLabel") //創建XGBoost Pipeline val xgBoostPipeline = new Pipeline()。setStages(pipelineAry:+ xgBoostClassifier) //基於訓練數據集val創建XGBoost模型xgBoostModel = xgboostpipe .fit(dataset_train) //測試我們的模型對驗證數據集val預測= xgBoostModel.transform(dataset_valid)

通過使用Spark MLlib中包含的BinaryClassificationEvaluator,我們可以評估模型的性能。

//包括BinaryClassificationEvaluator導入org.apache.spark.ml. evaluationbinaryclassificationevaluator // Evaluate val evaluator = new BinaryClassificationEvaluator() .setRawPredictionCol("probability") //計算驗證AUC val AUC = evaluator. Evaluate (prediction) // AUC值// 0.6507

在AUC值為0.6507的情況下,讓我們看看是否可以通過設置a進一步優化該模型paramGrid和使用CrossValidator ().需要注意的是,您需要理解模型選項(例如XGBoost Classifier)maxDepth)正確選擇參數進行嚐試。

進口org.apache.spark.ml.tuning。{CrossValidator, CrossValidatorModel, ParamGridBuilder} //構建參數grid val paramGrid = new ParamGridBuilder() . addgrid (xgBoostClassifier. html)maxDepth, Array(4,7)) . addgrid (xgBoostClassifier. maxDepth). addgrid (xgBoostClassifier. eta, Array(0.1, 0.6))numRound, Array(5,10)) .build() //將評估器設置為BinaryClassificationEvaluator val evaluator = new BinaryClassificationEvaluator() . setrawpredictioncol ("probability") //建立CrossValidator() val cv = new CrossValidator() . setestimator (xgBoostPipeline) . setevaluator (evaluator) . setestimatorparammaps (paramGrid) . setnumfolds(4) //運行交叉驗證,並選擇最佳的參數集。val cvModel = cvModel. fit(dataset_train) //根據cvModel和驗證數據集測試我們的模型val predictions_cv = cvModel.transform(dataset_valid) //計算cvModel驗證AUC val cvAUC = evaluator.evaluate(predictions_cv) // AUC值// 0.6732

在多次迭代選擇不同的參數並測試這些參數的不同值之後(展開上麵的內容了解更多細節),使用傳統的模型構建和調優,我們能夠改進模型,使其AUC = 0.6732(從0.6507上升)。

AutoML模型構建和調優

由於所有傳統的模型構建和調優步驟都需要花費數天(或數周)的時間,我們能夠手動構建一個比隨機AUC值更好的模型。但是有了AutoML ToolkitAutomationRunner允許我們用幾行代碼執行上麵的所有步驟。

通過以下五行代碼,AutoML Toolkit的AutomationRunner自動執行前麵提到的所有步驟(構建、訓練、驗證、調優、重複)。

val modelingType = "XGBoost"generateConfigFromMap(modelingType, "classifier", genericMapOverrides) //調整模型調優器配置conf. tunerconfig . tunerparallelism = nodeCount //生成配置val XGBConfig = ConfigurationGenerator.generateMainConfig(conf) //在重要特性上選擇val runner = new AutomationRunner(dataset_train. conf)。select(selectionFields: _*)) .setMainConfig(XGBConfig) . runwithconfusereport ()

幾個小時(或幾分鍾)後,AutoML Toolkit就會找到最佳模型,並存儲模型和推理數據,如前麵代碼片段的輸出中所示。

...模型將保存到dbfs:/ml/dennylee/automl/models/dl_AutoML_Demo/BestRun/classifier_XGBoost_421b6cbe1e954ebba119eb3bfc2997bf/bestModel Inference DF將保存到dbfs:/ml/dennylee/automl/ Inference /dl_AutoML_Demo/3959076_best/421b6cbe1e954ebba119eb3bfc2997bf_best modelingType: String = XGBoost…

因為AutoML Toolkit使用了磚MLflow集成,所有的模型指標都被自動記錄。

如MLflow詳細信息(前麵的截圖)所述,AUC (areaUnderROC)已經改進到0.72的值!

AutoML Toolkit是如何做到這一點的?
關於AutoML Toolkit如何做到這一點的細節將在以後的博客中討論。從較高的層次上講,AutoML工具包能夠找到更好的超參數,因為它使用一組優化算法以分布式的方式測試和調優所有可修改的超參數。在AutoML工具包中包含了對如何使用從算法源代碼中提取的參數的理解(例如本例中的XGBoost)。

澄清困惑

隨著AUC值的顯著提高,AutoML XGBoost模型的性能比手工創建的好多少?因為這是一個二元分類問題,我們可以使用混淆矩陣來消除混淆。下麵包括手工製作的模型和AutoML Toolkit筆記本的混淆矩陣。為了與我們過去所做的分析相匹配基於XGBoost和Databricks運行時的機器學習貸款風險分析),我們正在評估2015年之後發放的貸款。

在上圖中,左邊的混淆矩陣來自手工製作的XGBoost模型,右邊的混淆矩陣來自AutoML Toolkit。雖然這兩個模型都能很好地正確識別好貸款(真:好,預測:好),但AutoML模型在識別不良貸款(真:壞,預測:壞- 4218 vs. 1370)以及防止誤報(真:壞,預測:好- 17792 vs. 20640)方麵表現更好。在這種情況下,這將意味著如果我們使用AutoML創建的機器學習模型(而不是手工模型),我們可能會避免發放2848個可能違約和損失資金的不良貸款。同樣重要的是,這個模型通過降低誤報(錯誤地預測這是一筆好貸款,而實際上它很可能是一筆壞貸款),可能會避免更多的麻煩和糟糕的客戶體驗。

理解業務價值

讓我們把這個混淆矩陣量化為商業價值;其定義是:

預測 標簽(是不良貸款) 簡短的描述 長描述
1 1 避免了損失 正確發現不良貸款
1 0 利潤被沒收的 不良貸款標簽不正確
0 1 損失仍然發生 標簽不正確的好貸款
0 0 利潤留存 正確找到好的貸款

為了查看與手工模型的混淆矩陣相關的美元價值,我們將使用以下代碼片段。

//從實現模型中獲得的值= -(避免的損失-喪失的利潤)display(predictions_cv. Value)groupBy(“預測”、“標簽”).agg((和(col(“淨”))/ (1 e6) .alias(“sum_net_mill”)))

為了查看與AutoML Toolkit模型的混淆矩陣相關的美元價值,將使用以下代碼片段。

// 2015年數據顯示(cmndf.)通過實現模型獲得的值= -(避免的損失-喪失的利潤)groupBy(“預測”、“標簽”).agg((和(col(“淨”))/ (1 e6) .alias(“sum_net_mill”)))

業務價值計算為價值= -(避免損失-喪失利潤)

模型 避免了損失 利潤被沒收的 價值
手工製作的 -20.16 3.06 23.22美元
AutoML工具包 -58.22 10.66 68.88美元

正如您所觀察到的,使用AutoML工具包節省的潛在利潤是手工模型的3倍,節省了6888萬美元。

AutoML Toolkit:代碼更少,速度更快

AutoML工具包,您可以編寫更少的代碼以更快地交付更好的結果。對於這個使用XGBoost示例的貸款風險分析,我們看到AUC = 0.72 vs. 0.6732的性能改善(使用原始技術可能節省6888萬美元vs. 2322萬美元)。AutoML工具包能夠找到更好的超參數,因為它自動以分布式的方式生成、測試和調優算法的所有可修改的超參數。

嚐試的AutoML工具包利用AutoML Toolkit簡化貸款風險分析XGBoost模型優化筆記本上今天!

修正

在此之前,由於錯誤地保存了AUC值0.995特征生成列(與貸款預測幾乎是1:1的關係)。修正後,正確的AUC為0.72。感謝Sean Owen, Sanne De Roever和Carsten Thone,他們很快發現了這個問題。

免費嚐試Databricks 開始

報名

Baidu
map