Lending Club—构建贷款违约预测模型 – python_backup

python信誉评分卡(附法典,博主录制)

https://study.163.com/course/introduction.htm?courseId=1005214003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

https://blog.csdn.net/arsenal0435/article/details/80446829(原文勾住)

1.本展现需处置的成绩
本展现经过应用P2P平台Lending Club的贷款标明,举行机具念书,安排贷款违约预测构成者,对新增贷款提案人举行预测即使会违约,到这程度决议即使信誉。

2.建模思绪
以下为这次展现的任务流出。

3.表演解析
贷款提案人向Lending Club平台敷用贷款时,Lending Club平台经过线上或线下让客户填写贷款敷用表,搜集客户的基本通信,喂包罗提案人的年纪、性活动、婚姻状况、学历、贷款算术、提案人不动产权局面等通信,通常来说还会借助第三方平台如征信机构或FICO等机构的通信。经过这些通信属性来做通过单独的若干阶段来发展回归 ,产量预测构成者,Lending Club平台可以经过预测断定贷款敷用即使会违约,到这程度决议即使向提案人发给贷款。

1)率先,朕的表演是经过用户的历史行动(如历史标明的多维特点和贷款影响即使违约)来锻炼构成者,经过如此构成者对新增的贷款人“即使具有还债才能,即使具有偿债愿意”举行剖析,预测贷款提案人即使会发作违约贷款。这是任何人监视念书的表演,由于已蝉特点于是贷款影响即使违约(目的列),朕断定贷款提案人即使违约是任何人二元搭配成绩,可以经过任何人搭配算法来处置,喂选用逻辑斯蒂回归(Logistic Regression)。

2)测量部标明集显示证据反比例标明是半组织化标明,需求举行特点摘要。

    现对该事情表演举行总结列举如下:

    地基历史记录标明念书并对贷款即使违约举行预测,监视念书表演,选择逻辑斯蒂回归(Logistic Regression)算法。
标明为半组织化标明,需求举行特点摘要。

4.标明预处置(Pre-Processing Data)
这次展现标明集来源于Lending Club Statistics,详细为2018年高音的季Lending Club平台发作贷款的事情标明。
标明扼要介绍

检查每列属性缺漏值的反比例

check_null = ().sum().sort_values(ascending=False)/float(len(data))
print(check_null[check_null > ]) # 检查缺漏反比例大于20%的属性。

从下面通信可以显示证据,这次标明集缺漏值较多的属性对朕构成者预测意思绝佳地,譬如id和member_id于是url等。如此,朕坦率地切除这些缺席意思且缺漏值较多的属性。与此同时,即使缺漏值对属性来被说成有意思的,还得细分缺漏值对应的属性是数值型变量否则搭配典型变量。

thresh_count = len(data)*0.4 # 设定阀值
data = (thresh=thresh_count, axis=1) #若一个人列标明缺漏的数字超越阀值就会被切除
再将处置后的标明转变为csv

data.to_csv(””, index = False)
loans = (””)
() # 搭配数数标明典型

(107866, 103)

同值化处置   
即使任何人变量大反比例的遵守都是相等的的特点,这么如此特点或许输出变量执意无法用来区别目的时期。

loans = [:,() != 1]

(107866, 96)

缺漏值处置——搭配变量   
objectColumns = (include=[“object”]).columns
loans[objectColumns].isnull().sum().sort_values(ascending=False)

loans[objectColumns]

loans[”int_rate”] = loans[”int_rate”].(”%”).astype(”float”)
loans[”revol_util”] = loans[”revol_util”].(”%”).astype(”float”)
objectColumns = (include=[“object”]).columns
朕可以喊叫missingno库来感情的中枢评价标明缺漏的局面。

(loans[objectColumns]) # 缺漏值目测

从图中可以直观的看出变量“last_pymnt_d”、“emp_title”、“emp_length”缺漏值较多。

    喂朕先用‘unknown’来满足。

objectColumns = (include=[“object”]).columns
loans[objectColumns] = loans[objectColumns].fillna(“Unknown”)
缺漏值处置——数值变量
numColumns = (include=[]).columns

pd.set_option(””, len(numColumns))
loans[numColumns].tail()

([107864, 107865], inplace =True)
喂应用可sklearn的Preprocessing模块,参量strategy选用most_frequent,采取方式插补的办法满足缺漏值。
imr = Imputer(missing_values=”NaN”, strategy=”most_frequent”, axis=0) # axis=0 计数器列来处置
imr = (loans[numColumns])
loans[numColumns] = (loans[numColumns])
这么样缺漏值就先前处置完。

标明过滤
print(objectColumns)

将越过反复或对安排预测构成者缺席意思的属性举行切除。

drop_list = [”sub_grade”, ”emp_title”, ”issue_d”, ”title”, ”zip_code”, ”addr_state”, ”earliest_cr_line”,
”initial_list_status”, ”last_pymnt_d”, ”next_pymnt_d”, ”last_credit_pull_d”, ”disbursement_method”]

(drop_list, axis=1, inplace=True)
(include = [”object”]).shape
(107866, 8)

5.特点工程(Feature Engineering)
特点衍生
Lending Club平台中,”installment”代表贷款每月分期的算术,朕将”annual_inc”除号12个月如愿以偿贷款提案人的月入算术,那时再把”installment”(月亏空)与(”annual_inc”/12)(月入)相除产量新的特点”installment_feat”,新特点”installment_feat”代表客户每月还款开销占月入的比,”installment_feat”的值越大,断言贷款人的偿债压力越大,违约的可能性越大。
loans[”installment_feat”] = loans[”installment”] / ((loans[”annual_inc”]+1) / 12)
特点摘要(Feature Abstraction)
def coding(col, codeDict):

colCoded = (col, copy=True)
for key, value in codeDict.items():
(key, value, inplace=True)

return colCoded

#把贷款影响LoanStatus编码为违约=1, 精神健全的=0:

loans[“loan_status”] = coding(loans[“loan_status”], {”Current”:0,”Issued”:0,”Fully Paid”:0,”In Grace Period”:1,”Late (31-120 days)”:1,”Late (16-30 days)”:1,”Charged Off”:1})

print( ”\nAfter Coding:”)

(loans[“loan_status”])

贷款影响目测

(include=[“object”]).head()

率先,朕对变量“emp_length”、”grade”举行特点摘要化。

# 规则特点的晒
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,
“Unknown”: 0
},
“grade”:{
“A”: 1,
“B”: 2,
“C”: 3,
“D”: 4,
“E”: 5,
“F”: 6,
“G”: 7
}
}

loans = (mapping_dict)
loans[[”emp_length”,”grade”]].head()

再对剩余特点举行One-hot编码。

n_columns = [“home_ownership”, “verification_status”, “application_type”,”purpose”, “term”]
dummy_df = (loans[n_columns]) # 用get_dummies举行one hot编码
loans = ([loans, dummy_df], axis=1) #当axis = 1的时候,concat执意行对齐,那时将不同列名称的两张表合并
再清除掉原来的属性。

loans = (n_columns, axis=1)
()

    这么样,就先前将所有典型为object的变量作了转变。

col = (include=[”int64”,”float64”]).columns
col = (”loan_status”) #剔除目的变量

loans_ml_df = loans # 复制标明至变量loans_ml_df
特点缩放(Feature Scaling)
朕采取的是标准化的办法,喊叫scikit-learn模块preprocessing的子模块StandardScaler。
sc =StandardScaler() # 初始化缩放器
loans_ml_df[col] =(loans_ml_df[col]) #对标明举行标准化
特点选择(Feature Selecting)
目的:率先,优先选择与目的相关性较高的特点;其次,去除不相关特点可以降低念书的难度。
#安排X特点变量和Y目的变量
x_feature = list()
(”loan_status”)
x_val = loans_ml_df[x_feature]
y_val = loans_ml_df[”loan_status”]
len(x_feature) # 检查初始特点集合的数字
103
率先,选出与目的变量相关性较高的特点。喂采取的是Wrapper办法,经过暴力的递归特点消除 (Recursive Feature Elimination)办法筛选30个与目的变量相关性最强的特点,逐步剔除特点到这程度达到首次降维,自变量从103个降到30个。
# 建立逻辑回归搭配器
model = LogisticRegression()
# 建立递归特点消除筛选器
rfe = RFE(model, 30) #经过递归选择特点,选择30个特点
rfe = (x_val, y_val)
# 打印筛选结果
print()
print( )
print()
print() #ranking 为 1代表被选中,其他则未被代表未被选中

col_filter = [] #经过布尔值筛选首次降维后的变量
col_filter

Filter

    在高音的次降维的基础上,经过皮尔森相关性图谱找出冗余特点并将其剔除;同时,可以经过相关性图谱进一步引导朕选择特点的方向。

colormap = plt.cm.viridis
(figsize=(12,12))
(”Pearson Correlation of Features”, y=5, size=15)
(loans_ml_df[col_filter].corr(),linewidths=0.1,vmax=, square=True, cmap=colormap, linecolor=”white”, annot=True)

drop_col = [”funded_amnt”, ”funded_amnt_inv”, ”out_prncp”, ”out_prncp_inv”, ”total_pymnt_inv”, ”total_rec_prncp”,
”num_actv_rev_tl”, ”num_rev_tl_bal_gt_0”, ”home_ownership_RENT”, ”application_type_Joint App”,
”term_ 60 months”, ”purpose_debt_consolidation”, ”verification_status_Source Verified”, ”home_ownership_OWN”,
”verification_status_Verified”,]
col_new = (drop_col) #剔除冗余特点

len(col_new) # 特点子集包含的变量从30个降维至15个。
15

Embedded
下面需求对特点的权重有任何人正确的评判和排序,可以经过特点重要性排序来挖掘哪些变量是比较重要的,降低念书难度,最终达到优化构成者计算的目的。喂,朕采取的是随机森林算法断定特点的重要性,工程实现方式采取scikit-learn的featureimportances 的办法。
names = loans_ml_df[col_new].columns
clf=RandomForestClassifier(n_estimators=10,random_state=123) #安排搭配随机森林搭配器
(x_val[col_new], y_val) #对自变量和因变量举行拟合
for feature in zip(names, ):
print(feature)

(”ggplot”)

## feature importances 目测##
importances =
feat_names = names
indices = np.argsort(importances)[::-1]
fig = (figsize=(20,6))
(“Feature importances by RandomTreeClassifier”)
(range(len(indices)), importances[indices], color=”lightblue”, align=”center”)
(range(len(indices)), (importances[indices]), where=”mid”, label=”Cumulative”)
(range(len(indices)), feat_names[indices], rotation=”vertical”,fontsize=14)
([-1, len(indices)])
()

# 下图是地基特点在特点子集中的相对重要性绘制的排序图,这些特点经过特点缩放后,其特点重要性的和为。
# 由下图朕可以得出的结论:基于决策树的计算,特点子集上最具判别效果的特点是“total_pymnt”。

6.构成者锻炼
处置样本不均衡
前面已提到,目的变量“loans_status”精神健全的和违约两种类别的数字差别较大,会对构成者念书造成困扰。朕采取过采样的办法来处置样本不均衡成绩,详细操作应用的是SMOTE(Synthetic Minority Oversampling Technique),SMOET的基本原理是:采样最邻近算法,计算出每个少数类样本的K个近邻,从K个近邻中随机挑选N个样本举行随机通过单独的若干阶段来发展插值,构造新的少数样本,同时将新样本与原标明合成,产生新的锻炼集。

# 安排自变量和因变量
X = loans_ml_df[col_new]
y = loans_ml_df[“loan_status”]

n_sample = [0]
n_pos_sample = y[y == 0].shape[0]
n_neg_sample = y[y == 1].shape[0]
print(”样本个数:{}; 正样本占{:.2%}; 负样本占{:.2%}”.format(n_sample,
n_pos_sample / n_sample,
n_neg_sample / n_sample))
print(”特点维数:”, [1])

# 处置不平衡标明
sm = SMOTE(random_state=42) # 处置过采样的办法
X, y = (X, y)
print(”经过SMOTE办法平衡正负样本后”)
n_sample = [0]
n_pos_sample = y[y == 0].shape[0]
n_neg_sample = y[y == 1].shape[0]
print(”样本个数:{}; 正样本占{:.2%}; 负样本占{:.2%}”.format(n_sample,
n_pos_sample / n_sample,
n_neg_sample / n_sample))

安排搭配器锻炼
这次展现朕采取交叉验证法划分标明集,将标明划分为3反比例:锻炼集(training set)、验证集(validation set)和测试集(test set)。让构成者在锻炼集举行念书,在验证集上举行参量调优,最后应用测试集标明评价构成者的性能。

    构成者调优朕采取网格搜索调优参量(grid search),经过安排参量候选集合,那时网格搜索会穷举各种参量组合,地基设定评定的评分机制找到最好的那一组设置。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0) # random_state = 0 每次切分的标明都一样
# 安排参量组合
param_grid = {”C”: [0.01,0.1, 1, 10, 100, 1000,],
”penalty”: [ ”l1”, ”l2”]}
# C:Inverse of regularization strength; must be a positive float. Like in support vector machines, smaller values specify stronger regularization.

grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=10) # 确定构成者LogisticRegression,和参量组合param_grid ,cv指定10折
(X_train, y_train) # 应用锻炼集念书算法

print(“Best parameters: {}”.format())
print(“Best cross-validation score: {:.5f}”.format())

print(“Best estimator:\n{}”.format()) # 返回构成者于是他的所有参量(包含最优参量)

现在应用经过锻炼和调优后的构成者在测试集上测试。

y_pred = (X_test)
print(“Test set accuracy score: {:.5f}”.format(accuracy_score(y_test, y_pred,)))
Test set accuracy score: 0.66064

print(classification_report(y_test, y_pred))

roc_auc = roc_auc_score(y_test, y_pred)
print(“Area under the ROC curve : %f” % roc_auc)
Area under the ROC curve :

总结
最后结果不太理想,实际任务中还要做特点分箱处置,计算IV值和WOE编码也是需求的。构成者评价方面也有不足,这为以后的任务提供了些经验。

(博主录制)

This entry was posted in 鸿运国际. Bookmark the <a href="https://www.rxmedsfr.com/hygj/2354.html" title="Permalink to Lending Club—构建贷款违约预测模型 – python_backup" rel="bookmark">permalink</a>.

发表评论

电子邮件地址不会被公开。 必填项已用*标注