关于深度学习:端到端的特征转换示例使用三元组损失和-CNN-进行特征提取和转换

12次阅读

共计 3474 个字符,预计需要花费 9 分钟才能阅读完成。

尽管大多数的特色策略都与畛域相干,并且必须针对每个应用程序进行专门调整。但特色工程是操纵原始数据和提取机器学习特色的过程,探索性数据分析 (EDA) 能够应用特色工程技术来可视化数据并在执行机器学习工作之前更好地识别模式和异样值。这是数据迷信的重要一步,能够确保特定机器学习应用程序的预期后果。

应用 EDA 和特色工程的组合具备多种劣势:

  • 进步准确性
  • 缩小训练工夫
  • 缩小过拟合
  • 简化模型

特色工程技术

有多种特色工程办法能够用于机器学习的各种特定利用和数据类型。这些能够包含:

  • 转换——缩放或编码数据以便模型更好地了解
  • 分类编码
  • 特色缩放
  • 特征选择——挑选出不必要或导致模型准确性升高的特色
  • 特色创立——创立从其余特色中提取或联合的新特色,以便对模型更有用
  • 特征提取——通常是某种模式的降维(PCA、ICA 等)
  • 主动编码器

在典型的机器学习我的项目中,数据科学家会应用特色工程技术的组合创立简单的管道,解决数据并为机器学习做好筹备。这个过程通常是机器学习中最繁琐和最须要技能的局部。

端到端的特色转换

简单特色工程管道的一个潜在代替计划是端到端的特色转换。在端到端办法中,机器学习从原始输出数据到输入预测的整个过程是通过一个间断的管道来学习的。端到端管道所需的配置较少,并且能够轻松利用于多种形式的数据。然而应用特色工程的办法能够比端到端办法做得更好,因为它们能够针对特定工作进行更好的调整。

端到端特色工程办法不会取代 EDA。换句话说,端到端的特色转换方法也是一种特色工程,它应用机器学习模型将原始数据间接转换为可用于进步模型准确性的数据。此过程简直不须要对数据进行预处理,并且能够轻松利用于许多畛域。

在 Jean-Yves Franceschi 等人的论文“Unsupervised Scalable Representation Learning for Multivariate Time Series”。通过卷积和三元组损失学习数据的示意,并提出了一种端到端的特色转换方法,这种应用无监督卷积的办法简化并利用于各种数据。

简而言之,他们正在实现一个卷积神经网络,该网络将转换和提取特色,而后将其发送到你抉择的机器学习模型执行预测。通过适当训练,这个 CNN 将可能为咱们的模型提取重要特色,并精确执行其给定工作。

在本文中,我将应用来 Pytorch,sklearn 和 Kaggle 的牛油果价格数据集🥑(https://www.kaggle.com/datase…)来演示这种 CNN 特色工程技术。

首先,须要从 kaggle 下载数据集,并做一些简略的数据筹备,例如删除不须要的特色 / 从 df 中提取咱们的指标列。

df = pd.read_csv("avocado.csv")
df = df.drop(columns=['Unnamed: 0',"Date", "type", "region"])

接下来,咱们须要筹备两个 df 正本。一个正本按咱们所需的目标值列(在本例中为“AveragePrice”)排序,另一个应放弃原样。

df 的排序正本将用于训练咱们的卷积特色工程层,另一个正本将用于训练主模型。

# unsorted training data
y = df["AveragePrice"].to_numpy()
x = df.drop(columns=["AveragePrice"])
# sorted training data
x_s = df.sort_values(by="AveragePrice")
x_s = x_s.drop(columns=["AveragePrice"])

在持续之前,须要将 df 转换为 pytorch 张量。

x = torch.Tensor(x.to_numpy()).reshape(-1,1,9)
x_s = torch.Tensor(x_s.to_numpy()).reshape(-1,1,9)

这就是咱们在将数据输出 CNN 之前须要执行的所有预处理。

下一步是实现咱们将用于特征提取和转换的 CNN。实现非常简单,五个 1D 卷积层,内核大小为 1,收缩减少了 3 倍。当然,这些都是超参数,能够进行试验和改良。

class FeatureEngineering(nn.Module):
    def __init__(self, out):
        super().__init__()
        self.conv1 = nn.LazyConv1d(out,1, dilation=3)
        self.conv2 = nn.LazyConv1d(out,1, dilation=9)
        self.conv3 = nn.LazyConv1d(out,1, dilation=27)
        self.conv4 = nn.LazyConv1d(out,1, dilation=81)
        
        
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        return x

当初咱们能够开始训练 CNN 特色工程网络了!CNN 应用 triplet loss 进行训练,该损失思考了三个变量:anchor、positive 和 negative。anchor 是以后样本。positive 是与 anchor 类似的样本(同一类,或者在咱们的例子中,具备类似的目标值),negative 能够是与 anchor 不同的随机样本。

咱们将应用 2 个随机数来取得 anchor、positive 和 negative。第一个随机索引处的我的项目是 anchor。因为 CNN 训练数据集是按目标值排序的,所以能够间接应用 anchor 之后的样本作为 positive。另一个随机数将用于获取 negative。

iters = 30000
for iter in range(iters):
    indx_1 = np.random.randint(237 - 1)
    indx_2 = np.random.randint(237 - 1)
    
    # anchor
    a = ft(x_s[indx_1])
    # positive
    p = ft(x_s[indx_1 + 1])
    # negative
    n = ft(x_s[indx_2])
    
    # perform triplet loss
    loss = triplet_loss(a,p,n)
    loss.backward()
    with torch.no_grad():
        ft.zero_grad()

在创立和训练 CNN 特色工程层之后,须要应用 CNN 特色工程层来转换特色,并应用 sklearn 的 train_test_split 宰割训练 / 测试数据。

# transform data using fe
trans_x = []
for i in x:
    trans_x.append(ft(torch.Tensor(i)).detach().numpy() )
trans_x = np.array(trans_x)
print(trans_x.shape)
trans_x = trans_x.reshape(-1, 36)

# train test split for transformed data
x_train_trans, x_test_trans, y_train_trans, y_test_trans = train_test_split(trans_x,y,)

# train test split for untransformed data
x = x.reshape(-1, 9)
x_train, x_test, y_train, y_test = train_test_split(x,y)

就是这样!这就是咱们在将转换后的数据输出最终模型之前须要做的所有数据筹备工作!

rg = RandomForestRegressor()
rg.fit(x_train_trans,y_train_trans)

总结

传统的特色工程和数据预处理流程可能既简单又耗时。应用卷积神经网络和三元组损失的端到端特色工程办法是简单特色工程办法的代替办法,能够在简直不须要配置的状况下进步模型的性能。

这些基于 CNN 的特色工程办法能够与任何模型一起应用,并且能够适应简直任何机器学习管道。并且能够尝试不同的超参数以达到最佳成果!

援用:

[1] J. Y. Franceschi, A. Dieuleveut, A. Jaggi, Unsupervised scalable representation learning for multivariate time series, NeurIPS (2019) https://arxiv.org/abs/1901.10738

https://avoid.overfit.cn/post/0c442306b8164f3c857de9769cc4dd42

作者:Ryan Du

正文完
 0