赞
踩
构建信用评分预测分类模型
掌握逻辑回归分类器的原理; 掌握建立逻辑回归分类预测模型; 掌握随机森林的原理;
掌握构建随机森林分类预测模型;
机器学习是一个比较广阔的知识领域,涉及到很多数学统计和计算机的相关知识。 机器学习如果用一句 话来概括就是:通过大量的训练,使得机器把输入的数据整理出有用的知识输出,这种输出或者是分类或 者是回归,分类问题是要预测类别,回归问题是要预测值。信用评分预测任务是一个二元分类问题,二 元分类(binary classification),是机器学习里比较早就应用的学习模型,比较著名的应用就是垃圾邮件 分类识别, 二元分类一般分为正例(positive)和反例(negative),信用评分预测任务主要是预测用户是否 会在 90 天内偿还信用借款。
回归其实就是对已知公式的未知参数进行估计,比如已知公式是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说明完全符合预测结果。
随机指的是利用多棵树对样本进行训练并预测的一种分类器,在机器学习中, 随机森林是一个用随机方 式建立的,包含多个决策树的集成分类器,其输出的类别由各个树投票而定。随机森林的生成过程如 下:
现实情况下,一个数据集中往往有成百上千个特征,如何在其中选择比结果影响最大的那几个特征,以 此来缩减建立模型时的特征数是我们比较关心的问题。用随机森林进行特征重要性评估,判断每个特征 在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。
启动丘比特笔记本
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')
from matplotlib import rcParams
#配置画图默认窗体大小
rcParams['figure.figsize'] = 11, 8
2.读取并预览数据集。
#读取信用评分数据集
data = pd.read_csv( 'credit_scoring_sample.csv', sep=';')
data.head()
SeriousDlqin2yrs | age | NumberOfTime30-59DaysPastDueNotWorse | DebtRatio | NumberOfTimes90DaysLate | NumberOfTime60-89DaysPastDueNotWorse | MonthlyIncome | NumberOfDependents | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 64 | 0 | 0.249908 | 0 | 0 | 8158.0 | 0.0 |
1 | 0 | 58 | 0 | 3870.000000 | 0 | 0 | NaN | 0.0 |
2 | 0 | 41 | 0 | 0.456127 | 0 | 0 | 6666.0 | 0.0 |
3 | 0 | 43 | 0 | 0.000190 | 0 | 0 | 10500.0 | 2.0 |
4 | 1 | 49 | 0 | 0.271820 | 0 | 0 | 400.0 | 0.0 |
查看各列变量类型:
data.dtypes #查看数据集各字段名称和数据类型
SeriousDlqin2yrs int64
age int64
NumberOfTime30-59DaysPastDueNotWorse int64
DebtRatio float64
NumberOfTimes90DaysLate int64
NumberOfTime60-89DaysPastDueNotWorse int64
MonthlyIncome float64
NumberOfDependents float64
dtype: object
通过绘图检查类别是否均衡:
#水平方向画直方图
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]
Distribution of the target:
0 0.777511
1 0.222489
Name: SeriousDlqin2yrs, dtype: float64
分离出数据特征列名称:
#拿到除SeriousDlqin2yrs以外的列名 independent_columns_names = [x for x in data if x != 'SeriousDlqin2yrs'] independent_columns_names
['age', 'NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'NumberOfTimes90DaysLate', 'NumberOfTime60-89DaysPastDueNotWorse', 'MonthlyIncome', 'NumberOfDependents']
3.编写一个函数,使用每列数据的中位数替换 NaN 空值。
#自定义fill_nan函数处理缺失数据 def fill_nan(table): for col in table.columns: #fillna():填充/替换缺失数据 table[col] = table[col].fillna(table[col].median()) return table
使用预先定义好的缺失值处理函数来填充缺失特征数据。
table = fill_nan(data)
4.将特征数据和目标值分离并赋值:
#特征数据 X = table[independent_columns_names] #目标值 y = table['SeriousDlqin2yrs'] X.shape, y.shape
((45063, 7), (45063,))
对延迟还款的客户的平均年龄进行间隔估计,置信水平设为 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))
Mean interval [45.71379414 46.12700479]
从结果可知,置信水平为90%的区间估计是45.71- 46.13。
建立逻辑回归分类预测模型。
1.导入所需模块。
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV, StratifiedKFold
2.创建一个 LogisticRegression 模型,并使用 class_weight =‘balanced’ 来弥补数据中不平衡 类。
#类型权重参数选择balanced,将赋予样本数量少的类型更多权重 lr = LogisticRegression(random_state=5, class_weight='balanced')
让我们试着找到模型最佳正则化系数,该系数在逻辑回归中由 C 系数指定,其作用是得到一个不过度拟 合的最优模型。下面给出几个 C 参数的备选项。
parameters = {'C': (0.0001, 0.001, 0.01)}
为了找到最佳 C 值,让我们使用 StratifiedKFold 分层采样交叉验证,以确保训练集、测试集中各类 别样本的比例与原始数据集中相同。
#StratifiedKFold分层采样,用于交叉验证,根据标签中不同类别占比来进行拆分数据 #n_splits:表示将数据划分几等份 #shuffle=True:在每次划分时,进行洗牌,随机取样 #random_state:随机种子数 skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=5)
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_
LogisticRegression(C=0.001, class_weight='balanced', random_state=5)
模型最佳 ROC AUC 值为:
grid_search.best_score_
0.8089120626797153
如果模型测试集上的标准差小于 0.005,则认为模型是稳定的。
#查看测试得分的标准差 grid_search.cv_results_['std_test_score'][1]
0.008137559189742445
而该模型测试集上的标准差为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)
feat | coef | |
---|---|---|
1 | NumberOfTime30-59DaysPastDueNotWorse | 0.723427 |
3 | NumberOfTimes90DaysLate | 0.516788 |
4 | NumberOfTime60-89DaysPastDueNotWorse | 0.193558 |
6 | NumberOfDependents | 0.101443 |
2 | DebtRatio | -0.024096 |
5 | MonthlyIncome | -0.163146 |
0 | age | -0.416702 |
可知,上面得到的最佳逻辑回归模型中,NumberOfTime30-59DaysPastDueNotWorse特征最为重 要。
构建随机森林分类预测模型。
1.导入所需类。
from sklearn.ensemble import RandomForestClassifier
2.初始化 100 颗决策树并同样使用类别平衡。
#构建有100棵决策树的随机森林分类器 rf = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=42, class_weight='balanced')
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]}
同样,这里为了找到最佳参数值,使用 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_
Fitting 5 folds for each of 1 candidates, totalling 5 fits
0.02674100294147086
#最优的随机森林分类器 rf_grid_search.best_estimator_
RandomForestClassifier(class_weight='balanced', max_depth=10, max_features=2, min_samples_leaf=7, n_jobs=-1, random_state=42)
由此可知,使用随机森林方法得到的最佳参数比上文中逻辑回归最佳参数在 ROC AUC 指标上高3%。
#在所有特征中,重要性最低的一个特征 independent_columns_names[np.argmin( rf_grid_search.best_estimator_.feature_importances_)]
'NumberOfDependents'
#以DataFrame的形式打印出该随机森林的不同特征的重要性,降序排序pd.DataFrame({'feat': independent_columns_names, 'coef':rf_grid_search.best_estimator_.feature_importances_}).sort_values(by='coef', ascending=False)
feat | coef | |
---|---|---|
1 | NumberOfTime30-59DaysPastDueNotWorse | 0.297363 |
3 | NumberOfTimes90DaysLate | 0.280566 |
4 | NumberOfTime60-89DaysPastDueNotWorse | 0.151621 |
0 | age | 0.116641 |
2 | DebtRatio | 0.079912 |
5 | MonthlyIncome | 0.059412 |
6 | NumberOfDependents | 0.014484 |
随机森林方法最优模型中,特征重要性最弱的是NumberOfDependents。
一方面,随机森林模型更适合信用评分问题,它的性能比逻辑回归提高了3%。另一方面,Logistic 回归 的主要优点是我们可以解释特征对模型结果的影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。