{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":4117,"databundleVersionId":46665,"sourceType":"competition"},{"sourceId":3686240,"sourceType":"datasetVersion","datasetId":2205971}],"dockerImageVersionId":30262,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Load Dependencies\n\nfrom fastai.tabular.all import *\nfrom sklearn.datasets import make_multilabel_classification\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nimport os\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n# Импортируем StratifiedKFold для кросс-валидации с сохранением пропорций классов\nfrom sklearn.model_selection import StratifiedKFold\nfold = StratifiedKFold(n_splits=5, shuffle = True, random_state=62)\n\n# Импортируем библиотеки для градиентного бустинга\nfrom lightgbm import LGBMClassifier\nfrom xgboost import XGBClassifier\nfrom catboost import CatBoostClassifier","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-12-21T20:25:10.310124Z","iopub.execute_input":"2024-12-21T20:25:10.310538Z","iopub.status.idle":"2024-12-21T20:25:10.317889Z","shell.execute_reply.started":"2024-12-21T20:25:10.310508Z","shell.execute_reply":"2024-12-21T20:25:10.316773Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"# Загружаем метки классов для тренировочных данных из файла trainLabels.csv\ntrain_labels=pd.read_csv(\"../input/malware-classification/trainLabels.csv\")\n# Загружаем пример файла, используя столбец \"Id\" как индекс\nsample = pd.read_csv(\"../input/malware-classification/sampleSubmission.csv\",index_col=\"Id\")\n# Создаем строку с заголовками столбцов, которая может быть использована для обработки данных\na = '\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0a\",\"0b\",\"0c\",\"0d\",\"0e\",\"0f\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"1a\",\"1b\",\"1c\",\"1d\",\"1e\",\"1f\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"2a\",\"2b\",\"2c\",\"2d\",\"2e\",\"2f\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"3a\",\"3b\",\"3c\",\"3d\",\"3e\",\"3f\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"4a\",\"4b\",\"4c\",\"4d\",\"4e\",\"4f\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"5a\",\"5b\",\"5c\",\"5d\",\"5e\",\"5f\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"6a\",\"6b\",\"6c\",\"6d\",\"6e\",\"6f\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"7a\",\"7b\",\"7c\",\"7d\",\"7e\",\"7f\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"8a\",\"8b\",\"8c\",\"8d\",\"8e\",\"8f\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"9a\",\"9b\",\"9c\",\"9d\",\"9e\",\"9f\",\"a0\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"a6\",\"a7\",\"a8\",\"a9\",\"aa\",\"ab\",\"ac\",\"ad\",\"ae\",\"af\",\"b0\",\"b1\",\"b2\",\"b3\",\"b4\",\"b5\",\"b6\",\"b7\",\"b8\",\"b9\",\"ba\",\"bb\",\"bc\",\"bd\",\"be\",\"bf\",\"c0\",\"c1\",\"c2\",\"c3\",\"c4\",\"c5\",\"c6\",\"c7\",\"c8\",\"c9\",\"ca\",\"cb\",\"cc\",\"cd\",\"ce\",\"cf\",\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\",\"d6\",\"d7\",\"d8\",\"d9\",\"da\",\"db\",\"dc\",\"dd\",\"de\",\"df\",\"e0\",\"e1\",\"e2\",\"e3\",\"e4\",\"e5\",\"e6\",\"e7\",\"e8\",\"e9\",\"ea\",\"eb\",\"ec\",\"ed\",\"ee\",\"ef\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"fa\",\"fb\",\"fc\",\"fd\",\"fe\",\"ff\",\"??\",\"size\",\"Class\"'","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:10.319847Z","iopub.execute_input":"2024-12-21T20:25:10.320310Z","iopub.status.idle":"2024-12-21T20:25:10.368800Z","shell.execute_reply.started":"2024-12-21T20:25:10.320271Z","shell.execute_reply":"2024-12-21T20:25:10.367815Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#https://openbase.com/python/py7zr\n!pip install py7zr\nimport py7zr\nimport re","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:10.370335Z","iopub.execute_input":"2024-12-21T20:25:10.370627Z","iopub.status.idle":"2024-12-21T20:25:18.760417Z","shell.execute_reply.started":"2024-12-21T20:25:10.370601Z","shell.execute_reply":"2024-12-21T20:25:18.759192Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = !py7zr l \"../input/malware-classification/train.7z\"","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:18.762037Z","iopub.execute_input":"2024-12-21T20:25:18.762418Z","iopub.status.idle":"2024-12-21T20:25:20.253266Z","shell.execute_reply.started":"2024-12-21T20:25:18.762383Z","shell.execute_reply":"2024-12-21T20:25:20.251822Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[:5], len(train)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:20.256062Z","iopub.execute_input":"2024-12-21T20:25:20.256414Z","iopub.status.idle":"2024-12-21T20:25:20.263806Z","shell.execute_reply.started":"2024-12-21T20:25:20.256383Z","shell.execute_reply":"2024-12-21T20:25:20.262762Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Feature Extraction","metadata":{}},{"cell_type":"code","source":"def fileToPanda(df, top, bottom):\n    \"\"\"\n    Преобразует данные из списка строк в DataFrame, разбивает строки на столбцы и переименовывает их.\n    \n    Параметры:\n    - df: список строк, содержащих данные из архива.\n    - top: количество строк, которые нужно пропустить сверху.\n    - bottom: количество строк, которые нужно пропустить снизу.\n    \n    Возвращает:\n    - DataFrame с разобранными данными.\n    \"\"\"\n    # Преобразуем список строк в DataFrame и разбиваем каждую строку на столбцы по запятой\n    df = pd.DataFrame(data=df)[0].str.split(',', expand=True)\n    \n    # Убираем верхние строки, которые не содержат полезной информации\n    df = df.iloc[top:]\n    \n    # Убираем нижние строки, которые не содержат полезной информации\n    df = df.iloc[:-1 * bottom]\n    \n    # Разбиваем первый столбец на отдельные столбцы\n    df = df[0].str.split(expand=True)\n    \n    # Переименовываем столбцы для удобства работы\n    df = df.rename({0: 'Date', 1: 'Time', 2: 'Attr', 3: 'Size', 4: 'Compressed', 5: 'Name'}, axis=1)\n    \n    return df\n\n\ndef makeNameColumns(df):\n    \"\"\"\n    Добавляет столбцы IDName и Filetype на основе имени файла.\n    \n    Параметры:\n    - df: DataFrame с данными.\n    \n    Возвращает:\n    - DataFrame с добавленными столбцами IDName и Filetype.\n    \"\"\"\n    # Добавляем столбцы IDName и Filetype, заполняем их значениями по умолчанию\n    df['IDName'] = 'TBD'\n    df['Filetype'] = 'TBD'\n    \n    # Заполняем пропущенные значения в столбце 'Name' данными из столбца 'Compressed'\n    df.loc[df['Name'].isna(), 'Name'] = df['Compressed']\n    \n    # Разбиваем имя файла на части для извлечения IDName и Filetype\n    for index, row in df.iterrows():\n        try:\n            # Разбиваем имя файла на части (например, \"test/Ig2DB5tSiEy1cJvV0zdw.asm\" -> [\"test\", \"Ig2DB5tSiEy1cJvV0zdw.asm\"])\n            strings = str(row['Name']).split('/')\n            \n            # Разбиваем вторую часть на имя файла и его тип (например, \"Ig2DB5tSiEy1cJvV0zdw.asm\" -> [\"Ig2DB5tSiEy1cJvV0zdw\", \"asm\"])\n            strings = strings[1].split('.')\n            \n            # Заполняем столбцы IDName и Filetype\n            row['IDName'] = strings[0]\n            row['Filetype'] = strings[1]\n        except:\n            # Если произошла ошибка при обработке строки, выводим имя файла\n            print(str(row['Name']))\n    \n    return df\n\n\ndef Merge(df):\n    \"\"\"\n    Объединяет данные о файлах с расширениями .bytes и .asm по общему идентификатору IDName.\n    \n    Параметры:\n    - df: DataFrame с данными.\n    \n    Возвращает:\n    - Объединенный DataFrame.\n    \"\"\"\n    # Создаем DataFrame для файлов с расширением .bytes\n    byte_df = df[df['Filetype'] == 'bytes']\n    \n    # Переименовываем столбец 'Size' в 'SizeByteFile'\n    byte_df = byte_df.rename(columns={\"Size\": \"SizeByteFile\"})\n    \n    # Создаем DataFrame для файлов с расширением .asm\n    asm_df = df[df['Filetype'] == 'asm']\n    \n    # Переименовываем столбец 'Size' в 'SizeAsmFile'\n    asm_df = asm_df.rename(columns={\"Size\": \"SizeAsmFile\"})\n    \n    # Объединяем данные о файлах .bytes и .asm по столбцу IDName\n    df = pd.merge(byte_df, asm_df, on='IDName')\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:20.265383Z","iopub.execute_input":"2024-12-21T20:25:20.265755Z","iopub.status.idle":"2024-12-21T20:25:20.278658Z","shell.execute_reply.started":"2024-12-21T20:25:20.265710Z","shell.execute_reply":"2024-12-21T20:25:20.277575Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Применяем функцию fileToPanda для преобразования данных из архива в DataFrame\n# Пропускаем первые 3 строки (top=3) и последнюю строку (bottom=1), так как они не содержат полезной информации\ntrain_df = fileToPanda(train, 3, 1)\n\n# Применяем функцию makeNameColumns для добавления столбцов IDName и Filetype на основе имени файла\ntrain_df = makeNameColumns(train_df)\n\n# Применяем функцию Merge для объединения данных о файлах с расширениями .bytes и .asm по общему идентификатору IDName\ntrain_df = Merge(train_df)\n\n# Добавляем столбец \"Class\" со значением 11 (по умолчанию) для всех строк\ntrain_df[\"Class\"] = 11\n\n# Выводим первые 5 строк обработанного DataFrame для проверки\ntrain_df[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:20.279780Z","iopub.execute_input":"2024-12-21T20:25:20.280136Z","iopub.status.idle":"2024-12-21T20:25:21.664784Z","shell.execute_reply.started":"2024-12-21T20:25:20.280100Z","shell.execute_reply":"2024-12-21T20:25:21.663837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainlabels = pd.read_csv('../input/malware-classification/trainLabels.csv')","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:21.665887Z","iopub.execute_input":"2024-12-21T20:25:21.666260Z","iopub.status.idle":"2024-12-21T20:25:21.683377Z","shell.execute_reply.started":"2024-12-21T20:25:21.666223Z","shell.execute_reply":"2024-12-21T20:25:21.682460Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Обновляем столбец \"Class\" в train_df на основе данных из trainlabels\n# Для каждой строки в trainlabels проверяем, соответствует ли IDName в train_df значению Id в trainlabels\n# Если соответствует, обновляем значение столбца \"Class\" в train_df на значение из trainlabels\nfor index, row in trainlabels.iterrows():\n    train_df.loc[train_df['IDName'] == row['Id'], 'Class'] = row['Class']\n\n# Выводим первые 5 строк обновленного DataFrame для проверки\ntrain_df[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:21.684707Z","iopub.execute_input":"2024-12-21T20:25:21.685407Z","iopub.status.idle":"2024-12-21T20:25:34.472164Z","shell.execute_reply.started":"2024-12-21T20:25:21.685370Z","shell.execute_reply":"2024-12-21T20:25:34.471245Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Подсчитываем количество вхождений каждого значения в столбце \"Class\" и сортируем результат в порядке возрастания\n# Это позволяет увидеть распределение классов в данных\ntrain_df['Class'].value_counts(sort=True, ascending=True)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.473445Z","iopub.execute_input":"2024-12-21T20:25:34.473747Z","iopub.status.idle":"2024-12-21T20:25:34.481525Z","shell.execute_reply.started":"2024-12-21T20:25:34.473720Z","shell.execute_reply":"2024-12-21T20:25:34.480607Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Идентифицируем индексы строк, где значение столбца \"Class\" равно 11\n# Эти строки соответствуют классу, который мы хотим удалить из данных\ndroppers = train_df[train_df['Class'] == 11].index\n\n# Удаляем строки с индексами, соответствующими классу 11, из DataFrame\n# Параметр inplace=True означает, что изменения будут применены непосредственно к train_df\ntrain_df.drop(droppers, inplace=True)\n\n# Снова подсчитываем количество вхождений каждого значения в столбце \"Class\" после удаления строк\n# Сортируем результат в порядке возрастания\ntrain_df['Class'].value_counts(sort=True, ascending=True)\n\n# Выводим обновленный DataFrame для проверки\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.484641Z","iopub.execute_input":"2024-12-21T20:25:34.484900Z","iopub.status.idle":"2024-12-21T20:25:34.515302Z","shell.execute_reply.started":"2024-12-21T20:25:34.484876Z","shell.execute_reply":"2024-12-21T20:25:34.514376Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from fastai.tabular.all import *\nfrom sklearn.datasets import make_multilabel_classification","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.522392Z","iopub.execute_input":"2024-12-21T20:25:34.522745Z","iopub.status.idle":"2024-12-21T20:25:34.538115Z","shell.execute_reply.started":"2024-12-21T20:25:34.522691Z","shell.execute_reply":"2024-12-21T20:25:34.537163Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#y_names = ['Class_1','Class_2','Class_3','Class_4','Class_5','Class_6','Class_7','Class_8','Class_9']\ntrain=train_df","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.539242Z","iopub.execute_input":"2024-12-21T20:25:34.539544Z","iopub.status.idle":"2024-12-21T20:25:34.548922Z","shell.execute_reply.started":"2024-12-21T20:25:34.539510Z","shell.execute_reply":"2024-12-21T20:25:34.547994Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Преобразуем значения столбцов \"SizeByteFile\" и \"SizeAsmFile\" в целочисленный тип данных (int)\n# Это необходимо для корректного использования этих данных в дальнейшем анализе или моделировании\ntrain.SizeByteFile=train.SizeByteFile.apply(int)\ntrain.SizeAsmFile=train.SizeAsmFile.apply(int)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.550128Z","iopub.execute_input":"2024-12-21T20:25:34.550512Z","iopub.status.idle":"2024-12-21T20:25:34.575798Z","shell.execute_reply.started":"2024-12-21T20:25:34.550459Z","shell.execute_reply":"2024-12-21T20:25:34.574688Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_cols = [\"SizeAsmFile\",\"SizeByteFile\"]\nnum_cols","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.577059Z","iopub.execute_input":"2024-12-21T20:25:34.577676Z","iopub.status.idle":"2024-12-21T20:25:34.585663Z","shell.execute_reply.started":"2024-12-21T20:25:34.577639Z","shell.execute_reply":"2024-12-21T20:25:34.584644Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем случайное разбиение данных на обучающую и валидационную выборки\n# Используем функцию RandomSplitter из библиотеки fastai для создания разбиения\n# valid_pct=0.2 означает, что 20% данных будут использоваться для валидации, а остальные 80% - для обучения\n# range_of(train) возвращает диапазон индексов строк в DataFrame train\nsplits = RandomSplitter(valid_pct=0.2)(range_of(train))\n\nsplits","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.586814Z","iopub.execute_input":"2024-12-21T20:25:34.587064Z","iopub.status.idle":"2024-12-21T20:25:34.601307Z","shell.execute_reply.started":"2024-12-21T20:25:34.587041Z","shell.execute_reply":"2024-12-21T20:25:34.600370Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем объект TabularPandas для подготовки данных к обучению\n# train - исходный DataFrame с данными\n# procs - список процессов для обработки данных:\n#   - Categorify: преобразует категориальные данные в числовые\n#   - Normalize: нормализует непрерывные данные\n# cat_names - список категориальных столбцов (в данном случае нет категориальных столбцов)\n# cont_names - список непрерывных столбцов (num_cols содержит имена непрерывных столбцов)\n# y_block - указываем, что целевая переменная является категориальной\n# y_names - имя целевого столбца (класс вредоносного ПО)\n# splits - разбиение данных на обучающую и валидационную выборки\nto = TabularPandas(train, procs=[Categorify, Normalize],\n                   cat_names=None,\n                   cont_names=num_cols,\n                   y_block=CategoryBlock,\n                   y_names='Class',\n                   splits=splits)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.602632Z","iopub.execute_input":"2024-12-21T20:25:34.602889Z","iopub.status.idle":"2024-12-21T20:25:34.686171Z","shell.execute_reply.started":"2024-12-21T20:25:34.602866Z","shell.execute_reply":"2024-12-21T20:25:34.685168Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем DataLoaders для обучения модели\n# to.dataloaders() создает объект DataLoaders на основе подготовленных данных\n# bs=16 задает размер батча (batch size) - количество элементов, обрабатываемых за одну итерацию\n# .to(\"cuda\") перемещает данные на GPU для ускорения вычислений, если он доступен\ndls = to.dataloaders(bs=16).to(\"cuda\")","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.687513Z","iopub.execute_input":"2024-12-21T20:25:34.687899Z","iopub.status.idle":"2024-12-21T20:25:34.702834Z","shell.execute_reply.started":"2024-12-21T20:25:34.687862Z","shell.execute_reply":"2024-12-21T20:25:34.701987Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Получаем один батч данных из DataLoaders для проверки\n# xb_cat - категориальные данные (в данном случае пустой тензор, так как категориальных данных нет)\n# xb_cont - непрерывные данные\n# yb - целевые метки (классы вредоносного ПО)\nxb_cat, xb_cont, yb = dls.one_batch()\n\n# Выводим формы (shape) полученных тензоров для проверки\n# xb_cat.shape - форма категориальных данных\n# xb_cont.shape - форма непрерывных данных\n# yb.shape - форма целевых меток\nxb_cat.shape, xb_cont.shape, yb.shape","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.704759Z","iopub.execute_input":"2024-12-21T20:25:34.705032Z","iopub.status.idle":"2024-12-21T20:25:34.721130Z","shell.execute_reply.started":"2024-12-21T20:25:34.705007Z","shell.execute_reply":"2024-12-21T20:25:34.720154Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем объект модели для обучения с использованием tabular_learner\n# dls - DataLoaders, созданные ранее\n# metrics=accuracy - метрика для оценки модели (точность)\nlearn = tabular_learner(dls, metrics=accuracy)\n\n# Находим оптимальную скорость обучения (learning rate) с помощью метода lr_find()\n# Этот метод помогает определить наиболее подходящую скорость обучения для минимизации потерь\nlearn.lr_find()","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:34.722421Z","iopub.execute_input":"2024-12-21T20:25:34.722746Z","iopub.status.idle":"2024-12-21T20:25:36.189053Z","shell.execute_reply.started":"2024-12-21T20:25:34.722720Z","shell.execute_reply":"2024-12-21T20:25:36.187926Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Обучаем модель с использованием метода fit_one_cycle\n# 10 - количество эпох (epochs) для обучения\n# 1e-3 - начальная скорость обучения (learning rate)\nlearn.fit_one_cycle(10, 1e-3)\n\n# Размораживаем все слои модели для тонкой настройки (fine-tuning)\n# Это позволяет обучать все параметры модели, а не только последние слои\nlearn.unfreeze()\n\n# Продолжаем обучение модели с новой скоростью обучения (1e-4)\n# Это помогает уточнить параметры модели после первоначального обучения\nlearn.fit_one_cycle(10, 1e-4)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:25:36.190559Z","iopub.execute_input":"2024-12-21T20:25:36.190938Z","iopub.status.idle":"2024-12-21T20:27:05.642203Z","shell.execute_reply.started":"2024-12-21T20:25:36.190899Z","shell.execute_reply":"2024-12-21T20:27:05.641146Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learn.lr_find()","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:05.643543Z","iopub.execute_input":"2024-12-21T20:27:05.643924Z","iopub.status.idle":"2024-12-21T20:27:06.925650Z","shell.execute_reply.started":"2024-12-21T20:27:05.643888Z","shell.execute_reply":"2024-12-21T20:27:06.924562Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learn.fit_one_cycle(10, 1e-4)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:06.927100Z","iopub.execute_input":"2024-12-21T20:27:06.927514Z","iopub.status.idle":"2024-12-21T20:27:51.880991Z","shell.execute_reply.started":"2024-12-21T20:27:06.927466Z","shell.execute_reply":"2024-12-21T20:27:51.879943Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submit","metadata":{"execution":{"iopub.status.busy":"2022-09-21T15:02:11.240083Z","iopub.execute_input":"2022-09-21T15:02:11.240621Z","iopub.status.idle":"2022-09-21T15:02:11.24796Z","shell.execute_reply.started":"2022-09-21T15:02:11.240576Z","shell.execute_reply":"2022-09-21T15:02:11.246588Z"}}},{"cell_type":"code","source":"# Get Test data ready\ntest = !py7zr l \"../input/malware-classification/test.7z\"\ntest[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:51.882423Z","iopub.execute_input":"2024-12-21T20:27:51.882811Z","iopub.status.idle":"2024-12-21T20:27:53.314747Z","shell.execute_reply.started":"2024-12-21T20:27:51.882773Z","shell.execute_reply":"2024-12-21T20:27:53.313534Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df=fileToPanda(test,3,2)\ntest_df=makeNameColumns(test_df)\ntest_df=Merge(test_df)\n# Creates a new column based on sisze\ntest_df.SizeByteFile=test_df.SizeByteFile.apply(int)\ntest_df.SizeAsmFile=test_df.SizeAsmFile.apply(int)\ntest_df[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:53.316395Z","iopub.execute_input":"2024-12-21T20:27:53.316719Z","iopub.status.idle":"2024-12-21T20:27:54.837342Z","shell.execute_reply.started":"2024-12-21T20:27:53.316691Z","shell.execute_reply":"2024-12-21T20:27:54.836265Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:54.838732Z","iopub.execute_input":"2024-12-21T20:27:54.839109Z","iopub.status.idle":"2024-12-21T20:27:54.854672Z","shell.execute_reply.started":"2024-12-21T20:27:54.839073Z","shell.execute_reply":"2024-12-21T20:27:54.853541Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Makes a simpler IDName\n\ntest_df['IDName']='TBD'\nfor index, row in test_df.iterrows():\n    try:\n        strings= str(row['Name'])#\"test/Ig2DB5tSiEy1cJvV0zdw.asm\"\n        strings=strings.split('/')\n        strings=strings[1].split('.')\n        row['IDName']=strings[0]\n    except:\n        print (str(row['Name']))\n","metadata":{}},{"cell_type":"code","source":"dl = learn.dls.test_dl(test_df)","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:54.856072Z","iopub.execute_input":"2024-12-21T20:27:54.856445Z","iopub.status.idle":"2024-12-21T20:27:54.873444Z","shell.execute_reply.started":"2024-12-21T20:27:54.856410Z","shell.execute_reply":"2024-12-21T20:27:54.872401Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds=learn.get_preds(dl=dl)\npreds[0].shape","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:54.878522Z","iopub.execute_input":"2024-12-21T20:27:54.878797Z","iopub.status.idle":"2024-12-21T20:27:56.815116Z","shell.execute_reply.started":"2024-12-21T20:27:54.878771Z","shell.execute_reply":"2024-12-21T20:27:56.814063Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Create Panda\n#px = pd.DataFrame(x.numpy())\npx = pd.DataFrame(preds[0])\npx[\"Id\"]=test_df[\"IDName\"]\npx","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.816487Z","iopub.execute_input":"2024-12-21T20:27:56.816874Z","iopub.status.idle":"2024-12-21T20:27:56.837301Z","shell.execute_reply.started":"2024-12-21T20:27:56.816838Z","shell.execute_reply":"2024-12-21T20:27:56.836407Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"px.columns = ['Prediction1', 'Prediction2', 'Prediction3', 'Prediction4', 'Prediction5', 'Prediction6', 'Prediction7', 'Prediction8', 'Prediction9', 'Id']\npx","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.838533Z","iopub.execute_input":"2024-12-21T20:27:56.838865Z","iopub.status.idle":"2024-12-21T20:27:56.862736Z","shell.execute_reply.started":"2024-12-21T20:27:56.838830Z","shell.execute_reply":"2024-12-21T20:27:56.861653Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Only read certain files; Useful for later\nfilter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')\nwith SevenZipFile('archive.7z', 'r') as archive:\n    allfiles = archive.getnames()\n    selective_files = [f for f in allfiles if filter_pattern.match(f)]\n    archive.extract(targets=selective_files)","metadata":{"execution":{"iopub.status.busy":"2022-09-20T15:50:22.054594Z","iopub.execute_input":"2022-09-20T15:50:22.055076Z","iopub.status.idle":"2022-09-20T15:50:22.292913Z","shell.execute_reply.started":"2022-09-20T15:50:22.055019Z","shell.execute_reply":"2022-09-20T15:50:22.291553Z"}}},{"cell_type":"code","source":"px","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.864158Z","iopub.execute_input":"2024-12-21T20:27:56.864519Z","iopub.status.idle":"2024-12-21T20:27:56.886775Z","shell.execute_reply.started":"2024-12-21T20:27:56.864485Z","shell.execute_reply":"2024-12-21T20:27:56.885715Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final=pd.merge(sample, px, on='Id')\nfinal[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.888169Z","iopub.execute_input":"2024-12-21T20:27:56.888556Z","iopub.status.idle":"2024-12-21T20:27:56.923995Z","shell.execute_reply.started":"2024-12-21T20:27:56.888521Z","shell.execute_reply":"2024-12-21T20:27:56.922981Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final=pd.merge(sample, px, on='Id')\n#Prediction1_x\tPrediction2_x\tPrediction3_x\tPrediction4_x\tPrediction5_x\tPrediction6_x\tPrediction7_x\tPrediction8_x\tPrediction9_x\n#final=final.set_index('Id')\nfinal=final.drop(columns=[\"Prediction1_x\",\"Prediction2_x\",\"Prediction3_x\",\"Prediction4_x\",\"Prediction5_x\",\"Prediction6_x\",\"Prediction7_x\",\"Prediction8_x\",\"Prediction9_x\"])\nfinal.columns = ['Id','Prediction1', 'Prediction2', 'Prediction3', 'Prediction4', 'Prediction5', 'Prediction6', 'Prediction7', 'Prediction8', 'Prediction9']\nfinal","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.925282Z","iopub.execute_input":"2024-12-21T20:27:56.925596Z","iopub.status.idle":"2024-12-21T20:27:56.955191Z","shell.execute_reply.started":"2024-12-21T20:27:56.925571Z","shell.execute_reply":"2024-12-21T20:27:56.954144Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission=final\n# Create \"submission.csv\" file\nsubmission.to_csv('submission.csv', index=False)\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:56.956478Z","iopub.execute_input":"2024-12-21T20:27:56.956803Z","iopub.status.idle":"2024-12-21T20:27:57.087586Z","shell.execute_reply.started":"2024-12-21T20:27:56.956777Z","shell.execute_reply":"2024-12-21T20:27:57.086623Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Test is there is something goofy; It should Sum to 1\nsubmission['SUM']= final.iloc[:, :10].sum(axis=1)\nsubmission[:5]","metadata":{"execution":{"iopub.status.busy":"2024-12-21T20:27:57.088886Z","iopub.execute_input":"2024-12-21T20:27:57.089277Z","iopub.status.idle":"2024-12-21T20:27:57.118974Z","shell.execute_reply.started":"2024-12-21T20:27:57.089240Z","shell.execute_reply":"2024-12-21T20:27:57.117929Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# References\nhttps://forums.fast.ai/t/selecting-a-tabular-multi-label-loss-function/99249/3 ","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}