(7-3-4)金融风险管理实战:制作信贷风控模型
请各位关注本人,请各位注意本文读者人数有限。承诺会持续更新下去。完整代码获取方式为加入QQ群:323140750,请大家共同进步与学习。
7.3.9 创建大模型(Baseline)
该基线模型被设计用于评估机器学习模型性能的基准标准,在此项目中采用逻辑回归(Logistic Regression)作为基准模型。
逻辑回归属于一种广泛应用于机器学习领域的技术,在面对分类问题时尤为常用。为此,请编写以下代码以完成数据预处理工作:这一步骤将涉及填补缺失值以及特征缩放这两个步骤。
# 导入MinMaxScaler和Imputer
from sklearn.preprocessing import MinMaxScaler, Imputer
# 从训练数据中删除目标变量(如果存在)
if 'TARGET' in app_train:
train = app_train.drop(columns=['TARGET'])
else:
train = app_train.copy()
# 提取特征名称列表
features = list(train.columns)
# 复制测试数据
test = app_test.copy()
# 使用中值填充缺失值
imputer = Imputer(strategy='median')
# 将每个特征缩放到0-1的范围
scaler = MinMaxScaler(feature_range=(0, 1))
# 对训练数据进行中值填充和特征缩放
imputer.fit(train)
train = imputer.transform(train)
test = imputer.transform(app_test)
# 对训练和测试数据进行特征缩放
scaler.fit(train)
train = scaler.transform(train)
test = scaler.transform(test)
# 打印处理后的训练和测试数据的形状
print('Training data shape: ', train.shape)
print('Testing data shape: ', test.shape)
上述代码的功能是执行以下数据预处理步骤:
- 当训练数据中包含目标变量'TARGET'时, 会从训练数据中移除该变量, 以便将其作为新的特征使用.
- 获取特征名称列表.
- 生成测试数据的副本.
- 采用中位数填充法, 替代训练和测试数据中的缺失值.
- 将每个特征进行归一化处理, 归一化范围设定为0到1之间, 从而保证各特征具有一致的尺度.
- 输出处理后的新训练和新测试数据的具体维度信息, 便于确认预处理任务已完成.
经过这一系列预处理步骤使得数据能够被准备好并被用来准备并应用到机器学习模型的训练与测试中执行完成后将输出以下内容:
Training data shape: (307511, 240)
Testing data shape: (48744, 240)
基于Scikit-Learn框架的Logistic Regression算法被用来搭建第一个机器学习模型。在优化过程中仅调整了正则化系数C的取值。其中正则化系数C的作用是调节模型复杂度(适当降低C值有助于防止过拟合)。这样做的结果是相比标准Logistic Regression模型具有略微提升的效果(尽管如此它仍作为未来改进的基础提供了最低性能标准)。
# 导入Scikit-Learn中的LogisticRegression
from sklearn.linear_model import LogisticRegression
# 创建具有指定正则化参数的模型
log_reg = LogisticRegression(C=0.0001)
# 在训练数据上训练模型
log_reg.fit(train, train_labels)
对上述代码的具体说明如下:
- 建立一个Logistic Regression模型,并配置其正则化参数C为0.0001。
- 基于给定的训练数据集train以及对应的标签train_labels对模型进行训练。
- 在完成训练后,则可用于预测任务。
这里采用了二元分类逻辑回归模型。经过训练的模型可用于预测目标变量发生的概率。运行后将输出:
LogisticRegression(C=0.0001, class_weight=None, dual=False,
fit_intercept=True, intercept_scaling=1, max_iter=100,
multi_class='ovr', n_jobs=None, penalty='l2', random_state=None,
solver='liblinear', tol=0.0001, verbose=0, warm_start=False)
(3)当前模型已成功完成训练, 下一步骤是利用该模型来进行预测. 我们的任务是计算贷款无法偿还的可能性. 为此目的, 我们将调用该模型的predict_proba方法. 这个操作会生成一个m x 2的数据矩阵, 其中m代表样本数量. 在这个矩阵中, 第一维对应于目标变量取值为0的情形, 第二维则对应于目标变量取值为1的情形(需要注意的是, 每一行中这两个维度的数值之和必然等于1). 根据我们的需求, 需要关注的是贷款无法偿还的情况, 因此应选择第二个维度的数据. 具体而言, 可以通过以下代码实现这一目标:
# 进行预测,确保只选择第二列
log_reg_pred = log_reg.predict_proba(test)[:, 1]
(4)预测结果应当遵循与示例提交文件(sample_submission.csv)相同的格式,并且仅包含两个字段:SK_ID_CURR和TARGET。我们计划根据测试集与预测结果构建一个按照此格式设计的数据框,并将其命名为submit数据框。具体实现代码如下所述。
# 创建提交数据框
submit = app_test[['SK_ID_CURR']]
submit['TARGET'] = log_reg_pred
# 显示前几行数据
submit.head()
该代码的主要作用是从测试数据中提取出SK_ID_CURR字段,并将模型预测的结果(log_reg_pred)作为TARGET字段添加进去。随后通过submit.head()方法展示该数据框的前几项内容以便进行初步验证。执行操作后将会输出相应的结果信息
SK_ID_CURR TARGET
0 100001 0.087750
1 100005 0.163957
2 100013 0.110238
3 100028 0.076575
4 100038 0.154924
模型的预测结果需被保存至CSV文件中;其中每个预测值均表示贷款无法偿还的可能性大小;其取值范围限定在0至1之间;若我们计划利用这些预测来评估申请人的风险;则需设定一个阈值来判断是否属于高风险类别。具体的代码实现将在下文展示。
submit.to_csv('log_reg_baseline.csv', index = False)
在给定的代码环境中,请将submit数据框以名为'log_reg_baseline.csv'的形式导出为CSV文件,并排除索引字段。该CSV文件可用于提交竞赛结果。
7.3.10 优化模型
(1)通过优化前面建立的基准模型的表现能力,我们可以采用更为强大的算法来实现目标。在此处,请注意:我们计划在相同的训练数据集上部署随机森林(Random Forest)以观察其效果变化。随机森林作为一种高效的方法,在大量树的数量下表现出色。因此,在本研究中我们决定仅使用100棵决策树来构建随机森林模型,并参考相关文献中的做法以确保实验结果的一致性与可重复性。
# 导入RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
# 创建随机森林分类器
random_forest = RandomForestClassifier(n_estimators=100, random_state=50, verbose=1, n_jobs=-1)
# 在训练数据上训练模型
random_forest.fit(train, train_labels)
# 提取特征重要性
feature_importance_values = random_forest.feature_importances_
feature_importances = pd.DataFrame({'feature': features, 'importance': feature_importance_values})
# 对测试数据进行预测
predictions = random_forest.predict_proba(test)[:, 1]
上述代码的功能是:
- 引入Scikit-Learn库中的RandomForest分类器对象。
- 构建一个基于随机森林的分类器模型,并包含100个决策树,在设定好固定种子(即50)的基础上实现参数化初始化,并启用详尽的日志记录机制以加快训练速度。
- 利用提供的训练集数据和对应的目标标签对模型进行学习。
- 评估各特征的重要性指标……这些指标量化了各个属性对分类结果的影响程度。
- 通过应用该预测系统到测试样本集上……计算每个样本未偿还贷款的概率估计值。
随机决策树集合是一种高效且灵活的集成模型,在不同领域的机器学习问题中普遍展现出优异的性能。运行该模型后能够生成相应的预测结果。
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 32.7s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 1.2min finished
[Parallel(n_jobs=4)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=4)]: Done 42 tasks | elapsed: 0.6s
[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed: 1.4s finished
(2)创建一个提交数据框提交模型,具体实现代码如下所示。
submit = app_test[['SK_ID_CURR']]
submit['TARGET'] = predictions
#保存提交数据框
submit.to_csv('random_forest_baseline.csv', index=False)
执行操作3后将返回以下结果:该结果表明,在提交该模型时预期准确率为约0.678次测试所得出的分数较基线模型而言有所提升;其优势在于能够有效识别数据间的复杂关联以及各特征的重要性。
This model should score around 0.678 when submitted.
(3)为了考察多项式特征与领域知识是否有助于提升模型表现, 唯一可行的方式是对模型进行训练与验证. 接下来, 可以通过对比分析在引入该等技术后的提交性能与不使用该等技术时的性能差异, 从而评估我们的特征工程效果. 具体实现代码如下所示.
# 获取多项式特征的列名
poly_features_names = list(app_train_poly.columns)
# 填充多项式特征的缺失值
imputer = Imputer(strategy='median')
poly_features = imputer.fit_transform(app_train_poly)
poly_features_test = imputer.transform(app_test_poly)
# 缩放多项式特征
scaler = MinMaxScaler(feature_range=(0, 1))
poly_features = scaler.fit_transform(poly_features)
poly_features_test = scaler.transform(poly_features_test)
# 创建随机森林分类器
random_forest_poly = RandomForestClassifier(n_estimators=100, random_state=50, verbose=1, n_jobs=-1)
# 在训练数据上训练模型
random_forest_poly.fit(poly_features, train_labels)
# 对测试数据进行预测
predictions = random_forest_poly.predict_proba(poly_features_test)[:, 1]
对上述代码的具体说明如下:
1 提取对应于多项式展开式的列名。
2 采用基于中位数的方法填充多项式展开式的缺失观测值。
3 归一化处理这些系数变量,并将范围限定在0至1之间。
4 首先创建一个随机森林分类器作为学习者对象,并将其树的数量设置为100棵;随后设定随机种子号为50;接着启用详细日志输出功能;最后并利用当前系统可识别的最大数量的计算机处理器核心进行模型构建与学习过程。
5 基于训练数据构建随机森林模型,并将这些预处理后的变量作为输入字段提供给学习算法以完成建模任务。
6 利用生成好的 trained 模型对象对测试集中的样本实例进行预测操作,并计算出每个样本被判定无法偿还贷款的概率估计值。
该方法有助于分析多项式展开中的高阶项特性及其与专业知识相关的特性对模型预测能力的作用,并在执行过程中将输出结果。
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 45.9s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 1.7min finished
[Parallel(n_jobs=4)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=4)]: Done 42 tasks | elapsed: 0.4s
[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed: 0.9s finished
(4)提交优化后的模型,具体实现代码如下所示。
#创建一个提交数据框
submit = app_test[['SK_ID_CURR']]
submit['TARGET'] = predictions
#保存提交数据框
submit.to_csv('random_forest_baseline_engineered.csv', index=False)
当将此模型提交到竞赛时,得分为0.678,与没有工程特征的模型得分完全相同。
(5)基于先前的结果分析可知,在这种特定的数据集和问题设定下,我们提出的改进方案未能显著提升模型性能。这表明多项式展开特性和基于领域知识设计的特殊字段提取方法在当前场景下的作用较为有限。然而,在某些特定的数据分布或问题类型下,通过巧妙的设计或额外的信息提取技术可能会提升模型的表现。随后我们可以着手开发人工提取领域的相关特性,并提供具体的代码实现。
# 删除目标列
app_train_domain = app_train_domain.drop(columns='TARGET')
# 获取领域特征的列名
domain_features_names = list(app_train_domain.columns)
# 填充领域特征的缺失值
imputer = Imputer(strategy='median')
domain_features = imputer.fit_transform(app_train_domain)
domain_features_test = imputer.transform(app_test_domain)
# 缩放领域特征
scaler = MinMaxScaler(feature_range=(0, 1))
domain_features = scaler.fit_transform(domain_features)
domain_features_test = scaler.transform(domain_features_test)
# 创建随机森林分类器
random_forest_domain = RandomForestClassifier(n_estimators=100, random_state=50, verbose=1, n_jobs=-1)
# 在训练数据上训练模型
random_forest_domain.fit(domain_features, train_labels)
# 提取特征重要性
feature_importance_values_domain = random_forest_domain.feature_importances_
feature_importances_domain = pd.DataFrame({'feature': domain_features_names, 'importance': feature_importance_values_domain})
# 对测试数据进行预测
predictions = random_forest_domain.predict_proba(domain_features_test)[:, 1]
对上述代码的具体说明如下:
- 删除目标字段
- 提取领域相关字段名
- 采用中位数填补字段缺失值
- 对特征实施归一化处理(范围:0-1)
- 构建随机森林分类器(参数:决策树数量=100;随机种子=50;启用详尽调试信息输出;并行计算所有可用CPU核心)
- 在训练数据上训练构建好的随机森林模型
- 提取各特征的重要性评分(这些评分反映各变量对预测结果的影响程度)
- 利用已训练好的模型对测试数据集进行还款意愿预测(提取违约概率)
该代码有助于我们分析特定领域特征对模型性能的影响作用,并在执行后会输出结果信息
[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 34.0s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 1.3min finished
[Parallel(n_jobs=4)]: Using backend ThreadingBackend with 4 concurrent workers.
[Parallel(n_jobs=4)]: Done 42 tasks | elapsed: 0.6s
[Parallel(n_jobs=4)]: Done 100 out of 100 | elapsed: 1.4s finished
(6)再次提交模型,具体实现代码如下所示。
#创建一个提交数据框
submit = app_test[['SK_ID_CURR']]
submit['TARGET'] = predictions
#保存提交数据框
submit.to_csv('random_forest_baseline_domain.csv', index=False)
此时提交模型后的得分会有进步。
(7)创建函数plot_feature_importances(),其作用是呈现特征重要性的水平趋势图,并按照其重要性对特征进行排序。该函数接收一个包含特征名称及其对应的数值的数据框作为输入参数,并输出一个按重要性排序的特征重要性数据框。具体代码如下所示。
def plot_feature_importances(df):
# 按照重要性对特征进行排序
df = df.sort_values('importance', ascending=False).reset_index()
# 归一化特征重要性,使其总和为1
df['importance_normalized'] = df['importance'] / df['importance'].sum()
# 绘制特征重要性的水平条形图
plt.figure(figsize=(10, 6))
ax = plt.subplot()
# 需要颠倒索引以绘制最重要的特征在顶部
ax.barh(list(reversed(list(df.index[:15]))),
df['importance_normalized'].head(15),
align='center', edgecolor='k')
# 设置yticks和标签
# 绘图标签
plt.xlabel('Normalized Importance');
plt.title('Feature Importances')
plt.show()
return df
随后使用函数plot_feature_importances()进行随机森林模型中特征重要性分析的详细代码实现步骤如下所示。
# 显示默认特征的特征重要性
feature_importances_sorted = plot_feature_importances(feature_importances)
从图7-14可以看出执行效果如何。通过计算各特征求取其对模型预测能力的影响程度,能够明确各特征求取能力的重要差异,其中数值越大表示该特性在整体系统中的重要性越高。这一图表展示了基于原始特征求取各特征求取能力的重要程度,从而有助于我们识别出对模型性能起到关键作用的关键变量。

图7-14 原始特征的重要性图
如预期所示,在机器学习模型中发现了一些关键的特征变量与EXT_SOURCE及DAYS_BIRTH这两个变量密切相关。通过观察到只有少数几个变量对整个模型的表现具有显著的影响意义后可知,在不降低整体性能的前提下或许可以去除大部分变量(甚至有可能会提升性能)。这种方法并不是分析模型机制或实现降维中最复杂的方式之一,但它确实可以帮助我们认识该模型在预测过程中所关注的重点因素有哪些。
接下来,采用相同的方法来展示手工制造领域的重要属性的具体代码实现。
feature_importances_domain_sorted = plot_feature_importances(feature_importances_domain)
该执行效果通过图7至图15进行展示;这一图表突出了基于领域知识构建的手工选择性特征及其重要性;其中所列述的手工选择性的字段是基于领域的专业知识构建的;同时该方法旨在优化模型性能;此外这些字段是依据贷款数据领域的专业知识开发出来的;同时该图表有助于评估手动选择字段对模型预测的影响程度

图7-15 领域特征重要性图
可以看出,在人工提取的四种特征中均进入前十一名次中的最重要的特征列表中,并且这表明领域特征提取模块运行得非常成功
7.3.11 制作LightGBM模型
轻量级梯度提升机(LightGBM)是一种基于Gradient Boosting Machine算法的高效率分布式开源机器学习框架。该框架由微软公司开发,并在机器学习领域内具有广泛的影响力。与传统方法相比,在处理大规模数据集合时表现出色且运行速度极快;此外该技术还具备占用内存资源较少的特点;整体而言该技术体系以其卓越性能著称其核心优势在于能够高效处理复杂的数据分析任务
- 效率:LightGBM采用了分桶技术和树结构划分方式,在大规模数据处理方面表现出色,并能够轻松处理千万级样本及大量特征。
- 内存占用:该模型采用列式存储方式配合特征压缩技术,在内存受限环境下仍能稳定运行。
- 预测精度:LightGBM在性能与准确性之间实现了良好的平衡,在多项竞赛中均能取得优异成绩。
- 适用场景涵盖:该模型不仅适用于分类问题及回归问题,在多类别分类任务中表现尤为突出。
- 并行与分布式能力:通过并行计算能力和分布式训练机制的应用,在多核CPU环境下可进一步提升训练效率。
就其实质而言,在处理数据科学与机器学习领域的各类场景时,轻量级梯度提升机展现出卓越的能力。这种工具常见于像Kaggle这样的竞赛环境中,并常被用作达成高分目标的关键性模型实例。
开发自定义函数model()以实现基于LightGBM(轻量级梯度提升机)的机器学习模型构建流程
- feature sets:包含TARGET列的训练数据特征集合。
- test feature sets:测试数据特征集合。
- encoding methods:用于对分类变量进行编码的方法可选包括...'.
- fold numbers:交叉验证采用五折方法。
函数model()的具体实现代码如下所示。
from sklearn.model_selection import KFold
from sklearn.metrics import roc_auc_score
import lightgbm as lgb
import gc
def model(features, test_features, encoding='ohe', n_folds=5):
# 提取标识号
train_ids = features['SK_ID_CURR']
test_ids = test_features['SK_ID_CURR']
# 提取训练标签
labels = features['TARGET']
# 移除标识号和目标列
features = features.drop(columns=['SK_ID_CURR', 'TARGET'])
test_features = test_features.drop(columns=['SK_ID_CURR'])
# 独热编码
if encoding == 'ohe':
features = pd.get_dummies(features)
test_features = pd.get_dummies(test_features)
# 按列对齐数据框
features, test_features = features.align(test_features, join='inner', axis=1)
# 没有分类索引需要记录
cat_indices = 'auto'
# 整数标签编码
elif encoding == 'le':
# 创建标签编码器
label_encoder = LabelEncoder()
# 用于存储分类变量索引的列表
cat_indices = []
# 遍历每一列
for i, col in enumerate(features):
if features[col].dtype == 'object':
# 将分类特征映射为整数
features[col] = label_encoder.fit_transform(np.array(features[col].astype(str)).reshape((-1,)))
test_features[col] = label_encoder.transform(np.array(test_features[col].astype(str)).reshape((-1,)))
# 记录分类变量的索引
cat_indices.append(i)
# 捕获编码方案无效的错误
else:
raise ValueError("Encoding must be either 'ohe' or 'le'")
print('Training Data Shape: ', features.shape)
print('Testing Data Shape: ', test_features.shape)
# 提取特征名称
feature_names = list(features.columns)
# 转换为 np 数组
features = np.array(features)
test_features = np.array(test_features)
# 创建 KFold 对象
k_fold = KFold(n_splits=n_folds, shuffle=True, random_state=50)
# 特征重要性数组
feature_importance_values = np.zeros(len(feature_names))
# 测试数据预测结果数组
test_predictions = np.zeros(test_features.shape[0])
# 交叉验证外部验证预测结果数组
out_of_fold = np.zeros(features.shape[0])
# 记录验证和训练分数的列表
valid_scores = []
train_scores = []
# 遍历每个折叠
for train_indices, valid_indices in k_fold.split(features):
# 当前折叠的训练数据
train_features, train_labels = features[train_indices], labels[train_indices]
# 当前折叠的验证数据
valid_features, valid_labels = features[valid_indices], labels[valid_indices]
# 创建模型
model = lgb.LGBMClassifier(n_estimators=10000, objective='binary',
class_weight='balanced', learning_rate=0.05,
reg_alpha=0.1, reg_lambda=0.1,
subsample=0.8, n_jobs=-1, random_state=50)
# 训练模型
model.fit(train_features, train_labels, eval_metric='auc',
eval_set=[(valid_features, valid_labels), (train_features, train_labels)],
eval_names=['valid', 'train'], categorical_feature=cat_indices,
early_stopping_rounds=100, verbose=200)
# 记录最佳迭代次数
best_iteration = model.best_iteration_
# 记录特征重要性
feature_importance_values += model.feature_importances_ / k_fold.n_splits
# 进行预测
test_predictions += model.predict_proba(test_features, num_iteration=best_iteration)[:, 1] / k_fold.n_splits
# 记录外部验证预测结果
out_of_fold[valid_indices] = model.predict_proba(valid_features, num_iteration=best_iteration)[:, 1]
# 记录最佳分数
valid_score = model.best_score_['valid']['auc']
train_score = model.best_score_['train']['auc']
valid_scores.append(valid_score)
train_scores.append(train_score)
# 清理内存
gc.enable()
del model, train_features, valid_features
gc.collect()
# 创建提交数据数据框
submission = pd.DataFrame({'SK_ID_CURR': test_ids, 'TARGET': test_predictions})
# 创建特征重要性数据框
feature_importances = pd.DataFrame({'feature': feature_names, 'importance': feature_importance_values})
# 计算总体验证分数
valid_auc = roc_auc_score(labels, out_of_fold)
# 添加总体分数到指标数据框
valid_scores.append(valid_auc)
train_scores.append(np.mean(train_scores))
# 用于创建验证分数的数据框所需的内容
fold_names = list(range(n_folds))
fold_names.append('overall')
# 指标数据框
metrics = pd.DataFrame({'fold': fold_names,
'train': train_scores,
'valid': valid_scores})
return submission, feature_importances, metrics
# 使用函数进行模型训练和测试
submission, fi, metrics = model(app_train, app_test)
print('Baseline metrics')
print(metrics)
综上所述,此代码段是利用LightGBM模型来进行二元分类的一个典型示例,并且采用交叉验证的方法来评估其性能的基础架构。在此训练阶段中,详细记录了各特征的重要性指标,并据此指导后续的数据分析以及特征优化工作。
从特征集中提取出SK_ID_CURR与TARGET字段,并予以删除。
依据预设编码方案对分类型字段进行编码处理。
建立LightGBM模型并采用交叉验证法进行训练;在建模过程中记录了各折数下的验证指标和训练性能(包括ROC AUC值)以及各特征的重要性评分。
通过已训练完成的模型对象对测试集样本进行预测运算;并统计每折测试集样本上的预测结果表现。
整合所有折数下的测试结果信息后生成最终提交文件。
输出结果包括提交文件、特征重要性评分以及交叉验证的关键指标。
另外,在完成模型评估后还输出了详细的结果报告;报告中包含了各折数下的训练与验证ROC AUC值以及整体水平的ROC AUC表现。
此时执行后会输出:
Training Data Shape: (307511, 239)
Testing Data Shape: (48744, 239)
Training until validation scores don't improve for 100 rounds.
7. [200] valid's auc: 0.754949 train's auc: 0.79887
9. Early stopping, best iteration is:
11. [208] valid's auc: 0.755109 train's auc: 0.80025
13. Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.758539 train's auc: 0.798518
Early stopping, best iteration is:
[217] valid's auc: 0.758619 train's auc: 0.801374
Training until validation scores don't improve for 100 rounds.
23. [200] valid's auc: 0.762652 train's auc: 0.79774
25. [400] valid's auc: 0.762202 train's auc: 0.827288
27. Early stopping, best iteration is:
29. [320] valid's auc: 0.763103 train's auc: 0.81638
31. Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.757496 train's auc: 0.799107
Early stopping, best iteration is:
[183] valid's auc: 0.75759 train's auc: 0.796125
Training until validation scores don't improve for 100 rounds.
41. [200] valid's auc: 0.758099 train's auc: 0.798268
43. Early stopping, best iteration is:
45. [227] valid's auc: 0.758251 train's auc: 0.802746
47. Baseline metrics
49. fold train valid
51. 0 0 0.800250 0.755109
53. 1 1 0.801374 0.758619
55. 2 2 0.816380 0.763103
57. 3 3 0.796125 0.757590
59. 4 4 0.802746 0.758251
61. 5 overall 0.803375 0.758537
(2)绘制特征重要性的可视化图,具体实现代码如下所示。
fi_sorted = plot_feature_importances(fi)
执行效果如图7-16所示。

图7-16 特征重要性的可视化图
(3)保存提交结果到文件baseline_lgb.csv中,具体实现代码如下所示。
submission.to_csv('baseline_lgb.csv', index=False)
基于领域知识特性的模型评估,并对其性能进行详细分析和评估。具体实现代码如下所示。
submission_domain, fi_domain, metrics_domain = model(app_train_domain, app_test_domain)
print('Baseline with domain knowledge features metrics')
print(metrics_domain)
对上述代码的具体说明如下:
- 执行名为model的函数,并将其输入参数设置为来自训练域的数据集app_train_domain和测试域的数据集app_test_domain。该函数用于训练一个机器学习模型并在交叉验证过程中进行评估。
- 拆包函数model的返回值,并依次赋值到三个变量中:submission_domain、fi_domain和metrics_domain。其中submission_domain存储了模型预测的结果信息;fi.domain则记录了特征重要性数据;metrics.domain汇总了模型的各项性能指标。
- 输出一段具有提示性的文本信息。
- 输出包含领域知识特征的基准模型的各项性能指标。
这段代码的核心功能是建立一个包含领域知识特征的机器学习模型,并生成该模型在各项评估指标上的具体表现数据。这些数据有助于分析和理解领域知识特征对模型预测能力的具体影响。
Training Data Shape: (307511, 243)
Testing Data Shape: (48744, 243)
Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.762577 train's auc: 0.804531
Early stopping, best iteration is:
[237] valid's auc: 0.762858 train's auc: 0.810671
Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.765594 train's auc: 0.804304
Early stopping, best iteration is:
[227] valid's auc: 0.765861 train's auc: 0.808665
Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.770139 train's auc: 0.803753
[400] valid's auc: 0.770328 train's auc: 0.834338
Early stopping, best iteration is:
[302] valid's auc: 0.770629 train's auc: 0.820401
Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.765653 train's auc: 0.804487
Early stopping, best iteration is:
[262] valid's auc: 0.766318 train's auc: 0.815066
Training until validation scores don't improve for 100 rounds.
[200] valid's auc: 0.764456 train's auc: 0.804527
Early stopping, best iteration is:
[235] valid's auc: 0.764517 train's auc: 0.810422
Baseline with domain knowledge features metrics
fold train valid
0 0 0.810671 0.762858
1 1 0.808665 0.765861
2 2 0.820401 0.770629
3 3 0.815066 0.766318
4 4 0.810422 0.764517
5 overall 0.813045 0.766050
通过调用函数plot_feature_importances来进行领域知识特征重要性的展示,并使该过程的结果被存储到变量fi_sorted中。具体实现代码如下所示。
fi_sorted = plot_feature_importances(fi_domain)
该代码的主要功能是生成并存储一个根据特征重要性排序的可视化图表(如图7-17所示)。在分析结果中可观察到一些我们所构建的关键属性再次出现在最重要的属性列表中。这有助于深入探究哪些领域知识属性对模型性能的影响具有显著意义。

图7-17 按特征重要性排序的可视化图
本项目已完结:
(7-3-1)金融市场风险管控实践:构建信贷风险控制体系
(7-3-2)金融市场风险管控实践:构建信贷风险控制体系-博客
(7-3-3)金融市场风险管控实践:构建信贷风险控制体系-博客
(7-3-4)金融风险管理策略:构建信用风险预警系统-博客
