CNN在结构化数据上的应用-自动特征提取

CNN在结构化数据上的应用-自动特征提取

基于深度学习的自动化特征工程

机器学习/深度学习模型的真实质量来自广泛的特征工程,而不是来自建模技术本身。虽然特定的机器学习技术可能最适合特定的业务问题/数据集,但功能是任何建模项目的通用驱动程序/关键组件。从可用数据集中提取尽可能多的信息对于创建有效的解决方案至关重要。

在这篇文章中,我将讨论用CNN(卷积神经网络)的结构化数据从结构化数据生成的特征工程的方法,这是一种现代的深度学习模式,广泛用于计算机视觉问题领域。我们还将在一个小数据上测试这个方法,以创建特征。

为何选择自动化特征工程:

传统上,分析师/数据科学家使用领域/业务知识的手工流程来创建特征。它通常被称为手工特征工程。然而在数据科学中,我们不能否认领域知识的重要性,这种类型的特征工程有一些缺点:

1. 乏味:手工特性工程可能是一个乏味的过程。从父变量列表中可以创建多少新特征呢?例如,从日期变量,数据科学家可以创建4个新功能(月,年,小时和日)。然而,另一个数据科学家可以创建5个额外的功能(周末指标、节日季节指标、X-mass月指标、季节性指数、月周数等)。是否与任何其他变量有任何关系/互动?因此,手动特征工程受人类时间限制和想象力的限制:我们根本无法想象每个可能有用的特征。

2. 人为偏差的影响:通常情况下,任何从事特定领域/建模项目的人都会对某些特性产生深刻的偏见(特别是如果它是由早期的分析师创建的!),而不管它是否给模型增加了价值。

这就是自动化特征工程的强大功能。在这里,不能创建任何特征实际上是无限的,没有任何人为偏见。这也捕获了特征之间所有可能的复杂非线性交互。当然,我们可以在任何时间点应用降维/特征选择技术来摆脱冗余/零重要性特征。

CNN的业务问题和相关性

此处的业务目标是根据信用卡所有者的支付状态,过去几个年份(自预测期间的最后6个月)监控的余额和支付历史来预测信用违约的概率。这里为了简单起见,我们忽略了滞后期(通常在系统中用于分析的客户信息提取和数据上载之间存在滞后)。

在这里,我没有在数据中使用cross-sectional components(例如性别,教育等),只使用jept时间序列变量(余额,支付历史等)来引入CNN这个业务问题。本文的目标是在此结构化数据上概念化和实施CNN,并使用CNN模型从此数据生成100个新功能。您可以在此处获取数据(https://github.com/nitsourish/CNN-automated-Feature-Extraction)。

关于数据:

数据集使用一个二元变量“下个月的默认支付”(Yes = 1, No = 0)作为响应变量。这个集合有18个特征(不包括ID):

  • 1:6 = X1预测期间上个月的还款状况; 。。。; X6 =预测期前6个月的还款状况。还款状态的计量标准是:-1 =适当支付; 1 =延迟一个月; 2 =延迟付款两个月; 。。。8 =付款延迟八个月; 9 =九个月及以上的付款延迟。0表示没有交易
  • X7 =参考时间框架上个月的账单结算金额; .... X12 =参考时间框架前6个月的账单金额;
  • X13 =参考时间框架上个月的账单结算金额; .... X18 =参考时间框架前6个月的付款金额;

以CNN格式表示数据:

深度学习方法,特别是CNN,在基于图像的数据领域取得了很大成功,其中数据在规则的像素点阵中提供了清晰的结构拓扑。尽管有关CNN或ConvNet的详细讨论超出了本文的范围。 ,让我们来看看是什么让CNN如此受欢迎?

减少参数(参数共享):在 卷积操作(层)期间,每个输出值(图中的卷积特征)不需要连接到前一层中的每个神经元(图中的图像),但仅限于那些称为接收的神经元字段,当前应用了colvolution内核。卷积层的这种特性称为局部连通性。在卷积上也应用相同的权重,直到下一次更新参数。卷积层的这种特性称为参数共享。与通常的ANN(人工神经网络)结构相比,这些参数的数量显着减少,其中每对输入/输出神经元之间存在连接。

CNN在结构化数据上的应用-自动特征提取

Shift/Translation In-variance:意思是当输入发生变化时,输出也发生变化,但在其他方面保持不变。具体到一个图像,您可以将一个对象识别为一个对象,即使它的外观以某种方式变化。

所以简单地说,要将CNN应用到任何数据上,数据需要以某种方式进行准备,这样就有了局部模式,并且相同的局部模式在任何地方都是相关的。为了具体我们的数据,我们为单个客户提供事件的时间序列视野(余额,支付等),这使数据充满了她的本地模式,因此这些参数可以在客户之间共享。我们只需要准备适合于提供给个别客户的CNN- feature矩阵的数据,就像d * w * n的图像帧矩阵一样(d, w, n是图像帧的深度,宽度,no of channel)。

简单地说,单个客户的m特征、t时间范围和p交易类似于图像特征数组的宽度、深度和通道。对于我们的数据,每个客户的维度都是m*t*p,而对于整个数据都是N*m*t*p。现在这使得原来的结构化数据变成了图像帧类型数据,理想的应用CNN通过卷积运算在客户之间提取复杂的非线性局部模式。

CNN在结构化数据上的应用-自动特征提取

数据准备:

原始数据集由一张贸易零售卡组成。为了使其更具相关性和更具挑战性,我为一个额外的交易创建了虚拟数据集(标记目标变量状态作为原始数据) - 抵押贷款。数据比零售卡数据更稀疏,值可能不是100%合理的。

因此,我们有30k个不同的客户ID和总共6万个观察值,首先是30k观察零售卡,接下来30k是抵押贷款。

包括数据准备代码的详细解决方案位于https://github.com/nitsourish/CNN-automated-Feature-Extraction/blob/master/CNN_feature_extraction.ipynb。这个问题的棘手部分是以格式(图像格式)准备数据,以便我们可以为我们的数据应用CNN.Precisely每个客户的维度将是3(没有特征)6(时间范围) 2(交易),这个维度将有30000帧。因此对于整个数据,它将是30000 * 3(宽度)* 6(深度)* 2(no of channels)的数组。因此,数据将非常适合训练卷积网络。

准备好特定数据后,我们会看到维度:

shape of channel1(retail)data: (30000, 3, 6, 1)

shape of channel2(mortgage)data: (30000, 3, 6, 1)

将这两个数组合并后的数据作为输入卷输入CNN,以提取非线性交互的复杂特征。

shape of input volume(layer)data: (30000, 3, 6, 2)

现在数据看起来像图像帧数据图像像数据(30000图像帧的体积3 * 6 * 2)。现在我们需要以one-hot编码格式将目标变量(下个月的默认付款)映射到客户ID。

X = np.concatenate((retail, mort),axis=3)

Y = event_id[['default payment next month']].values

Y = to_categorical(Y,2)

In our data we have payment default rate is: 28.402671 percent

在数据中,我们有28.40%的payment_default率。虽然事件率不是50%,但我们可以说它是相当平衡的数据。所以不需要做任何重量修正

从CNN中提取特征

为了首先从CNN模型中提取特征,我们需要训练具有最后sigmoid / logistic dense层(此处为维度2)的目标变量的CNN网络。训练网络的目标是通过多次前向和后向迭代来识别网络的正确权重。最终试图最小化二进制交叉熵。在这里,我将使用keras框架与后端tensorflow(tf)。对于我们的业务问题,AUC是评估指标,我们将通过最大化每个时期的AUC值来进行优化(Keras没有默认的AUC指标。但是我们可以利用tf为AUC创建自定义评估函数。)

CNN架构

在到达最后一个sigmoid输出层之前,我们使用4个conv层(conv +激活+池化(可选))和2个FC层(全连接层)构建CNN。

CNN在结构化数据上的应用-自动特征提取

我们训练我们的模型为epochs = 100使用早期停止以防止过度拟合。使用我的NVIDIA GTX GeForce 1060 GPU和val_auc = 0.8317进行训练不到10分钟。

特征提取方法

现在通过使用预先训练的模型,我们可以直接将这些权重应用于数据,删除最后的sigmoid / logistic层(在此问题中直到100维的dense层)。我们可以将此用于同一业务问题的任何新数据计算这些特征。我们需要只是前馈网络,它将直接映射最终权重,以计算某些中间层的特征,而不再重新构建网络。这是一种迁移学习。基于我们对无特征的要求我们可以在任何具有所需尺寸的中间dense层上提取特征。对于这个问题,我们将使用中间模型提取特征直到CNN的'feature_dense'层。

CNN在结构化数据上的应用-自动特征提取

#Preparing Indermediate model-removing last sigmoid layer

intermediate_layer_model = Model(inputs=model.input,outputs=model.get_layer('feature_dense').output)

intermediate_layer_model.summary()

输出层维度为100,因此如果我们预测在具有相同输入维度的新数据上使用此网络,我们可以创建100个新的复杂特征。

#predict to get featured data

feauture_engg_data = intermediate_layer_model.predict(X)

feauture_engg_data = pd.DataFrame(feauture_engg_data)

print('feauture_engg_data shape:', feauture_engg_data.shape)

feauture_engg_data shape: (30000, 100)

我们成功捕获了原始变量之间的100个复杂交互

进一步探索feauture_engg_data

·让我们来看看这些功能是否有价值。虽然有一些更好的方法,为了简单起见,让我们捕获这些新特性与目标变量'下个月的默认支付'的二元关系。虽然分类目标变量相关不是100%正确的方法,但我们将计算所有新值与目标的相关性,作为变量的近似,这对于最终的模型可能很重要。

#Sorting correlation values in decsending order

new_corrs = sorted(new_corrs, key = lambda x: abs(x[1]), reverse = True)

#Let's see top 10 correlation values

new_corrs[:10]

[('PAY_1', 0.32479372847862253),

('PAY_2', 0.26355120167216467),

('PAY_3', 0.2352525137249163),

('feat_78', -0.22173805212223915),

('PAY_4', 0.21661363684242424),

('PAY_5', 0.20414891387616674),

('feat_86', -0.20047655459374053),

('feat_6', -0.19189993720885604),

('PAY_6', 0.1868663616535449),

('feat_3', -0.17394080015462873)]

我们可以看到,4个新创建的变量(feat_78,feat_86,feat_6,feat_3)排在前10位,与“下个月的默认支付”相关(pseudo although)。虽然在此基础上,这些变量的预测能力还无法具体说明,但至少这些变量值得进一步研究。

我们也可以用绝对大小的相关性,来研究最高相关变量的KDE(内核密度评估)的图。

CNN在结构化数据上的应用-自动特征提取

强调CNN进行特征提取

现在关键问题是这个问题为什么CNN /深度学习方法仅用于特征提取。为什么不把它当作分类器呢?主要原因:

局部模式:我们在此业务问题中使用的数据(适用于我们使用结构数据的大多数情况),也包括cross sectional(static)变量,我们将找不到任何局部模式。所以我们不能将CNN作为分类器用在整个数据上。对于保持Shift / Translation Invariance属性的数据,我们可以使用CNN作为最终分类器。

基础设施挑战:建立大规模工业数据并投入生产需要大量的基础设施支持(GPU,AWS等),这可能并非每个组织都可以使用。

模型运行的延迟:即使使用适当的基础设施,正常复杂的深度学习模型的forward propagation也需要比XGBoost,RF,SVM等高效分类器更长的时间。实际上,某些应用需要超快速的实时预测,这是最好的解决方案。案例是用CNN特征提取等自动化技术提取特征,然后添加相对简单的分类器。

CNN在结构化数据上的应用-自动特征提取

自动特征提取+分类器

监管挑战:即使非常注重机器学习/人工智能,特别是银行/保险/金融领域的组织必须在实施预测模型之前通过内部/外部监管流程,并且可能需要经过艰苦的劝说来制定这些最新技术。生产系统。相反,如果最终分类器是传统模型,则可能不存在建模方法论视角的挑战。

改善和前进的道路:

作为现代人工智能和深度学习大师Andrew Ng说,“......应用机器学习基本上就是特征工程。”,创建有意义的特征空间的重要性不容小觑,自动化特征工程技术旨在帮助数据科学家解决功能创建问题,无缝地构建数百个或者原始数据集中的数千个新功能。然而,目的不是取代数据科学家。相反,她将专注于机器学习管道的其他有价值的部分,例如特征选择,探索新方法,将强大的模型提供给生产等。

相关推荐