日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贷款利润最大化——利用随机森林和逻辑回归

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贷款利润最大化——利用随机森林和逻辑回归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 分析目的
  • 一、數據采集
    • 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”映射為數值類型:

loans = loans[(loans['loan_status'] == "Fully Paid") | (loans['loan_status'] == "Charged Off")] status_replace = {"loan_status" : {"Fully Paid": 1,"Charged Off": 0,} } loans= loans.replace(status_replace) loans.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”,空值數量較多,我們刪除該特征。

loans = loans.drop("pub_rec_bankruptcies", axis=1) loans = loans.dropna(axis=0)

6、數據類型轉換

#統計不同數據類型下的字段總和 print(loans.dtypes.value_counts())

輸出結果如下圖,12個列所對應的數據類型為字符型,應轉化為數值型。

#輸出數據類型為字符型的字段 object_columns_df = loans.select_dtypes(include=["object"]) print(object_columns_df.iloc[0]) #對字符型數據進行分組計數 cols = ['home_ownership', 'verification_status', 'emp_length', 'term', 'addr_state'] for c in cols:print(loans[c].value_counts()) print(loans["purpose"].value_counts()) print(loans["title"].value_counts())


“emp_length”可以直接映射為數值型 ,對于“int_rate”,“revol_util”可以去掉百分號,然后轉換為數值型,對于含義重復的特征,如“purpose”和“title”,都表示貸款意圖,可選擇刪除一個,其他與模型訓練無關的特征選擇刪除。剩余的其他字符型特征,此處選擇使用pandas的get_dummies()函數,直接映射為數值型。

#將"emp_length"字段轉化為字符型數據 mapping_dict = {"emp_length": {"10+ years": 10,"9 years": 9,"8 years": 8,"7 years": 7,"6 years": 6,"5 years": 5,"4 years": 4,"3 years": 3,"2 years": 2,"1 year": 1,"< 1 year": 0,"n/a": 0} } loans = loans.drop(["last_credit_pull_d", "earliest_cr_line", "addr_state", "title"], axis=1) #將百分比類型轉化為浮點型(小數類型) loans["int_rate"] = loans["int_rate"].str.rstrip("%").astype("float") loans["revol_util"] = loans["revol_util"].str.rstrip("%").astype("float") loans = loans.replace(mapping_dict) cat_columns = ["home_ownership", "verification_status", "emp_length", "purpose", "term"] dummy_df = pd.get_dummies(loans[cat_columns]) loans = pd.concat([loans, dummy_df], axis=1) loans = loans.drop(cat_columns, axis=1) loans = loans.drop("pymnt_plan", axis=1) loans.to_csv('cleaned_loans2007.csv', index=False) import pandas as pd #讀取最終清洗的數據 loans = pd.read_csv("cleaned_loans2007.csv") print(loans.info())

四、數據挖掘

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處理不均衡:

from sklearn.linear_model import LogisticRegression from sklearn.cross_validation import cross_val_predict lr = LogisticRegression(class_weight="balanced") 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]


新的結果降低了錯誤率約為40%,但正確率也下降約為65%,因此有必要再次嘗試,可以采取自定義權重值的方式。
邏輯回歸penalty處理不均衡:

from sklearn.linear_model import LogisticRegression from sklearn.cross_validation import cross_val_predict penalty = {0: 5,1: 1} lr = LogisticRegression(class_weight=penalty) 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)


新的結果錯誤率約為47%,正確率約為73%,可根據需要繼續調整,但調整策略并不限于樣本權重值這一種,下面使用隨機森林建立模型。
隨機森林balanced處理不均衡:

from sklearn.ensemble import RandomForestClassifier from sklearn.cross_validation import cross_val_predict rf = RandomForestClassifier(n_estimators=10,class_weight="balanced", random_state=1) #print help(RandomForestClassifier) kf = KFold(features.shape[0], random_state=1) predictions = cross_val_predict(rf, 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)


在這里錯誤率約為97%,正確率約為94%,錯誤率太高,同時可得到本次分析隨機森林模型效果劣于邏輯回歸模型的效果

五、總結

當模型效果不理想時,可以考慮的調整策略:
1.調節正負樣本的權重參數。
2.更換模型算法。
3.同時幾個使用模型進行預測,然后取去測的最終結果。
4.使用原數據,生成新特征。
5.調整模型參數。

總結

以上是生活随笔為你收集整理的贷款利润最大化——利用随机森林和逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。