<jupyter_start><jupyter_text>Скачать датасет по транзакциям по следующей ссылке: https://ibm.ent.box.com/v/tabformer-data/folder/130747715605 Скачать датасет, разделенный на train, valid, test: https://drive.google.com/file/d/17LCDtr60TU3E4GnGuQlzDp6CFghL16_M/view?usp=sharing  1. Решаем задачу бинарной классификации: является ли клиент фродовым. Транзакции для каждого клиента имеют таргет 'Is Fraud?' и он будет одинкаовым для каждой транзакции клиента.2. Необходимо провести feature engineering3. Выбрать подходящую архитектуру нейронной сети.4. Обучить сеть5. Показать графики обучения и точности модели<jupyter_code>import pandas as pd
import numpy as np
import pickle
data = pd.read_csv('/Users/macbook/Desktop/card_transaction.v1.csv')
data.columns.values
data
with open('/Users/macbook/Desktop/transactions_train_valid_test_splits.pickle', 'rb') as f:
    data = pickle.load(f)
train_data = data['train']
valid_data = data['valid']
test_data = data['test']
len(train_data), len(valid_data), len(test_data)
len(train_data['User'].unique()), len(valid_data['User'].unique()), len(test_data['User'].unique())
np.intersect1d(train_data['User'].unique(), valid_data['User'].unique())
np.intersect1d(train_data['User'].unique(), test_data['User'].unique())
np.intersect1d(valid_data['User'].unique(), test_data['User'].unique())<jupyter_output><empty_output><jupyter_text>Как использовать BatchNorm в RNN сети 1. Создаем класс, который наследуюется от BatchNorm<jupyter_code>class PackedSequenceBatchNorm1d(torch.nn.BatchNorm1d):
    def forward(self, x):

        return torch.nn.utils.rnn.PackedSequence(
            data=super().forward(x.data),
            batch_sizes=x.batch_sizes,
            sorted_indices=x.sorted_indices
        )<jupyter_output><empty_output><jupyter_text>2. В конструктуре создаем объект данного класса<jupyter_code>self.feature_bn = PackedSequenceBatchNorm1d(num_features=self.nrof_features)<jupyter_output><empty_output><jupyter_text>3. Вызываем его в forward с учетом padding последовательности транзакций<jupyter_code>n_output_features = nn.utils.rnn.pack_padded_sequence(output_features.to(self.device), origin_nrof_trans,
                                                enforce_sorted=False, batch_first=True)
bn_output_features = self.feature_bn(bn_output_features)
bn_output_features, _ = nn.utils.rnn.pad_packed_sequence(bn_output_features, batch_first=True)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11358024691358025, 'fraction_numerical': 0.014814814814814815, 'mean_word_length': 6.15, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '263506', 'license': 'MIT', 'n_tokens_mistral': 897, 'n_tokens_neox': 937, 'n_words': 143, 'path': 'HW/hw6_Transactions/Transactions.ipynb', 'repo_name': 'Firyuza/SiriusDL', 'size': '2430'}