16、使用H2O构建异构集成分类器预测信用卡违约者

使用H2O构建分类器预测信用卡违约

使用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
  1. 导入所需库
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
  1. 初始化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)
  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()
  1. 按不同类别分析目标变量分布 :查看违约者和非违约者在性别、教育程度和婚姻状况等不同类别下的分布情况:
# 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())
  1. 将分类变量转换为因子类型
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()
  1. 定义预测变量和目标变量
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'
  1. 拆分数据集 :使用 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 随机森林模型
  1. 使用默认参数的随机森林模型
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()
  1. 使用网格搜索的随机森林模型
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)模型
  1. 使用默认参数的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)
  1. 使用网格搜索的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]
  1. 设置堆叠集成模型
ensemble = H2OStackedEnsembleEstimator(model_id = "ensemble", base_models = all_models, metalearner_algorithm = "deeplearning")
ensemble.train(y = target, training_frame = train)
  1. 评估集成模型在测试数据上的性能
Ens_model = ensemble.model_performance(test)
Ens_AUC = Ens_model.auc()
  1. 比较基础学习器在测试数据上的性能
# 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构建异构集成分类器,提高信用卡违约预测的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值