尽管大部分的特征对策都和行业有关,而且务必对于每一个应用软件开展专业调节。 但特征工程是控制初始数据和获取机器学习特征的全过程,探究性数据剖析 (EDA) 可以应用特征工程技术性来数据可视化数据并在实行机器学习每日任务以前能够更好地识别模式和出现异常值。 这也是数据科学合理的关键一步,可以保证特殊机器学习应用软件的预期成果。
应用 EDA 和特征工程的组成具备各种优点:
提升精确性
降低训练时长
降低多重共线性
简单化实体模型
特征工程技术性
有多种多样特征工程方式可以用以机器学习的各类特殊运用和数据种类。这种可以包含:
变换——放缩或编号数据便于实体模型能够更好地了解
归类编号
特征放缩
特征挑选——筛出多余或造成实体模型精确性减少的特征
特征建立——创建从别的特征中获取或融合的新特征,便于模型拟合更有效
特征获取——通常是一种方式的特征提取(PCA、ICA 等)
自动编码器
在常见的机器学习新项目中,数据生物学家会应用特征工程技术性的组成建立比较复杂的管路,解决数据并为机器学习做好准备。这一环节通常是机器学习中最复杂和最必须专业技能的一部分。
端到端的特征变换
繁杂特征工程管路的一个潜在性取代方法是端到端的特征变换。在端到端方式中,机器学习从初始键入数据到导出预测分析的整个过程是根据一个持续的管线来学习培训的。端到端管路需要的硬件配置较少,而且可以简单运用于形式多样的数据。可是应用特征工程的方式 可以比端到端方式做得更强,由于他们可以专门针对特殊每日任务开展更快的调节。
端到端特征工程方式不容易替代 EDA。也就是说,端到端的特征转换规则也是一种特征工程,它应用机器学习实体模型将初始数据立即变换为可用以提升建模精确性的数据。此全过程几乎不用对数据开展预备处理,而且可以简单运用于很多行业。
在 Jean-Yves Franceschi 等人的毕业论文“Unsupervised Scalable Representation Learning for Multivariate Time Series”。根据卷积和三元组损害学习培训数据的表明,并指出了一种端到端的特征转换规则,这类应用无监管卷积神经网络的方式简单化并运用于各种各样数据。
简单点来说,她们已经完成一个卷积神经网络,该互联网将变换和获取特征,随后将其发送至你挑选的机器学习实体模型实行预测分析。通过适度训练,这一 CNN 将能为咱们的实体模型获取关键特征,并精确实行其给出每日任务。
在这篇文章中,我将应用来Pytorch , sklearn 和Kaggle的牛油果价格数据集??(https://www.kaggle.com/datasets/neuromusic/avocado-prices?resource=download)来演试这类 CNN 特征工程技术性。
最先,必须从 kaggle 免费下载数据集,并做一些简易的数据提前准备,例如删掉不用的特征/从df中获取大家的总体目标列。
df = pd.read_csv("avocado.csv")df = df.drop(columns=['Unnamed: 0',"Date", "type", "region"])
下面,大家必须提供2个df团本。 一个副本按大家需要的目标列(在本例中为“AveragePrice”)排列,另一个应维持原状。
df的排列团本将用以训练大家的卷积神经网络特征工程层,另一个团本将用以训练主模型。
# unsorted training datay = df["AveragePrice"].to_numpy()x = df.drop(columns=["AveragePrice"])# sorted training datax_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 = 30000for 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 fetrans_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 datax_train_trans, x_test_trans, y_train_trans, y_test_trans = train_test_split(trans_x,y,)# train test split for untransformed datax = 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