{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":9594138,"sourceType":"datasetVersion","datasetId":5852146}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport warnings # 避免一些可以忽略的报错\nwarnings.filterwarnings('ignore')\nimport random\nimport gc\nimport copy\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm # 进度条\nimport time\nfrom scipy import stats\n\nimport torch\nfrom torch import nn\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.nn.functional as F\nfrom torch.optim import lr_scheduler\nfrom torch.optim.lr_scheduler import _LRScheduler, CosineAnnealingLR\n\nfrom sklearn.metrics import cohen_kappa_score\nimport timm # 预训练神经网络库，可直接调用预训练好的模型\nfrom PIL import Image\nimport albumentations as A # 数据增强库\nfrom albumentations.pytorch import ToTensorV2\n\nfrom collections import defaultdict # 记录 loss lr 等相关参数的变化\n# 改变 终端颜色 方便观察\nfrom colorama import Fore, Back, Style\nb_ = Fore.BLUE\nsr_ = Style.RESET_ALL","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-14T06:42:39.326805Z","iopub.execute_input":"2024-10-14T06:42:39.327214Z","iopub.status.idle":"2024-10-14T06:42:48.707606Z","shell.execute_reply.started":"2024-10-14T06:42:39.327162Z","shell.execute_reply":"2024-10-14T06:42:48.706366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"is_debug = False\n\nclass CONFIG:\n    seed = 308\n    \n    epochs = 10 if not is_debug else 2\n    now_cv = -1\n    \n    train_batch_size = 2\n    valid_batch_size = 4\n    \n    use_length = 300000\n    per_row_use = [300, 600, 1200]\n    par_columns = ['X', 'Y', 'Z', 'enmo', 'anglez', 'non-wear_flag', 'light', 'battery_voltage', \n                   'time_of_day', 'weekday', 'quarter', 'relative_date_PCIAT']\n    \n    n_classes = 4\n    n_folds = 5\n\n    n_workers = os.cpu_count()\n    \n    learning_rate = 1e-3 * train_batch_size / 2\n    weight_decay = 1e-6\n    scheduler = 'CosineAnnealingWithWarmupLR'\n    total_samples = 976\n    T_max = total_samples * 4 // 5 // train_batch_size * epochs \n    min_lr = 1e-6\n    \n    DataParallel = False\n    model_name = \"simple_transformer\"\n    device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n    \n    train_csv = \"/kaggle/input/20241010-cmi-piu-mytrain-csv/CMIPIU_transformer_test.csv\"\n    par_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\n    ckpt_save_path = \"/kaggle/working/output\"","metadata":{"execution":{"iopub.status.busy":"2024-10-14T06:42:48.709483Z","iopub.execute_input":"2024-10-14T06:42:48.710004Z","iopub.status.idle":"2024-10-14T06:42:48.718160Z","shell.execute_reply.started":"2024-10-14T06:42:48.709949Z","shell.execute_reply":"2024-10-14T06:42:48.717104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_seed(seed=308):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    \nset_seed(CONFIG.seed)","metadata":{"execution":{"iopub.status.busy":"2024-10-14T06:42:48.719326Z","iopub.execute_input":"2024-10-14T06:42:48.719709Z","iopub.status.idle":"2024-10-14T06:42:48.751248Z","shell.execute_reply.started":"2024-10-14T06:42:48.719667Z","shell.execute_reply":"2024-10-14T06:42:48.750074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(CONFIG.train_csv)\ntrain","metadata":{"execution":{"iopub.status.busy":"2024-10-14T06:42:48.753560Z","iopub.execute_input":"2024-10-14T06:42:48.754175Z","iopub.status.idle":"2024-10-14T06:42:48.790799Z","shell.execute_reply.started":"2024-10-14T06:42:48.754136Z","shell.execute_reply":"2024-10-14T06:42:48.789775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm.auto import tqdm\n\nparquet_save_path = \"parquet_train\"\nif os.path.exists(parquet_save_path) is False:\n    os.makedirs(parquet_save_path)\n\ndf_len = len(train)\n# df_len = 1\n\nfor idx in tqdm(range(df_len)):\n    row = train.iloc[idx, :]\n    _id = row.id\n    _label = row.label\n\n    df_par = pd.read_parquet(os.path.join(CONFIG.par_path, 'id=' + _id))\n    df_par = df_par.fillna(0.0)\n\n    if len(df_par) < CONFIG.use_length:\n        num_of_zeros = CONFIG.use_length - len(df_par)  # 补齐2行\n        zeros_df = pd.DataFrame(np.zeros((num_of_zeros, df_par.shape[1])), columns=df_par.columns)\n        df_par = pd.concat([df_par, zeros_df], ignore_index=True)\n    elif len(row) > CONFIG.use_length:\n        df_par = df_par.iloc[: CONFIG.use_length, :]\n\n    x_data = []\n    x_data_freq = []\n    for per_row_use in CONFIG.per_row_use:\n        total_data = []\n        data_len = CONFIG.use_length // per_row_use\n        for i in range(data_len):\n            start = i * per_row_use\n            end = (i + 1 ) * per_row_use\n            tmp = df_par.iloc[start: end, :]\n            tmp\n\n            per_data = []\n            for col in CONFIG.par_columns:\n                _mean = np.mean(tmp[col].values) # 平均值\n                _max = np.max(tmp[col].values) # 最大值\n                _min = np.min(tmp[col].values) # 最小值\n                _majority, count = stats.mode(tmp[col].values) # 众数\n                _var = np.var(tmp[col].values) # 方差\n                per_data += [_mean, _max, _min, _majority, _var]\n\n            total_data.append(np.array(per_data))\n        x = np.concatenate([total_data], axis=0) # (1000, 60)\n        \n        # 计算傅里叶变换\n        per_freq = []\n        for i in range(60):\n            amplitudes_fft_result = np.abs(np.fft.fft(x[:, i])) # (1000,)\n            per_freq.append(amplitudes_fft_result)\n        per_freq = np.concatenate([per_freq], axis=0).T # (1000, 60)\n        x = np.concatenate([x, per_freq], axis=1) # (1000, 120)\n\n        y = _label\n\n        # 对 x 按特征进行正则化\n        for i in range(0, x.shape[1], 5):\n            x_tmp = x[:, i: i+5]\n            # 计算每列的均值和标准差\n            X_mean = x_tmp.mean()\n            X_std = x_tmp.std()\n            # Z-score 标准化\n            X_zscore = (x_tmp - X_mean) / (X_std + 1e-6)\n            x[:, i: i+5] = X_zscore\n        x_data.append(x[:, :60])\n        x_data_freq.append(x[:, 60:])\n        \n    x_out = np.zeros((1000, 240))\n    x_out[:, : 60] += x_data[0]\n    x_out[: 500, 60: 120] += x_data[1]\n    x_out[500: 750, 60: 120] += x_data[2]\n    x_out[750:, 60: 120] += x_data[2]\n    \n    x_out[:, 120: 180] += x_data_freq[0]\n    x_out[: 500, 180: 240] += x_data_freq[1]\n    x_out[500: 750, 180: 240] += x_data_freq[2]\n    x_out[750:, 180: 240] += x_data_freq[2]\n\n    np.save(f\"{parquet_save_path}/{_id}.npy\", x_out) # (1000, 240)","metadata":{"execution":{"iopub.status.busy":"2024-10-14T06:42:48.792425Z","iopub.execute_input":"2024-10-14T06:42:48.792842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # cupy 加速运算版\n\n# from tqdm.auto import tqdm\n# import cupy as cp\n\n# parquet_save_path = \"parquet_train\"\n# if os.path.exists(parquet_save_path) is False:\n#     os.makedirs(parquet_save_path)\n\n# df_len = len(train)\n# df_len = 10\n\n# for idx in tqdm(range(df_len)):\n#     row = train.iloc[idx, :]\n#     _id = row.id\n#     _label = row.label\n\n#     df_par = pd.read_parquet(os.path.join(CONFIG.par_path, 'id=' + _id))\n#     df_par = df_par.fillna(0.0)\n\n#     if len(df_par) < CONFIG.use_length:\n#         num_of_zeros = CONFIG.use_length - len(df_par)  # 补齐2行\n#         zeros_df = pd.DataFrame(np.zeros((num_of_zeros, df_par.shape[1])), columns=df_par.columns)\n#         df_par = pd.concat([df_par, zeros_df], ignore_index=True)\n#     elif len(row) > CONFIG.use_length:\n#         df_par = df_par.iloc[: CONFIG.use_length, :]\n\n#     x_data = []\n#     for per_row_use in CONFIG.per_row_use:\n#         total_data = []\n#         data_len = CONFIG.use_length // per_row_use\n#         for i in range(data_len):\n#             start = i * per_row_use\n#             end = (i + 1 ) * per_row_use\n#             tmp = df_par.iloc[start: end, :]\n#             tmp\n\n#             per_data = []\n#             for col in CONFIG.par_columns:\n#                 tmp_col = cp.asarray(tmp[col].values)\n#                 _mean = cp.mean(tmp_col) # 平均值\n#                 _max = cp.max(tmp_col) # 最大值\n#                 _min = cp.min(tmp_col) # 最小值\n#                 _majority, count = stats.mode(tmp[col].values) # 众数\n#                 _majority = cp.asarray(_majority)\n#                 _var = cp.var(tmp_col) # 方差\n#                 per_data += [_mean, _max, _min, _majority, _var]\n\n#             total_data.append(cp.array(per_data))\n#         x = cp.concatenate(total_data, axis=0).reshape(-1, 60) # (1000, 60)\n#         y = _label\n\n#         # 对 x 按特征进行正则化\n#         for i in range(0, 60, 5):\n#             x_tmp = x[:, i: i+5]\n#             # 计算每列的均值和标准差\n#             X_mean = x_tmp.mean()\n#             X_std = x_tmp.std()\n#             # Z-score 标准化\n#             X_zscore = (x_tmp - X_mean) / (X_std + 1e-6)\n#             x[:, i: i+5] = X_zscore\n#         x_data.append(cp.asnumpy(x))\n        \n#     x_out = np.zeros((1000, 120))\n#     x_out[:, :60] += x_data[0]\n#     x_out[: 500, 60:] += x_data[1]\n#     x_out[500: 750, 60:] += x_data[2]\n#     x_out[750:, 60:] += x_data[2]\n\n#     np.save(f\"{parquet_save_path}/{_id}.npy\", x_out)","metadata":{"execution":{"iopub.status.busy":"2024-10-14T06:15:44.103588Z","iopub.execute_input":"2024-10-14T06:15:44.104437Z","iopub.status.idle":"2024-10-14T06:19:57.898349Z","shell.execute_reply.started":"2024-10-14T06:15:44.104391Z","shell.execute_reply":"2024-10-14T06:19:57.897358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!zip -r parquet_train.zip parquet_train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}