{"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"}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport pyarrow.parquet as pq\nimport torch\nfrom torch import nn\nfrom torch.utils.data import DataLoader\n\nBASE_DIR = '/kaggle/input/child-mind-institute-problematic-internet-use'\nOUTPUT_FILE_PATH = '/kaggle/working/submission.csv'\nTRAIN_SER_DIR = os.path.join(BASE_DIR, 'series_train.parquet')\nTEST_SER_DIR = os.path.join(BASE_DIR, 'series_test.parquet')\nTRAIN_CSV_PATH = os.path.join(BASE_DIR, 'train.csv')\nTEST_CSV_PATH = os.path.join(BASE_DIR, 'test.csv')\n\nclass Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n        self.linear_relu_stack = nn.Sequential(\n            nn.Linear(80, 120),\n            nn.ReLU(),\n#             nn.Linear(300, 150),\n#             nn.ReLU(),\n#             nn.Linear(120, 30),\n#             nn.ReLU(),\n#             nn.Linear(80, 40),\n#             nn.ReLU(),\n            nn.Linear(120, 4)\n        )\n        \n    def forward(self, x):\n        return self.linear_relu_stack(x)\n\ndef main():\n    train_data = pd.read_csv(TRAIN_CSV_PATH)\n    columns = [i for i in train_data.columns if i not in ('id', 'sii')]\n\n    map_dict = {'Spring': 0, 'Summer': 1, 'Fall': 2, 'Winter': 3}\n    tr_transformed = train_data.map(lambda x: map_dict.get(x, x))\n    tr_drop_empty_tag = tr_transformed.dropna(subset=['sii'])\n    tr_fill_na = tr_drop_empty_tag.fillna(0)\n    tr_x, tr_tags = tr_fill_na[columns], tr_fill_na['sii']\n    tr_x_scaled = (tr_x - tr_x.mean()) / tr_x.std()\n    tr_data_len, te_data_len = int(len(tr_x_scaled) * 0.8), int(len(tr_x_scaled) * 0.2)\n    tr_x_scaled, te_x_scaled = tr_x_scaled.iloc[:tr_data_len], torch.from_numpy(tr_x_scaled.iloc[tr_data_len:].values).float()\n    tr_tags, te_tags = tr_tags.iloc[:tr_data_len], torch.from_numpy(tr_tags.iloc[tr_data_len:].values).long()\n    print(f'shape tr: {tr_x_scaled.shape}, te: {te_x_scaled.shape}, tr tag: {tr_tags.shape}, te tags: {te_tags.shape}')\n\n    net = Net()\n    loss_fn = nn.CrossEntropyLoss()\n    optimizer = torch.optim.SGD(net.parameters(), momentum=0.9, lr=0.0025)\n    epochs = 300\n    tr_data_len = len(tr_x_scaled)\n    batch_size = 64\n    \n    for epoch in range(epochs):\n        for batch_index in range(0, tr_data_len, 64):\n            tr_batch = tr_x_scaled.iloc[batch_index: batch_index + batch_size]\n            tr_batch_tags = tr_tags.iloc[batch_index: batch_index + batch_size]\n            tr_batch = torch.from_numpy(tr_batch.values).float()\n            tr_batch_tags = torch.from_numpy(tr_batch_tags.values).long()\n            \n            rst = net(tr_batch)\n            loss = loss_fn(rst, tr_batch_tags)\n            loss.backward()\n            optimizer.step()\n            optimizer.zero_grad()\n            \n        if epoch % (epochs // 30) == 0:\n            with torch.no_grad():\n#                 loss = loss.item()\n#                 print(f'epoch: {epoch}, train loss: {loss} {batch_index}/{tr_data_len}')\n                pred = net(te_x_scaled)\n                test_loss = loss_fn(pred, te_tags).item() / te_data_len * batch_size\n                correct = (pred.argmax(1) == te_tags).type(torch.float).sum().item() / te_data_len\n                print(f'epoch: {epoch}, test loss: {test_loss}, accuracy: {correct}')\n            \n    # show some of predict result\n#     print(f'some predict result: {pred.argmax(1)[:15]}')\n    \n    # submit\n    test_data = pd.read_csv(TEST_CSV_PATH)\n    shadow_columns = ['PCIAT-Season', 'PCIAT-PCIAT_01', 'PCIAT-PCIAT_02', 'PCIAT-PCIAT_03', 'PCIAT-PCIAT_04', 'PCIAT-PCIAT_05', 'PCIAT-PCIAT_06', 'PCIAT-PCIAT_07', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_09', 'PCIAT-PCIAT_10', 'PCIAT-PCIAT_11', 'PCIAT-PCIAT_12', 'PCIAT-PCIAT_13', 'PCIAT-PCIAT_14', 'PCIAT-PCIAT_15', 'PCIAT-PCIAT_16', 'PCIAT-PCIAT_17', 'PCIAT-PCIAT_18', 'PCIAT-PCIAT_19', 'PCIAT-PCIAT_20', 'PCIAT-PCIAT_Total']\n    for shadow_col in shadow_columns:\n        if shadow_col not in test_data:\n            test_data[shadow_columns] = 0\n    te_transformed = test_data[columns].map(lambda x: map_dict.get(x, x)).fillna(0)\n    te_scaled = (te_transformed - te_transformed.mean()) / te_transformed.std()\n    te_scaled = torch.from_numpy(te_scaled.values).float()\n#     print(f'te shape: {te_scaled.shape}')\n    with torch.no_grad():\n        pred = net(te_scaled)\n        df_submit = pd.DataFrame({'id': test_data['id'], 'sii': pred.argmax(1)})\n        df_submit.to_csv(OUTPUT_FILE_PATH, index=False)\n\nif __name__ == '__main__':\n    main()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-26T03:11:19.836331Z","iopub.execute_input":"2024-10-26T03:11:19.836886Z","iopub.status.idle":"2024-10-26T03:11:30.236493Z","shell.execute_reply.started":"2024-10-26T03:11:19.836829Z","shell.execute_reply":"2024-10-26T03:11:30.235050Z"},"trusted":true},"execution_count":null,"outputs":[]}]}