近来,更好的深度学习模型的发展及其从各种数据中提取相关信息的能力,使得在训练算法以识别决定性的模式和发现普通医生无法辨别的临床发现方面创造了更多的可能性。在这个数据科学领域的更多研究最近才开始出现。然而,最近它已经在感兴趣的群众中得到了很多关注。最近的发展导致了某些以前认为不可能实现的结果。 深度学习可以被定义为一种机器学习技术,它教导计算机通过实例学习,就像人类一样。例如,深度学习一直是无人驾驶自动驾驶汽车背后的关键技术,使它们具有识别停车标志或区分行人和灯柱的能力和思维。它也是手机、平板电脑和智能电视等消费设备中许多语音控制技术的关键。在深度学习中,创建的计算机模型可以直接从图像、文本或声音数据中学习执行分类任务。
这些模型可以帮助实现最先进的准确性,有时甚至超过人类水平的表现。模型可以使用大量的标记数据进行训练,其神经网络架构包括几个处理层,这使得网络实际上是 "深度 "的。标记的数据量越大,识别和分类的准确性就越高。例如,创建一个无人驾驶汽车模型需要数百万张图片和数千小时的视频来训练模型,帮助它更好地理解。深度学习也需要大幅提高计算能力。那么,结构化的模型加上高性能的GPU将使深度学习的架构更加高效。当与集群或云计算相结合时,这使人们能够将深度学习网络的训练时间减少到几个小时或更少。模型内的迭代是持续的,直到输出达到可接受的精度水平。
深度学习技术有助于消除传统机器学习技术中通常涉及的一些数据预处理。深度神经网络中存在的输入和输出层被称为可见 层。输入层是深度学习模型摄入数据进行处理的地方,而输出层是对给定问题进行最终预测或分类的地方。现实世界中的深度学习应用是我们这些天日常生活的一部分。在大多数情况下,它们已经被很好地整合到产品和服务中,以至于我们用户有时没有意识到在后台进行的复杂数据处理。总的来说,利用自动特征工程和深度学习的自学能力,这些算法几乎不需要人工干预。这也显示并告诉我们深度学习的巨大潜力,有助于集思广益,开发更多的想法。
什么是RTDL?
RTDL(Revisiting Tabular Deep Learning)是一个开源的Python包,基于实现论文《Revisiting Deep Learning Models for Tabular Data》。该库利用了创建深度学习模型的便利性,可供希望在表格数据中实现深度学习模型的从业者和程序员使用。它还可以作为研究人员与其他传统库的比较基线的来源。鉴于该库的高性能和简单性,它可以帮助未来关于表格DL的工作。它包括一个基于注意力转化器架构的设计。
代码入门
在这篇文章中,我们将使用RTDL在表格数据上实现一个基本的深度学习模型,并预测RMSE分数,这将为我们提供预测精度的变化和模型的相对方差。下面的实现部分是受RTDL创造者的启发,可以通过这里的链接访问。
安装库
为了开始我们的模型创建,我们将首先安装所需的库。可以运行以下几行来完成。
#Installing required libraries
!pip install rtdl
!pip install libzero==0.0.4
我们还要在这里安装libzero包,它是Pytorch的一个零开销库。
导入依赖项
现在我们将导入RTDL库所需的其他依赖项。
#importing the dependencies
import rtdl
import sklearn.datasets
import sklearn.model_selection
import sklearn.preprocessing
import torch
import torch.nn as nn
import torch.nn.functional as F
import zero
加载和处理数据
接下来,我们将加载要处理的数据。我们将使用加州住房数据集,该数据集在sklearn中很容易获得,它包含了来自1990年美国人口普查的住房数据。我们将把它分成训练和测试两部分,并对其中的特征进行预处理。
#importing the dataset
dataset = sklearn.datasets.fetch_california_housing()
X_all = dataset['data'].astype('float32')
y_all = dataset['target'].astype('float32')
X = {}
y = {}
#splitting into train test
X['train'], X['test'], y['train'], y['test'] = sklearn.model_selection.train_test_split(
X_all, y_all, train_size=0.8
)
#for validation
X['train'], X['val'], y['train'], y['val'] = sklearn.model_selection.train_test_split(
X['train'], y['train'], train_size=0.8
)
# Preprocess features present
preprocess = sklearn.preprocessing.StandardScaler().fit(X['train'])
X = {
k: torch.tensor(preprocess.fit_transform(v), device=device)
for k, v in X.items()
}
# applying formula for solving regression problem
y_mean = float(y['train'].mean())
y_std = float(y['train'].std())
y = {
k: torch.tensor((v - y_mean) / y_std, device=device)
for k, v in y.items()
}
我们将应用一个特征转化器,这将有助于通过减少偏差、定义关系、去除异常值等来提高模型的性能。
#Applying Feature Transformer
model = rtdl.FTTransformer.make_default(
n_num_features=X_all.shape[1],
cat_cardinalities=None,
last_layer_query_idx=[-1],
d_out=1,
)
#setting up the optimizer model
model.to(device)
optimizer = (
model.make_default_optimizer()
if isinstance(model, rtdl.FTTransformer)
else torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=weight_decay)
)
最终的模型设置
最后,让我们设置模型管道,这将有助于我们应用特征转换器和指标来计算RMSE值。
#applying the model
def apply_model(x_num, x_cat=None):
# rtdl.FTTransformer expects two inputs: x_num and x_cat
return model(x_num, x_cat) if isinstance(model, rtdl.FTTransformer) else model(x_num)
@torch.no_grad()
def evaluate(part):
model.eval()
#calculating rmse
mse = F.mse_loss(apply_model(X[part]).squeeze(1), y[part]).item()
rmse = mse ** 0.5 * y_std
return rmse
#Setting the batch size
batch_size = 256
train_loader = zero.data.IndexLoader(len(X['train']), batch_size, device=device)
progress = zero.ProgressTracker(patience=100)
print(f 'Test RMSE before training: {evaluate("test"):.4f}')
计算RMSE和最佳验证周期
我们得出最终的输出,并测试模型的指标,同时打印出最佳验证历时值,看看我们的模型能有多好的表现。
#setting epoch size
n_epochs = 50
for epoch in range(1, n_epochs + 1):
for batch_idx in train_loader:
model.train()
optimizer.zero_grad()
x_batch = X['train'][batch_idx]
y_batch = y['train'][batch_idx]
F.mse_loss(apply_model(x_batch).squeeze(1), y_batch).backward()
optimizer.step()
val_rmse = evaluate('val')
test_rmse = evaluate('test')
print(f'Epoch {epoch:03d} | Validation RMSE: {val_rmse:.4f} | Test RMSE: {test_rmse:.4f}', end='')
progress.update(-val_rmse)
if progress.success:
print(' <<< BEST VALIDATION EPOCH', end='')
print()
if progress.fail:
break
输出 :
Epoch 001 | Validation RMSE: 0.8441 | Test RMSE: 0.5852
Epoch 002 | Validation RMSE: 0.8252 | Test RMSE: 0.5731
Epoch 003 | Validation RMSE: 0.8061 | Test RMSE: 0.5749 <<< BEST VALIDATION EPOCH
Epoch 004 | Validation RMSE: 0.7962 | Test RMSE: 0.5685 <<< BEST VALIDATION EPOCH
Epoch 005 | Validation RMSE: 0.8068 | Test RMSE: 0.5722
Epoch 006 | Validation RMSE: 0.8254 | Test RMSE: 0.5689
Epoch 007 | Validation RMSE: 0.7939 | Test RMSE: 0.5705 <<< BEST VALIDATION EPOCH
Epoch 008 | Validation RMSE: 0.7914 | Test RMSE: 0.5724 <<< BEST VALIDATION EPOCH
Epoch 009 | Validation RMSE: 0.8042 | Test RMSE: 0.5596
Epoch 010 | Validation RMSE: 0.8531 | Test RMSE: 0.5759
Epoch 011 | Validation RMSE: 0.7862 | Test RMSE: 0.5678 <<< BEST VALIDATION EPOCH
Epoch 012 | Validation RMSE: 0.7942 | Test RMSE: 0.5651
Epoch 013 | Validation RMSE: 0.7868 | Test RMSE: 0.5715
Epoch 014 | Validation RMSE: 0.7719 | Test RMSE: 0.5812 <<< BEST VALIDATION EPOCH
Epoch 015 | Validation RMSE: 0.7440 | Test RMSE: 0.5695 <<< BEST VALIDATION EPOCH
Epoch 016 | Validation RMSE: 0.7833 | Test RMSE: 0.5657
Epoch 017 | Validation RMSE: 0.8052 | Test RMSE: 0.5711
Epoch 018 | Validation RMSE: 0.7634 | Test RMSE: 0.5750
Epoch 019 | Validation RMSE: 0.7330 | Test RMSE: 0.5661 <<< BEST VALIDATION EPOCH
Epoch 020 | Validation RMSE: 0.7520 | Test RMSE: 0.5582
Epoch 021 | Validation RMSE: 0.8038 | Test RMSE: 0.5611
Epoch 022 | Validation RMSE: 0.7813 | Test RMSE: 0.5636
Epoch 023 | Validation RMSE: 0.7614 | Test RMSE: 0.5764
Epoch 024 | Validation RMSE: 0.7748 | Test RMSE: 0.5704
Epoch 025 | Validation RMSE: 0.7430 | Test RMSE: 0.5589
Epoch 026 | Validation RMSE: 0.7686 | Test RMSE: 0.5487
Epoch 027 | Validation RMSE: 0.7350 | Test RMSE: 0.5523
Epoch 028 | Validation RMSE: 0.7862 | Test RMSE: 0.5596
Epoch 029 | Validation RMSE: 0.7472 | Test RMSE: 0.5727
Epoch 030 | Validation RMSE: 0.7427 | Test RMSE: 0.5603
Epoch 031 | Validation RMSE: 0.7618 | Test RMSE: 0.5583
Epoch 032 | Validation RMSE: 0.7394 | Test RMSE: 0.5573
Epoch 033 | Validation RMSE: 0.7671 | Test RMSE: 0.5607
Epoch 034 | Validation RMSE: 0.7604 | Test RMSE: 0.5633
Epoch 035 | Validation RMSE: 0.7439 | Test RMSE: 0.5540
Epoch 036 | Validation RMSE: 0.7596 | Test RMSE: 0.5533
Epoch 037 | Validation RMSE: 0.7731 | Test RMSE: 0.5621
Epoch 038 | Validation RMSE: 0.7589 | Test RMSE: 0.5584
Epoch 039 | Validation RMSE: 0.7883 | Test RMSE: 0.5617
Epoch 040 | Validation RMSE: 0.7690 | Test RMSE: 0.5644
Epoch 041 | Validation RMSE: 0.7461 | Test RMSE: 0.5623
Epoch 042 | Validation RMSE: 0.7671 | Test RMSE: 0.5659
Epoch 043 | Validation RMSE: 0.7668 | Test RMSE: 0.5668
Epoch 044 | Validation RMSE: 0.7702 | Test RMSE: 0.5544
Epoch 045 | Validation RMSE: 0.7772 | Test RMSE: 0.5570
Epoch 046 | Validation RMSE: 0.7692 | Test RMSE: 0.5698
Epoch 047 | Validation RMSE: 0.7707 | Test RMSE: 0.5696
Epoch 048 | Validation RMSE: 0.7631 | Test RMSE: 0.5704
Epoch 049 | Validation RMSE: 0.7253 | Test RMSE: 0.5638 <<< BEST VALIDATION EPOCH
Epoch 050 | Validation RMSE: 0.7693 | Test RMSE: 0.5623
结束语
在这篇文章中,我们了解了什么是深度学习模型及其重要性,也讨论了这些模型和算法是如何被使用的。我们还探索了RTDL库,并用它实现了一个基本的表格数据的深度学习模型。下面的实现可以作为Colab笔记本找到,并通过这里的链接访问。
学习愉快!
参考文献
The postCreating Deep Learning Models For Tabular Data using RTDLappeared first onAnalytics India Magazine.