【机器学习】为什么在信用风险建模中首选树模型?
信用風險建模是一個可以使用機器學習來提供解決方案的領域,因為它能夠從大量異構數據中找到答案。在信用風險建模中,還需要推斷特征,因為它們在數據驅動的決策中非常重要。
在這篇文章中,我們來研究什么是信用風險以及如何使用各種機器學習算法來表示它。以下是要討論的要點:
什么是信用風險
什么是信用風險建模
如何在信用風險建模中使用機器學習?
實施信用風險建模
基于樹的模型的出色表現
什么是信用風險
信用風險是指借款人無法定期還款并違約的可能性。它是指貸款人無法按時支付利息或款項的可能性。貸方現金流中斷,回收成本上升。在最壞的情況下,貸方可能不得不注銷部分或全部貸款,從而導致損失。
預測一個人拖欠債務的可能性是非常困難和復雜的。同時,適當評估信用風險有助于限制因違約和逾期付款而造成損失。如果信用風險較高,貸方或投資者要么收取較高的利率,要么拒絕提供貸款。
什么是信用風險建模
一個人的信用風險受多種因素的影響,確定借款人的信用風險是一項艱巨的任務。信用風險建模是應用數據模型來確定兩個關鍵因素的實踐。首先是借款人拖欠貸款的可能性。第二個因素是如果發生違約,貸方的財務影響。
金融機構使用信用風險模型來評估潛在借款人的信用風險。根據信用風險模型驗證,他們決定是否批準貸款以及貸款利率。
如何在風險建模中使用機器學習?
機器學習可以使用更高級的建模方法,如決策樹和神經網絡,這將非線性引入模型,允許發現變量之間更復雜的聯系。我們選擇使用 XGBoost 模型,該模型使用使用置換顯著性技術挑選的特征。
另一方面,機器模型通常非常復雜,以至于難以理解。我們選擇結合 XGBoost 和邏輯回歸,是因為可解釋性在信用風險評估中至關重要。
實施信用風險建模
Python 中的信用風險建模可以幫助銀行和其他金融機構降低風險并防止社會發生金融災難。
本文的目標是創建一個模型來預測一個人拖欠貸款的可能性。讓我們從加載數據集開始。
import?pandas?as?pd import?matplotlib.pyplot?as?plt import?seaborn?as?sns import?numpy?as?npfrom?sklearn.model_selection?import?train_test_split,?cross_val_score,?KFold from?sklearn.preprocessing?import?LabelEncoderfrom?sklearn.ensemble?import?RandomForestClassifier from?sklearn.naive_bayes?import?GaussianNB from?sklearn.neighbors?import?KNeighborsClassifier from?sklearn.linear_model?import?LogisticRegression from?sklearn.tree?import?DecisionTreeClassifier#?load?the?data loan_data?=?pd.read_csv('/content/drive/MyDrive/data/loan_data_2007_2014.csv')你會發現許多列都是標識符,不包含任何用于創建機器學習模型的有意義的信息。
我們想要建立一個模型來預測借款人拖欠貸款的可能性,與一個人拖欠后發生的事件的數據我們是不需要的。我們做如下處理:
#dropping?irrelevant?columns columns_to_?=?['id',?'member_id',?'sub_grade',?'emp_title',?'url',?'desc',?'title',?'zip_code',?'next_pymnt_d','recoveries',?'collection_recovery_fee',?'total_rec_prncp',?'total_rec_late_fee',?'desc',?'mths_since_last_record','mths_since_last_major_derog',?'annual_inc_joint',?'dti_joint',?'verification_status_joint',?'open_acc_6m',?'open_il_6m','open_il_12m',?'open_il_24m',?'mths_since_rcnt_il',?'total_bal_il',?'il_util',?'open_rv_12m',?'open_rv_24m','max_bal_bc',?'all_util',?'inq_fi',?'total_cu_tl',?'inq_last_12m','policy_code',] loan_data.drop(columns=columns_to_,?inplace=True,?axis=1) #?drop?na?values loan_data.dropna(inplace=True)在準備數據時,我們需要解決多重共線性問題,因為高度相關的變量提供了相同的信息,這些多余的信息將使模型無法估計因變量和自變量之間的關系。
為了檢查多重共線性,我們使用 Pandas 相關性矩陣來處理一下:
可以看出,幾個變量高度相關,應該消除。"loan amnt"、"funded amnt"、"funded amnt inv"、"installment"、"total pymnt inv"和"out prncp inv"是多重共線變量。
你可能會注意到幾個變量的數據類型不正確,需要進行預處理才能將它們轉換為正確的格式。我們將定義一些功能來幫助此過程的自動化。用于將變量轉換為數據的函數編碼如下。
def?Term_Numeric(data,?col):data[col]?=?pd.to_numeric(data[col].str.replace('?months',?''))Term_Numeric(loan_data,?'term')def?Emp_Length_Convert(data,?col):data[col]?=?data[col].str.replace('\+?years',?'')data[col]?=?data[col].str.replace('<?1?year',?str(0))data[col]?=?data[col].str.replace('?years',?'')data[col]?=?data[col].str.replace('?year',?'')data[col]?=?pd.to_numeric(data[col])data[col].fillna(value?=?0,?inplace?=?True)def?Date_Columns(data,?col):today_date?=?pd.to_datetime('2020-08-01')data[col]?=?pd.to_datetime(data[col],?format?=?"%b-%y")data['mths_since_'?+?col]?=?round(pd.to_numeric((today_date?-?data[col])?/?np.timedelta64(1,?'M')))data['mths_since_'?+?col]?=?data['mths_since_'?+?col].apply(lambda?x:?data['mths_since_'?+?col].max()?if?x?<?0?else?x)data.drop(columns?=?[col],?inplace?=?True)在我們的數據集中,目標列是貸款狀態,它具有不同的唯一值。這些值必須轉換為二進制。對于不良借款人,得分為 0,對于好的借款人,得分為 1。
在我們的情況下,不良借款人為列出的類別之一:沖銷、違約、逾期(31-120 天),剩余人被視為良好借款人。
#?creating?a?new?column?based?on?the?loan_status? loan_data['good_bad']?=?np.where(loan_data.loc[:,?'loan_status'].isin(['Charged?Off',?'Default',?'Late?(31-120?days)', 'Does?not?meet?the?credit?policy.?Status:Charged?Off']),?0,?1) #?Drop?the?original?'loan_status'?column loan_data.drop(columns?=?['loan_status'],?inplace?=?True)現在我們需要將分類變量轉換為數字以進行進一步建模,為此我們將使用 sklearn 庫中的 Label Encoder 類,如下所示:
categorical_column?=?loan_data.select_dtypes('object').columns for?i?in?range(len(categorical_column)):le?=?LabelEncoder()loan_data[categorical_column[i]]?=?le.fit_transform(loan_data[categorical_column[i]])現在,我們已準備好訓練各種算法,并將驗證哪種算法效果最好。我們計劃評估線性模型、KNN模型、兩種樹模型、一種樸素貝葉斯模型等。
我們將使用 KFold 對 10 折交叉驗證,并將檢查他們的平均準確度。
#?compare?models models?=?[] models.append(('LR',?LogisticRegression())) models.append(('KNN',?KNeighborsClassifier())) models.append((DT,?DecisionTreeClassifier())) models.append(('NB',?GaussianNB())) models.append(('RF',?RandomForestClassifier()))results?=?[] names?=?[]for?name,?model?in?models:kfold?=?KFold(n_splits=10)cv_results?=?cross_val_score(model,?x_train,?y_train,?cv=kfold)results.append(cv_results)names.append(name)msg?=?"%s:?%f?(%f)"?%?(name,?cv_results.mean(),?cv_results.std())print(msg)基于樹模型的出色表現
正如我們從上面的平均準確率中可以看到的,樹模型比其他模型的表現要好得多。與線性模型不同,它們很好地映射了非線性相互作用。
信用風險建模的特征重要性起著非常重要的作用,下面你可以看到決策樹算法給出的特征重要性圖。
總結
通過這篇文章,我們詳細討論了信用風險建模、如何使用機器學習模型而不是傳統方法來模擬信用風險。同時我們測試了各種模型并總結了基于樹的算法如何表現出色。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群955171419,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【机器学习】为什么在信用风险建模中首选树模型?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jeecg t:datagrid标签 每
- 下一篇: 兔弟弟和月亮婆婆