当前位置:   article > 正文

小学期05_seriousdlqin2yrs age monthlyincome

seriousdlqin2yrs age monthlyincome

实验名称

构建信用评分预测分类模型

实验目的

掌握逻辑回归分类器的原理; 掌握建立逻辑回归分类预测模型; 掌握随机森林的原理;
掌握构建随机森林分类预测模型

实验背景

机器学习是一个比较广阔的知识领域,涉及到很多数学统计和计算机的相关知识。 机器学习如果用一句 话来概括就是:通过大量的训练,使得机器把输入的数据整理出有用的知识输出,这种输出或者是分类或 者是回归,分类问题是要预测类别,回归问题是要预测值。信用评分预测任务是一个二元分类问题,二 元分类(binary classification),是机器学习里比较早就应用的学习模型,比较著名的应用就是垃圾邮件 分类识别, 二元分类一般分为正例(positive)和反例(negative),信用评分预测任务主要是预测用户是否 会在 90 天内偿还信用借款。

实验原理

1.逻辑回归分类器

回归其实就是对已知公式的未知参数进行估计,比如已知公式是y = a*x + b,未知参数是a和b。我们现 在有很多真实的(x,y)数据(训练样本),回归就是利用这些数据对a和b的取值去自动估计。Logistic Regression 就是一个被logistic方程归一化后的线性回归,逻辑回归(Logistic Regression),与它的名 字恰恰相反,它是一个分类器而非回归方法,是分类算法中最基础也是最重要的手段,主要用于er分问 题(即结果要么是0,要么是1), 在一些文献里它也被称为logit回归、最大熵分类器(MaxEnt)、对 数线性分类器等。逻辑回归也叫做对数几率回归,它仅仅是在线性回归的基础上,将线性模型通过一个 函数,转化为结果只有0/1的分类模型。

Logistic分类的主要思想:根据现有数据对分类边界建立回归公式,并以此分类。逻辑回归就是一个分类 的算法,常见用在二分类当中,就是把我们的输入值在线性回归中转化为预测值,然后映射到Sigmoid 函数中,将值作为x轴的变量,y轴作为一个概率,预测值对应的Y值越接近于1说明完全符合预测结果。

2.随机森林

随机指的是利用多棵树对样本进行训练并预测的一种分类器,在机器学习中, 随机森林是一个用随机方 式建立的,包含多个决策树的集成分类器,其输出的类别由各个树投票而定。随机森林的生成过程如 下:

  1. 从原始样本中采取有放回抽样的方法选取n个样本;
  2. 对n个样本选取a个特征中的随机k个,用建立决策树的方法获得最佳分割点;
  3. 重复m次,获得m个决策树;
  4. 对输入样例进行预测时,每个子树都产生一个结果,采用多数投票机制输出。

现实情况下,一个数据集中往往有成百上千个特征,如何在其中选择比结果影响最大的那几个特征,以 此来缩减建立模型时的特征数是我们比较关心的问题。用随机森林进行特征重要性评估,判断每个特征 在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。

实验步骤

一、启动实验环境

启动丘比特笔记本

二、读取数据

1.导入所需的包和相关模块。

import warnings 
import seaborn as sns 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np
%matplotlib inline 
#默认风格darkgid 
sns.set() 
warnings.filterwarnings('ignore')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
from matplotlib import rcParams 
#配置画图默认窗体大小 
rcParams['figure.figsize'] = 11, 8
  • 1
  • 2
  • 3

2.读取并预览数据集。

#读取信用评分数据集
data = pd.read_csv( 'credit_scoring_sample.csv', sep=';') 
data.head()
  • 1
  • 2
  • 3
SeriousDlqin2yrsageNumberOfTime30-59DaysPastDueNotWorseDebtRatioNumberOfTimes90DaysLateNumberOfTime60-89DaysPastDueNotWorseMonthlyIncomeNumberOfDependents
006400.249908008158.00.0
105803870.00000000NaN0.0
204100.456127006666.00.0
304300.0001900010500.02.0
414900.27182000400.00.0

查看各列变量类型:

data.dtypes #查看数据集各字段名称和数据类型
  • 1
SeriousDlqin2yrs                          int64
age                                       int64
NumberOfTime30-59DaysPastDueNotWorse      int64
DebtRatio                               float64
NumberOfTimes90DaysLate                   int64
NumberOfTime60-89DaysPastDueNotWorse      int64
MonthlyIncome                           float64
NumberOfDependents                      float64
dtype: object
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

通过绘图检查类别是否均衡:

#水平方向画直方图 
ax = data['SeriousDlqin2yrs'].hist(orientation='horizontal', color='red') 
ax.set_xlabel("number_of_observations") #number_of_observations为x轴 
ax.set_ylabel("unique_value") #unique_value为y轴 
ax.set_title("Target distribution")
print('Distribution of the target:') 
#统计SeriousDlqin2yrs中不同取值的样本数量占总样本数量的比值 
data['SeriousDlqin2yrs'].value_counts()/data.shape[0]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Distribution of the target:





0    0.777511
1    0.222489
Name: SeriousDlqin2yrs, dtype: float64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

分离出数据特征列名称:

#拿到除SeriousDlqin2yrs以外的列名 independent_columns_names = [x for x in data if x != 'SeriousDlqin2yrs'] independent_columns_names
  • 1
['age', 'NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'NumberOfTimes90DaysLate', 'NumberOfTime60-89DaysPastDueNotWorse', 'MonthlyIncome', 'NumberOfDependents']
  • 1

3.编写一个函数,使用每列数据的中位数替换 NaN 空值。

#自定义fill_nan函数处理缺失数据 def fill_nan(table):     for col in table.columns:         #fillna():填充/替换缺失数据         table[col] = table[col].fillna(table[col].median())    return table
  • 1

使用预先定义好的缺失值处理函数来填充缺失特征数据。

table = fill_nan(data)
  • 1

4.将特征数据和目标值分离并赋值:

#特征数据 X = table[independent_columns_names] #目标值 y = table['SeriousDlqin2yrs'] X.shape, y.shape
  • 1
((45063, 7), (45063,))
  • 1

三、区间估计

对延迟还款的客户的平均年龄进行间隔估计,置信水平设为 90%,可以使用文章中的示例作为参考,并 需指定 np.random.seed(0)。

#自定义get_bootstrap_samples抽取数据样本def get_bootstrap_samples(data, n_samples):     """Generate samples using bootstrapping."""     #np.random.randint():生成一个指定范围内的整数     indices = np.random.randint(0, len(data), (n_samples, len(data)))     samples = data[indices]     return samples#自定义stat_intervals函数定义置信区间def stat_intervals(stat, alpha):     """Make an interval estimate."""     #np.percentile():计算一个数组的百分比分位数     boundaries = np.percentile(stat, [100 * alpha / 2., 100 * (1 - alpha / 2.)])    return boundaries#筛选出所有SeriousDlqin2yrs为1的样本,并返回age的值 churn = data[data['SeriousDlqin2yrs'] == 1]['age'].values#设置随机种子 np.random.seed(0)#获取1000份随机取样的均值 churn_mean_scores = [np.mean(sample) for sample in get_bootstrap_samples(churn, 1000)]#打印出置信水平为90%的置信区间 print("Mean interval", stat_intervals(churn_mean_scores, 0.1))
  • 1
Mean interval [45.71379414 46.12700479]
  • 1

从结果可知,置信水平为90%的区间估计是45.71- 46.13。

四、逻辑回归分类器

建立逻辑回归分类预测模型。

1.导入所需模块。

from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV, StratifiedKFold
  • 1

2.创建一个 LogisticRegression 模型,并使用 class_weight =‘balanced’ 来弥补数据中不平衡 类。

#类型权重参数选择balanced,将赋予样本数量少的类型更多权重 lr = LogisticRegression(random_state=5, class_weight='balanced')
  • 1

让我们试着找到模型最佳正则化系数,该系数在逻辑回归中由 C 系数指定,其作用是得到一个不过度拟 合的最优模型。下面给出几个 C 参数的备选项。

parameters = {'C': (0.0001, 0.001, 0.01)}
  • 1

为了找到最佳 C 值,让我们使用 StratifiedKFold 分层采样交叉验证,以确保训练集、测试集中各类 别样本的比例与原始数据集中相同。

#StratifiedKFold分层采样,用于交叉验证,根据标签中不同类别占比来进行拆分数据 #n_splits:表示将数据划分几等份 #shuffle=True:在每次划分时,进行洗牌,随机取样 #random_state:随机种子数 skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=5)
  • 1

3.本次模型质量评估选用曲线下面积(AUC)指标。AUC 值介于 0 到 1 之间,接近 1 则表示分类模 型的质量越好。使用 scoring=‘roc_auc’ 作为评估指标,并运用 Grid Search 方法来搜索最佳 C 参数,找出最优值。

#通过网格搜寻的方法,结合分层采样交叉验证,训练出roc_auc参数最优的模型 #GridSearchCV:网格搜索结合交叉验证自动调参,找出roc_auc最优参数 grid_search = GridSearchCV(lr, parameters, n_jobs=-1, scoring='roc_auc', cv=skf)#训练roc_auc参数最优的模型 grid_search = grid_search.fit(X, y) grid_search.best_estimator_
  • 1
LogisticRegression(C=0.001, class_weight='balanced', random_state=5)
  • 1

模型最佳 ROC AUC 值为:

grid_search.best_score_
  • 1
0.8089120626797153
  • 1

如果模型测试集上的标准差小于 0.005,则认为模型是稳定的。

#查看测试得分的标准差 grid_search.cv_results_['std_test_score'][1]
  • 1
0.008137559189742445
  • 1

而该模型测试集上的标准差为0.008,大于0.005,所以上面得到的最佳 C 值不能保证模型稳定。

五、特征重要性

特征重要性由其相应系数的绝对值定义。首先,需要使用 StandardScaler 规范化所有特征值以便于正 确比较。

from sklearn.preprocessing import StandardScaler #c:正则化系数,float类型,其值越小,正则化越强 #class_weight:用于标示分类模型中各种类型的权重 #class_weight='balanced':类库根据训练样本量来计算类型权重,某种类型的样本量越多,则权重越低 lr = LogisticRegression(C=0.001, random_state=5, class_weight='balanced') scal = StandardScaler() # 规范化 lr.fit(scal.fit_transform(X), y)#以DataFrame的形式打印出该逻辑回归的相关系数,降序排序pd.DataFrame({'feat': independent_columns_names, 'coef': lr.coef_.flatten().tolist()}).sort_values(by='coef',ascending=False)
  • 1
featcoef
1NumberOfTime30-59DaysPastDueNotWorse0.723427
3NumberOfTimes90DaysLate0.516788
4NumberOfTime60-89DaysPastDueNotWorse0.193558
6NumberOfDependents0.101443
2DebtRatio-0.024096
5MonthlyIncome-0.163146
0age-0.416702

可知,上面得到的最佳逻辑回归模型中,NumberOfTime30-59DaysPastDueNotWorse特征最为重 要。

六、随机森林

构建随机森林分类预测模型。

1.导入所需类。

from sklearn.ensemble import RandomForestClassifier
  • 1

2.初始化 100 颗决策树并同样使用类别平衡。

#构建有100棵决策树的随机森林分类器 rf = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=42, class_weight='balanced')
  • 1

3.从以下候选参数中进行网格搜索。

#parameters = {'max_features': [1, 2, 4], 'min_samples_leaf': [3, 5, 7, 9], 'max_depth': [5, 10, 15]}#为了加快搜索速度,这里仅保留原参数中的最佳参数 parameters = {'max_features': [2], 'min_samples_leaf': [7], 'max_depth': [10]}
  • 1

同样,这里为了找到最佳参数值,使用 StratifiedKFold 分层采样交叉验证。

#使用网格搜寻,借助前面生成的交叉验证,找到roc_auc指标最优的分类器 rf_grid_search = GridSearchCV( rf, parameters, n_jobs=-1, scoring='roc_auc', cv=skf, verbose=True)rf_grid_search = rf_grid_search.fit(X, y) #将随机森林的roc_auc指标减去逻辑回归的roc_auc指标 rf_grid_search.best_score_ - grid_search.best_score_
  • 1
Fitting 5 folds for each of 1 candidates, totalling 5 fits





0.02674100294147086
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#最优的随机森林分类器 rf_grid_search.best_estimator_
  • 1
RandomForestClassifier(class_weight='balanced', max_depth=10, max_features=2,                       min_samples_leaf=7, n_jobs=-1, random_state=42)
  • 1

由此可知,使用随机森林方法得到的最佳参数比上文中逻辑回归最佳参数在 ROC AUC 指标上高3%。

#在所有特征中,重要性最低的一个特征 independent_columns_names[np.argmin( rf_grid_search.best_estimator_.feature_importances_)]
  • 1
'NumberOfDependents'
  • 1
#以DataFrame的形式打印出该随机森林的不同特征的重要性,降序排序pd.DataFrame({'feat': independent_columns_names, 'coef':rf_grid_search.best_estimator_.feature_importances_}).sort_values(by='coef', ascending=False)
  • 1
featcoef
1NumberOfTime30-59DaysPastDueNotWorse0.297363
3NumberOfTimes90DaysLate0.280566
4NumberOfTime60-89DaysPastDueNotWorse0.151621
0age0.116641
2DebtRatio0.079912
5MonthlyIncome0.059412
6NumberOfDependents0.014484

随机森林方法最优模型中,特征重要性最弱的是NumberOfDependents。

实验总结

一方面,随机森林模型更适合信用评分问题,它的性能比逻辑回归提高了3%。另一方面,Logistic 回归 的主要优点是我们可以解释特征对模型结果的影响。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/193071?site
推荐阅读
相关标签
  

闽ICP备14008679号