贷款利润最大化——利用随机森林和逻辑回归
文章目錄
- 分析目的
- 一、數據采集
- 1、數據來源
- 2、數據說明
- 二、數據傳輸
- 三、數據處理
- 1、查看數據
- 2、清理無用特征值
- 3、標簽列分析
- 4、清理只單一值的列
- 5、空值處理
- 6、數據類型轉換
- 四、數據挖掘
- 1、構建模型
- 2、導入算法
- 五、總結
分析目的
本文針對某信貸網站提供的2007-2011年貸款申請人的各項評估指標,建立關于信貸審批達到利潤最大化模型,即對貸款人借貸狀態(全額借貸、不予借貸)進行分類,從而實現貸款利潤最大化,并采用不同算法進行評估。
一、數據采集
1、數據來源
數據來源,這個要注冊登錄,也可以直接點擊下載數據鏈接下載。下載鏈接,提取碼:nkvk
2、數據說明
本數據集共有四萬多頭數據,包含52個特征值,其中數據類型分別是 float64型30個, object型22個。本次數據分析主要是實現貸款利潤最大化,所以不需這么多特征量,需要對其進行舍棄處理。
二、數據傳輸
將數據導入到PYTHON軟件:
import pandas as pd loans = pd.read_csv('LoanStats3a.csv', skiprows=1) half_count = len(loans) / 2 loans = loans.dropna(thresh=half_count, axis=1) loans = loans.drop(['desc', 'url'],axis=1) loans.to_csv('loans_2007.csv', index=False) loans = pd.read_csv("loans_2007.csv") loans.info()三、數據處理
1、查看數據
#loans.iloc[0] loans.head(1)2、清理無用特征值
了解各數據特征在業務中的含義。觀察數據特征,主要清理與業務相關性不大的內容,重復特征值(等級下的另一個等級)以及預測后的特征值(批出的額度),此處的相關性大小憑業務知識進行粗略判斷,如申請人的id,member_id,url,公司名emp_title等。
loans = loans.drop(["id", "member_id", "funded_amnt", "funded_amnt_inv", "grade", "sub_grade", "emp_title", "issue_d"], axis=1) loans = loans.drop(["zip_code", "out_prncp", "out_prncp_inv", "total_pymnt", "total_pymnt_inv", "total_rec_prncp"], axis=1) loans = loans.drop(["total_rec_int", "total_rec_late_fee", "recoveries", "collection_recovery_fee", "last_pymnt_d", "last_pymnt_amnt"], axis=1) loans.head(1)
刪除無關字段后,剩余32個字段
3、標簽列分析
#統計不同還款狀態對應的樣本數量——標簽類分析 loans['loan_status'].value_counts()
統計結果顯示,共有9種借貸狀態,其中我們僅分析"Fully Paid"(全額借款)和"Charged Off"(不借款)這兩種狀態。“Fully paid”和“Charged Off”(其他取值樣本較少,是否貸款含義不明,直接舍棄),表示同意貸款和不同意貸款,將此特征作為及其學習的標簽列,由于sklearn中各及其學習模型值接受數值類型的數據類型,所以我們將“loan_status”映射為數值類型。
將“loan_status”映射為數值類型:
4、清理只單一值的列
在進行數據分析時,部分字段對應的值只有一個,應刪除這些無關字段
#查找只包含一個惟一值的列并刪除 orig_columns = loans.columns drop_columns = [] for col in orig_columns:col_series = loans[col].dropna().unique()#如果字段值都一樣,刪除該字段if len(col_series) == 1:drop_columns.append(col) loans= loans.drop(drop_columns, axis=1) print(drop_columns) #將清洗后數據存入一個新的文件中 loans.to_csv('filtered_loans_2007.csv', index=False)5、空值處理
本文的處理原則是:對于某一特征,如果出現空值的樣本較少,則刪除在此特征商為空值的樣本;如果去空值的樣本數量較多,則選擇刪除該特征。有上述原則知,我們需要對各特征出現空值的數量進行統計。
loans = pd.read_csv('filtered_loans_2007.csv') null_counts = loans.isnull().sum() null_counts
發現有四個特征有取空值的情況,其中三個空值數量較少,我們刪除對應的樣本,另外一個特征“pub_rec_bankruptcies”,空值數量較多,我們刪除該特征。
6、數據類型轉換
#統計不同數據類型下的字段總和 print(loans.dtypes.value_counts())輸出結果如下圖,12個列所對應的數據類型為字符型,應轉化為數值型。
“emp_length”可以直接映射為數值型 ,對于“int_rate”,“revol_util”可以去掉百分號,然后轉換為數值型,對于含義重復的特征,如“purpose”和“title”,都表示貸款意圖,可選擇刪除一個,其他與模型訓練無關的特征選擇刪除。剩余的其他字符型特征,此處選擇使用pandas的get_dummies()函數,直接映射為數值型。
四、數據挖掘
1、構建模型
對于二分類問題,一般情況下,首選邏輯回歸,這里我們引用sklearn庫。首先定義模型效果的評判標準。根據貸款行業的實際情況,為了實現利潤最大化,我們不僅要求模型預測正確率較高,同時還要盡可能的讓錯誤率較低,這里采用兩個指標tpr和fpr。同時該模型采用交叉驗證(KFold,分組數采用默認的最好的分組方式)進行學習。為了比較不同模型的訓練效果,建立三個模型。
2、導入算法
初始化處理
#負例預測為正例 fp_filter = (predictions == 1) & (loans["loan_status"] == 0) fp = len(predictions[fp_filter]) # 正例預測為正例 tp_filter = (predictions == 1) & (loans["loan_status"] == 1) tp = len(predictions[tp_filter]) # 負例預測為正例 fn_filter = (predictions == 0) & (loans["loan_status"] == 1) fn = len(predictions[fn_filter]) # 負例預測為負例 tn_filter = (predictions == 0) & (loans["loan_status"] == 0) tn = len(predictions[tn_filter])邏輯回歸:
from sklearn.linear_model import LogisticRegression lr = LogisticRegression() cols = loans.columns train_cols = cols.drop("loan_status") features = loans[train_cols] target = loans["loan_status"] lr.fit(features, target) predictions = lr.predict(features) from sklearn.linear_model import LogisticRegression from sklearn.model_selection import KFold from sklearn.model_selection import train_test_split lr = LogisticRegression() kf = KFold(features.shape[0], random_state=1) predictions = cross_val_predict(lr, features, target, cv=kf) predictions = pd.Series(predictions) # False positives. fp_filter = (predictions == 1) & (loans["loan_status"] == 0) fp = len(predictions[fp_filter]) # True positives. tp_filter = (predictions == 1) & (loans["loan_status"] == 1) tp = len(predictions[tp_filter]) # False negatives. fn_filter = (predictions == 0) & (loans["loan_status"] == 1) fn = len(predictions[fn_filter]) # True negatives tn_filter = (predictions == 0) & (loans["loan_status"] == 0) tn = len(predictions[tn_filter]) # Rates tpr = tp / float((tp + fn)) fpr = fp / float((fp + tn)) print(tpr) print(fpr) print predictions[:20]
錯誤率和正確率都達到99.9%,錯誤率太高,通過觀察預測結果發現,模型幾乎將所有的樣本都判斷為正例,通過對原始數據的了解,分析造成該現象的原因是由于政府樣本數量相差太大,即樣本不均衡造成模型對正例樣本有所偏重,大家可以通過下采樣或上采用對數據進行處理,這里采用對樣本添加權重值的方式進行調整。
邏輯回歸balanced處理不均衡:
新的結果降低了錯誤率約為40%,但正確率也下降約為65%,因此有必要再次嘗試,可以采取自定義權重值的方式。
邏輯回歸penalty處理不均衡:
新的結果錯誤率約為47%,正確率約為73%,可根據需要繼續調整,但調整策略并不限于樣本權重值這一種,下面使用隨機森林建立模型。
隨機森林balanced處理不均衡:
在這里錯誤率約為97%,正確率約為94%,錯誤率太高,同時可得到本次分析隨機森林模型效果劣于邏輯回歸模型的效果
五、總結
當模型效果不理想時,可以考慮的調整策略:
1.調節正負樣本的權重參數。
2.更換模型算法。
3.同時幾個使用模型進行預測,然后取去測的最終結果。
4.使用原數據,生成新特征。
5.調整模型參數。
總結
以上是生活随笔為你收集整理的贷款利润最大化——利用随机森林和逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析-书籍整理(二)
- 下一篇: oracle scn隐藏参数,Oracl