使用H2O构建异构集成分类器预测信用卡违约者
1. 引言
在当今的机器学习领域,准确预测信用卡违约者是一个重要的课题。H2O作为一个开源、分布式、内存中的机器学习平台,提供了丰富的监督和无监督算法。在监督算法方面,H2O涵盖了神经网络、随机森林(RF)、广义线性模型、梯度提升机、朴素贝叶斯分类器和XGBoost等。此外,H2O还提供了堆叠集成方法,旨在通过堆叠过程找到一组预测算法的最优组合,并且支持回归和分类任务。
我们将以台湾信用卡支付违约者数据为例,使用H2O中的多种监督算法构建模型,最终构建一个堆叠集成模型。该数据集包含了台湾信用卡客户的相关信息,如违约情况、客户的人口统计因素、信用数据和支付历史等。数据集可从GitHub获取,也可从其主要来源UCI ML Repository(https://bit.ly/2EZX6IC)下载。
2. 准备工作
我们将使用Google Colab来构建模型,具体步骤如下:
1.
安装H2O
:在Google Colab中执行以下命令安装H2O:
! pip install h2o
执行上述命令后,会显示一些说明,最后一行会显示安装成功的消息,H2O的版本号会根据最新可用版本而有所不同,例如:
Successfully installed colorama-0.4.1 h2o-3.22.1.2
- 导入所需库 :
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, roc_curve, auc
from sklearn import tree
import h2o
from h2o.estimators.glm import H2OGeneralizedLinearEstimator
from h2o.estimators.random_forest import H2ORandomForestEstimator
from h2o.estimators.gbm import H2OGradientBoostingEstimator
from h2o.grid.grid_search import H2OGridSearch
from h2o.estimators.stackedensemble import H2OStackedEnsembleEstimator
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
- 初始化H2O :
# Initialize H2o
h2o.init()
成功初始化后,会显示相关信息,具体信息可能因环境而异。
4.
挂载Google Drive并读取数据集
:
from google.colab import drive
drive.mount('/content/drive')
执行上述命令后,会提示你访问一个URL获取授权码,点击URL,复制授权码并粘贴。挂载成功后,可从Google Drive的相应文件夹中读取文件:
# Reading dataset from Google drive
df_creditcarddata = h2o.import_file("/content/drive/My Drive/Colab Notebooks/UCI_Credit_Card.csv")
使用
h2o.import_file
会创建一个
h2o.frame.H2OFrame
,类似于pandas的DataFrame,但数据存储在H2O集群中,而不是内存中。
5.
对H2O DataFrame进行基本操作
:
- 查看数据集前10行:
df_creditcarddata.head()
- 查看数据集维度:
df_creditcarddata.shape
- 查看所有列名:
df_creditcarddata.columns
- 查看每列的数据类型:
df_creditcarddata.types
在H2O DataFrame中,分类变量显示为
enum
。
6.
分析目标变量分布
:目标变量为
default.payment.next.month
,用于指示客户是否违约。使用以下命令查看目标变量两类的分布情况:
df_creditcarddata['default.payment.next.month'].table()
该命令会返回目标变量中类别1和0的数量。
7.
移除不需要的列
:由于
ID
列对于预测建模没有帮助,使用以下命令将其从DataFrame中移除:
df_creditcarddata = df_creditcarddata.drop(["ID"], axis = 1)
-
分析数值变量分布
:使用
hist()方法分析数值变量的分布:
import pylab as pl
df_creditcarddata[['AGE','BILL_AMT1','BILL_AMT2','BILL_AMT3','BILL_AMT4','BILL_AMT5','BILL_AMT6', 'LIMIT_BAL']].as_data_frame().hist(figsize=(20,20))
pl.show()
- 按不同类别分析目标变量分布 :查看违约者和非违约者在性别、教育程度和婚姻状况等不同类别下的分布情况:
# Defaulters by Gender
columns = ["default.payment.next.month","SEX"]
default_by_gender = df_creditcarddata.group_by(by=columns).count(na ="all")
print(default_by_gender.get_frame())
# Defaulters by education
columns = ["default.payment.next.month","EDUCATION"]
default_by_education = df_creditcarddata.group_by(by=columns).count(na ="all")
print(default_by_education.get_frame())
# Defaulters by MARRIAGE
columns = ["default.payment.next.month","MARRIAGE"]
default_by_marriage = df_creditcarddata.group_by(by=columns).count(na ="all")
print(default_by_marriage.get_frame())
- 将分类变量转换为因子类型 :
df_creditcarddata['SEX'] = df_creditcarddata['SEX'].asfactor()
df_creditcarddata['EDUCATION'] = df_creditcarddata['EDUCATION'].asfactor()
df_creditcarddata['MARRIAGE'] = df_creditcarddata['MARRIAGE'].asfactor()
df_creditcarddata['PAY_0'] = df_creditcarddata['PAY_0'].asfactor()
df_creditcarddata['PAY_2'] = df_creditcarddata['PAY_2'].asfactor()
df_creditcarddata['PAY_3'] = df_creditcarddata['PAY_3'].asfactor()
df_creditcarddata['PAY_4'] = df_creditcarddata['PAY_4'].asfactor()
df_creditcarddata['PAY_5'] = df_creditcarddata['PAY_5'].asfactor()
df_creditcarddata['PAY_6'] = df_creditcarddata['PAY_6'].asfactor()
同时,将二分目标变量
default.payment.next.month
也编码为因子变量,并使用
levels()
方法检查目标变量的类别:
df_creditcarddata['default.payment.next.month'] = df_creditcarddata['default.payment.next.month'].asfactor()
df_creditcarddata['default.payment.next.month'].levels()
- 定义预测变量和目标变量 :
predictors = ['LIMIT_BAL','SEX','EDUCATION','MARRIAGE','AGE','PAY_0','PAY_2','PAY_3', 'PAY_4','PAY_5','PAY_6','BILL_AMT1','BILL_AMT2','BILL_AMT3','BILL_AMT4','BILL_AMT5','BILL_AMT6','PAY_AMT1','PAY_AMT2','PAY_AMT3','PAY_AMT4','PAY_AMT5','PAY_AMT6']
target = 'default.payment.next.month'
-
拆分数据集
:使用
split_frame()方法将DataFrame拆分为训练集和测试集:
splits = df_creditcarddata.split_frame(ratios=[0.7], seed=1)
将拆分结果分为训练集和测试集:
train = splits[0]
test = splits[1]
3. 模型训练
接下来,我们将使用前面提到的算法训练模型,具体步骤如下:
3.1 广义线性模型(GLM)
我们将构建三个GLM模型:
1.
使用默认参数的GLM模型
:
GLM_default_settings = H2OGeneralizedLinearEstimator(family='binomial', model_id='GLM_default',nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True)
GLM_default_settings.train(x = predictors, y = target, training_frame = train)
H2OGeneralizedLinearEstimator
用于拟合广义线性模型,可处理回归和分类任务。对于回归问题,返回
H2ORegressionModel
子类;对于分类问题,返回
H2OBinomialModel
子类。
2.
使用Lambda搜索(正则化)的GLM模型
:
GLM_regularized = H2OGeneralizedLinearEstimator(family='binomial', model_id='GLM', lambda_search=True, nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True)
GLM_regularized.train(x = predictors, y = target, training_frame = train)
lambda_search
参数为布尔值,设置为
True
时,GLM会先使用最大的lambda值拟合模型(即最大正则化),然后逐步减小lambda值,直到达到最小lambda值,最终的最优模型基于最佳的lambda值。
3.
使用网格搜索的GLM模型
:
hyper_parameters = { 'alpha': [0.001, 0.01, 0.05, 0.1, 1.0], 'lambda': [0.001, 0.01, 0.1, 1] }
search_criteria = { 'strategy': "RandomDiscrete", 'seed': 1, 'stopping_metric': "AUTO", 'stopping_rounds': 5 }
GLM_grid_search = H2OGridSearch(H2OGeneralizedLinearEstimator(family='binomial', nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True), hyper_parameters, grid_id="GLM_grid", search_criteria=search_criteria)
GLM_grid_search.train(x= predictors,y= target, training_frame=train)
使用
get_grid()
方法按AUC值对网格搜索结果进行排序:
GLM_grid_sorted = GLM_grid_search.get_grid(sort_by='auc', decreasing=True)
GLM_grid_sorted
提取网格搜索中的最佳模型并查看其性能:
Best_GLM_model_from_Grid = GLM_grid_sorted.model_ids[0]
Best_GLM_model_from_Grid = h2o.get_model(Best_GLM_model_from_Grid)
print(Best_GLM_model_from_Grid)
从上述代码中,可以评估模型的指标,如均方误差(MSE)、均方根误差(RMSE)、零偏差和残差偏差、AUC、基尼系数以及混淆矩阵等。后续我们将使用网格搜索中的最佳模型进行堆叠集成。
3.2 随机森林模型
- 使用默认参数的随机森林模型 :
RF_default_settings = H2ORandomForestEstimator(model_id = 'RF_D', nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True)
RF_default_settings.train(x = predictors, y = target, training_frame = train)
使用以下命令查看模型的摘要输出:
RF_default_settings.summary()
- 使用网格搜索的随机森林模型 :
hyper_params = {'sample_rate':[0.7, 0.9], 'col_sample_rate_per_tree': [0.8, 0.9], 'max_depth': [3, 5, 9], 'ntrees': [200, 300, 400] }
RF_grid_search = H2OGridSearch(H2ORandomForestEstimator(nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True, stopping_metric = 'AUC',stopping_rounds = 5), hyper_params = hyper_params, grid_id= 'RF_gridsearch')
RF_grid_search.train(x = predictors, y = target, training_frame = train)
按AUC分数对网格搜索结果进行排序:
RF_grid_sorted = RF_grid_search.get_grid(sort_by='auc', decreasing=True)
print(RF_grid_sorted)
提取网格搜索中的最佳模型并查看其性能:
Best_RF_model_from_Grid = RF_grid_sorted.model_ids[0]
Best_RF_model_from_Grid = h2o.get_model(Best_RF_model_from_Grid)
print(Best_RF_model_from_Grid)
3.3 梯度提升机(GBM)模型
- 使用默认参数的GBM模型 :
GBM_default_settings = H2OGradientBoostingEstimator(model_id = 'GBM_default', nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True)
GBM_default_settings.train(x = predictors, y = target, training_frame = train)
- 使用网格搜索的GBM模型 :
hyper_params = {'learn_rate': [0.001,0.01, 0.1], 'sample_rate': [0.8, 0.9], 'col_sample_rate': [0.2, 0.5, 1], 'max_depth': [3, 5, 9]}
GBM_grid_search = H2OGridSearch(H2OGradientBoostingEstimator(nfolds = 10, fold_assignment = "Modulo", keep_cross_validation_predictions = True, stopping_metric = 'AUC', stopping_rounds = 5), hyper_params = hyper_params, grid_id= 'GBM_Grid')
GBM_grid_search.train(x = predictors, y = target, training_frame = train)
按AUC分数对网格搜索结果进行排序:
GBM_grid_sorted = GBM_grid_search.get_grid(sort_by='auc', decreasing=True)
print(GBM_grid_sorted)
提取网格搜索中的最佳模型并查看其性能:
Best_GBM_model_from_Grid = GBM_grid_sorted.model_ids[0]
Best_GBM_model_from_Grid = h2o.get_model(Best_GBM_model_from_Grid)
print(Best_GBM_model_from_Grid)
3.4 堆叠集成模型
我们可以使用
H2OStackedEnsembleEstimator
构建堆叠集成机器学习模型,以提高预测性能。具体步骤如下:
1.
创建最佳模型列表
:
all_models = [Best_GLM_model_from_Grid, Best_RF_model_from_Grid, Best_GBM_model_from_Grid]
- 设置堆叠集成模型 :
ensemble = H2OStackedEnsembleEstimator(model_id = "ensemble", base_models = all_models, metalearner_algorithm = "deeplearning")
ensemble.train(y = target, training_frame = train)
- 评估集成模型在测试数据上的性能 :
Ens_model = ensemble.model_performance(test)
Ens_AUC = Ens_model.auc()
- 比较基础学习器在测试数据上的性能 :
# Checking the model performance for all GLM models built
model_perf_GLM_default = GLM_default_settings.model_performance(test)
model_perf_GLM_regularized = GLM_regularized.model_performance(test)
model_perf_Best_GLM_model_from_Grid = Best_GLM_model_from_Grid.model_performance(test)
# Checking the model performance for all RF models built
model_perf_RF_default_settings = RF_default_settings.model_performance(test)
model_perf_Best_RF_model_from_Grid = Best_RF_model_from_Grid.model_performance(test)
# Checking the model performance for all GBM models built
model_perf_GBM_default_settings = GBM_default_settings.model_performance(test)
model_perf_Best_GBM_model_from_Grid = Best_GBM_model_from_Grid.model_performance(test)
获取基础学习器中的最佳AUC:
best_auc = max(model_perf_GLM_default.auc(), model_perf_GLM_regularized.auc(), model_perf_Best_GLM_model_from_Grid.auc(), model_perf_RF_default_settings.auc(), model_perf_Best_RF_model_from_Grid.auc(), model_perf_GBM_default_settings.auc(), model_perf_Best_GBM_model_from_Grid.auc())
print("Best AUC out of all the models performed: ", format(best_auc))
查看堆叠集成模型的AUC:
Ensemble_model = ensemble.model_performance(test)
Ensemble_model = Ensemble_model.auc()
4. 工作原理
我们使用Google Colab进行模型训练。在安装H2O并初始化后,导入所需的库。为了使用H2O库,我们从
h2o.estimators
中导入了
H2OGeneralizedLinearEstimator
、
H2ORandomForestEstimator
和
H2OGradientBoostingEstimator
,并导入
H2OStackedEnsembleEstimator
用于训练堆叠集成模型。
通过挂载Google Drive并使用
h2o.import_file()
读取数据集,创建了一个H2O DataFrame。对H2O DataFrame进行基本操作,如查看维度、前几行和数据类型等。我们的目标变量是
default.payment.next.month
,使用
table()
方法查看其分布情况。由于
ID
列对预测建模无用,使用
drop()
方法将其移除。
接着,我们分析了数值变量的分布,并查看了目标变量在不同类别下的分布。将分类变量和目标变量转换为因子类型,定义了预测变量和目标变量,然后使用
split_frame()
方法将数据集拆分为训练集和测试集。
在模型训练阶段,我们分别使用GLM、随机森林、梯度提升机和堆叠集成方法进行训练。对于GLM模型,分别使用了默认参数、Lambda搜索和网格搜索进行训练;对于随机森林和GBM模型,也使用了默认参数和网格搜索进行训练。最后,使用
H2OStackedEnsembleEstimator
构建堆叠集成模型,并比较了基础学习器和集成模型在测试数据上的性能。
整个过程的流程图如下:
graph TD;
A[准备工作] --> B[安装H2O];
B --> C[导入所需库];
C --> D[初始化H2O];
D --> E[挂载Google Drive并读取数据集];
E --> F[对H2O DataFrame进行基本操作];
F --> G[分析目标变量分布];
G --> H[移除不需要的列];
H --> I[分析数值变量分布];
I --> J[按不同类别分析目标变量分布];
J --> K[将分类变量转换为因子类型];
K --> L[定义预测变量和目标变量];
L --> M[拆分数据集];
M --> N[模型训练];
N --> O[广义线性模型(GLM)];
N --> P[随机森林模型];
N --> Q[梯度提升机(GBM)模型];
N --> R[堆叠集成模型];
O --> O1[使用默认参数的GLM模型];
O --> O2[使用Lambda搜索的GLM模型];
O --> O3[使用网格搜索的GLM模型];
P --> P1[使用默认参数的随机森林模型];
P --> P2[使用网格搜索的随机森林模型];
Q --> Q1[使用默认参数的GBM模型];
Q --> Q2[使用网格搜索的GBM模型];
R --> R1[创建最佳模型列表];
R1 --> R2[设置堆叠集成模型];
R2 --> R3[评估集成模型在测试数据上的性能];
R3 --> R4[比较基础学习器在测试数据上的性能];
通过以上步骤,我们可以使用H2O构建异构集成分类器,准确预测信用卡违约者。在实际应用中,可以根据需要调整模型的参数和超参数,以获得更好的预测性能。
使用H2O构建异构集成分类器预测信用卡违约者
5. 模型参数及超参数详解
在前面的模型训练过程中,我们使用了各种参数和超参数,下面对这些关键参数进行详细解释。
5.1 广义线性模型(GLM)
-
family='binomial':指定模型的分布族为二项分布,适用于二元分类问题,如预测信用卡违约(是或否)。 -
nfolds = 10:进行10折交叉验证,将数据集分成10份,轮流将其中一份作为验证集,其余9份作为训练集,以更准确地评估模型性能。 -
fold_assignment = "Modulo":指定交叉验证的折叠分配策略为模运算,确保数据均匀分配到各个折叠中。 -
keep_cross_validation_predictions = True:保留交叉验证的预测结果,方便后续分析。 -
lambda_search=True:开启Lambda搜索,用于寻找最优的正则化参数λ。通过从最大的lambda值开始,逐步减小,直到找到使模型性能最优的lambda值,避免过拟合。 -
hyper_parameters:在网格搜索中使用的超参数,包括alpha和lambda。alpha控制正则化的类型(L1和L2的混合比例),lambda控制正则化的强度。
5.2 随机森林模型
-
sample_rate:行采样比例,取值范围为0到1,表示对数据进行无放回采样的比例。例如,sample_rate=0.7表示每次构建树时使用70%的数据。 -
col_sample_rate_per_tree:每棵树的列采样比例,同样是无放回采样。用于控制每棵树使用的特征数量,避免过拟合。 -
max_depth:树的最大深度,限制树的生长深度。较深的树可能在训练数据上表现更好,但容易过拟合,泛化能力较差。 -
ntrees:构建的树的数量,增加树的数量通常可以提高模型的性能,但会增加计算时间。
5.3 梯度提升机(GBM)模型
-
learn_rate:学习率,控制模型训练的步长。较小的学习率可以避免过拟合,但会增加计算时间;较大的学习率可能导致模型无法收敛。 -
sample_rate:与随机森林中的sample_rate类似,用于行采样。 -
col_sample_rate:列采样比例,控制每棵树使用的特征数量。 -
max_depth:树的最大深度,作用与随机森林中的max_depth相同。
6. 模型评估指标分析
在模型训练和评估过程中,我们使用了多个指标来评估模型的性能,主要指标如下表所示:
| 指标 | 含义 | 作用 |
|---|---|---|
| MSE(均方误差) | 预测值与真实值之间误差的平方的平均值 | 衡量模型预测的平均误差大小,值越小表示模型预测越准确 |
| RMSE(均方根误差) | MSE的平方根 | 与MSE类似,但更直观地反映误差的大小 |
| Null Deviance(零偏差) | 模型仅使用截距项时的偏差 | 作为基准,用于比较模型的拟合优度 |
| Residual Deviance(残差偏差) | 模型拟合后的偏差 | 反映模型对数据的拟合程度,值越小表示拟合越好 |
| AUC(曲线下面积) | ROC曲线下的面积 | 衡量模型的分类性能,值越接近1表示模型分类能力越强 |
| Gini系数 | 2 * AUC - 1 | 也是衡量模型分类性能的指标,值越接近1表示模型分类能力越强 |
| 混淆矩阵 | 展示模型预测结果与真实标签的交叉表 | 用于分析模型在不同类别上的分类准确性,包括真正例、假正例、真反例和假反例 |
通过这些指标,我们可以全面评估模型的性能,并选择最优的模型进行预测。
7. 实际应用建议
在实际应用中,为了提高模型的预测性能和稳定性,可以考虑以下建议:
1.
数据预处理
:除了将分类变量转换为因子类型外,还可以对数值变量进行标准化或归一化处理,避免特征之间的尺度差异影响模型性能。
2.
超参数调优
:使用更广泛的超参数范围进行网格搜索,或者使用随机搜索、贝叶斯优化等方法,以找到更优的超参数组合。
3.
模型融合
:可以尝试使用更多的基础学习器进行堆叠集成,或者使用不同的集成方法,如Bagging、Boosting等,进一步提高模型的性能。
4.
实时监测
:在实际应用中,定期对模型进行评估和更新,确保模型在新数据上的性能稳定。
8. 总结
本文详细介绍了如何使用H2O构建异构集成分类器来预测信用卡违约者。通过使用台湾信用卡支付违约者数据,我们展示了从数据准备、模型训练到模型评估的完整流程。具体步骤包括安装H2O、导入所需库、初始化H2O、挂载Google Drive并读取数据集、对数据进行预处理、使用GLM、随机森林、梯度提升机和堆叠集成方法进行模型训练,以及使用多种指标评估模型性能。
通过网格搜索和堆叠集成方法,我们可以找到最优的模型参数和组合,提高模型的预测性能。同时,对模型参数和超参数的详细解释,以及实际应用建议,为读者在实际项目中应用这些方法提供了参考。
希望本文能帮助读者更好地理解和应用H2O进行异构集成分类器的构建,准确预测信用卡违约者,为金融风险评估提供有力支持。
整个模型构建和应用的关键点总结如下表:
| 阶段 | 关键点 |
|---|---|
| 准备工作 | 安装H2O、导入库、初始化H2O、读取数据、数据预处理 |
| 模型训练 | GLM(默认参数、Lambda搜索、网格搜索)、随机森林(默认参数、网格搜索)、GBM(默认参数、网格搜索)、堆叠集成 |
| 模型评估 | MSE、RMSE、Null Deviance、Residual Deviance、AUC、Gini系数、混淆矩阵 |
| 实际应用 | 数据预处理、超参数调优、模型融合、实时监测 |
通过遵循这些步骤和建议,读者可以在实际项目中有效地应用H2O构建异构集成分类器,提高信用卡违约预测的准确性。
使用H2O构建分类器预测信用卡违约
超级会员免费看
467

被折叠的 条评论
为什么被折叠?



