【机器学习】为什么在信用风险建模中首选树模型?
信用風(fēng)險建模是一個可以使用機器學(xué)習(xí)來提供解決方案的領(lǐng)域,因為它能夠從大量異構(gòu)數(shù)據(jù)中找到答案。在信用風(fēng)險建模中,還需要推斷特征,因為它們在數(shù)據(jù)驅(qū)動的決策中非常重要。
在這篇文章中,我們來研究什么是信用風(fēng)險以及如何使用各種機器學(xué)習(xí)算法來表示它。以下是要討論的要點:
什么是信用風(fēng)險
什么是信用風(fēng)險建模
如何在信用風(fēng)險建模中使用機器學(xué)習(xí)?
實施信用風(fēng)險建模
基于樹的模型的出色表現(xiàn)
什么是信用風(fēng)險
信用風(fēng)險是指借款人無法定期還款并違約的可能性。它是指貸款人無法按時支付利息或款項的可能性。貸方現(xiàn)金流中斷,回收成本上升。在最壞的情況下,貸方可能不得不注銷部分或全部貸款,從而導(dǎo)致?lián)p失。
預(yù)測一個人拖欠債務(wù)的可能性是非常困難和復(fù)雜的。同時,適當(dāng)評估信用風(fēng)險有助于限制因違約和逾期付款而造成損失。如果信用風(fēng)險較高,貸方或投資者要么收取較高的利率,要么拒絕提供貸款。
什么是信用風(fēng)險建模
一個人的信用風(fēng)險受多種因素的影響,確定借款人的信用風(fēng)險是一項艱巨的任務(wù)。信用風(fēng)險建模是應(yīng)用數(shù)據(jù)模型來確定兩個關(guān)鍵因素的實踐。首先是借款人拖欠貸款的可能性。第二個因素是如果發(fā)生違約,貸方的財務(wù)影響。
金融機構(gòu)使用信用風(fēng)險模型來評估潛在借款人的信用風(fēng)險。根據(jù)信用風(fēng)險模型驗證,他們決定是否批準(zhǔn)貸款以及貸款利率。
如何在風(fēng)險建模中使用機器學(xué)習(xí)?
機器學(xué)習(xí)可以使用更高級的建模方法,如決策樹和神經(jīng)網(wǎng)絡(luò),這將非線性引入模型,允許發(fā)現(xiàn)變量之間更復(fù)雜的聯(lián)系。我們選擇使用 XGBoost 模型,該模型使用使用置換顯著性技術(shù)挑選的特征。
另一方面,機器模型通常非常復(fù)雜,以至于難以理解。我們選擇結(jié)合 XGBoost 和邏輯回歸,是因為可解釋性在信用風(fēng)險評估中至關(guān)重要。
實施信用風(fēng)險建模
Python 中的信用風(fēng)險建模可以幫助銀行和其他金融機構(gòu)降低風(fēng)險并防止社會發(fā)生金融災(zāi)難。
本文的目標(biāo)是創(chuàng)建一個模型來預(yù)測一個人拖欠貸款的可能性。讓我們從加載數(shù)據(jù)集開始。
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')你會發(fā)現(xiàn)許多列都是標(biāo)識符,不包含任何用于創(chuàng)建機器學(xué)習(xí)模型的有意義的信息。
我們想要建立一個模型來預(yù)測借款人拖欠貸款的可能性,與一個人拖欠后發(fā)生的事件的數(shù)據(jù)我們是不需要的。我們做如下處理:
#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)在準(zhǔn)備數(shù)據(jù)時,我們需要解決多重共線性問題,因為高度相關(guān)的變量提供了相同的信息,這些多余的信息將使模型無法估計因變量和自變量之間的關(guān)系。
為了檢查多重共線性,我們使用 Pandas 相關(guān)性矩陣來處理一下:
可以看出,幾個變量高度相關(guān),應(yīng)該消除。"loan amnt"、"funded amnt"、"funded amnt inv"、"installment"、"total pymnt inv"和"out prncp inv"是多重共線變量。
你可能會注意到幾個變量的數(shù)據(jù)類型不正確,需要進(jìn)行預(yù)處理才能將它們轉(zhuǎn)換為正確的格式。我們將定義一些功能來幫助此過程的自動化。用于將變量轉(zhuǎn)換為數(shù)據(jù)的函數(shù)編碼如下。
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)在我們的數(shù)據(jù)集中,目標(biāo)列是貸款狀態(tài),它具有不同的唯一值。這些值必須轉(zhuǎn)換為二進(jìn)制。對于不良借款人,得分為 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)現(xiàn)在我們需要將分類變量轉(zhuǎn)換為數(shù)字以進(jìn)行進(jìn)一步建模,為此我們將使用 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]])現(xiàn)在,我們已準(zhǔn)備好訓(xùn)練各種算法,并將驗證哪種算法效果最好。我們計劃評估線性模型、KNN模型、兩種樹模型、一種樸素貝葉斯模型等。
我們將使用 KFold 對 10 折交叉驗證,并將檢查他們的平均準(zhǔn)確度。
#?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)基于樹模型的出色表現(xiàn)
正如我們從上面的平均準(zhǔn)確率中可以看到的,樹模型比其他模型的表現(xiàn)要好得多。與線性模型不同,它們很好地映射了非線性相互作用。
信用風(fēng)險建模的特征重要性起著非常重要的作用,下面你可以看到?jīng)Q策樹算法給出的特征重要性圖。
總結(jié)
通過這篇文章,我們詳細(xì)討論了信用風(fēng)險建模、如何使用機器學(xué)習(xí)模型而不是傳統(tǒng)方法來模擬信用風(fēng)險。同時我們測試了各種模型并總結(jié)了基于樹的算法如何表現(xiàn)出色。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載黃海廣老師《機器學(xué)習(xí)課程》視頻課黃海廣老師《機器學(xué)習(xí)課程》711頁完整版課件本站qq群955171419,加入微信群請掃碼:
總結(jié)
以上是生活随笔為你收集整理的【机器学习】为什么在信用风险建模中首选树模型?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jeecg t:datagrid标签 每
- 下一篇: 兔弟弟和月亮婆婆