{"cells":[{"cell_type":"code","execution_count":1,"id":"883faef4-2410-40e3-aeb3-1eb0cc7b516d","metadata":{"id":"883faef4-2410-40e3-aeb3-1eb0cc7b516d","executionInfo":{"status":"ok","timestamp":1696422379643,"user_tz":-540,"elapsed":507,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["import pandas as pd\n","import numpy as np\n","import matplotlib.pyplot as plt\n"]},{"cell_type":"code","source":["# Colab 마운트도 동시에 수행하자! (이전 강의자료 참고)\n","from google.colab import drive\n","drive.mount('/content/drive')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"w4-lZq9rpwah","executionInfo":{"status":"ok","timestamp":1696422397660,"user_tz":-540,"elapsed":17628,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"0c23d179-8746-4f69-9605-450a9f4e181d"},"id":"w4-lZq9rpwah","execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}]},{"cell_type":"code","source":["!pwd"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Th_0jdYlqW0W","executionInfo":{"status":"ok","timestamp":1696422527232,"user_tz":-540,"elapsed":464,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"f0eaac43-b3dd-4f0b-b335-f3c01a60473b"},"id":"Th_0jdYlqW0W","execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["/content\n"]}]},{"cell_type":"markdown","id":"3ac41a95-4297-4542-a2ce-cbcd11818694","metadata":{"id":"3ac41a95-4297-4542-a2ce-cbcd11818694"},"source":["# Load Dataset"]},{"cell_type":"code","execution_count":7,"id":"a7291ebf-70d1-4d51-97b8-f39b614bf4cf","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":504},"id":"a7291ebf-70d1-4d51-97b8-f39b614bf4cf","executionInfo":{"status":"ok","timestamp":1696422533822,"user_tz":-540,"elapsed":337,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"7daa6c0b-5265-4558-c84b-5d77f7296140"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["   PassengerId  Survived  Pclass  \\\n","0            1         0       3   \n","1            2         1       1   \n","2            3         1       3   \n","3            4         1       1   \n","4            5         0       3   \n","\n","                                                Name     Sex   Age  SibSp  \\\n","0                            Braund, Mr. Owen Harris    male  22.0      1   \n","1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n","2                             Heikkinen, Miss. Laina  female  26.0      0   \n","3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n","4                           Allen, Mr. William Henry    male  35.0      0   \n","\n","   Parch            Ticket     Fare Cabin Embarked  \n","0      0         A/5 21171   7.2500   NaN        S  \n","1      0          PC 17599  71.2833   C85        C  \n","2      0  STON/O2. 3101282   7.9250   NaN        S  \n","3      0            113803  53.1000  C123        S  \n","4      0            373450   8.0500   NaN        S  "],"text/html":["\n","  <div id=\"df-13d9b554-ac6a-4c53-ba28-301cf0085398\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>PassengerId</th>\n","      <th>Survived</th>\n","      <th>Pclass</th>\n","      <th>Name</th>\n","      <th>Sex</th>\n","      <th>Age</th>\n","      <th>SibSp</th>\n","      <th>Parch</th>\n","      <th>Ticket</th>\n","      <th>Fare</th>\n","      <th>Cabin</th>\n","      <th>Embarked</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>3</td>\n","      <td>Braund, Mr. Owen Harris</td>\n","      <td>male</td>\n","      <td>22.0</td>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>A/5 21171</td>\n","      <td>7.2500</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n","      <td>female</td>\n","      <td>38.0</td>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>PC 17599</td>\n","      <td>71.2833</td>\n","      <td>C85</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>1</td>\n","      <td>3</td>\n","      <td>Heikkinen, Miss. Laina</td>\n","      <td>female</td>\n","      <td>26.0</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>STON/O2. 3101282</td>\n","      <td>7.9250</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n","      <td>female</td>\n","      <td>35.0</td>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>113803</td>\n","      <td>53.1000</td>\n","      <td>C123</td>\n","      <td>S</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>0</td>\n","      <td>3</td>\n","      <td>Allen, Mr. William Henry</td>\n","      <td>male</td>\n","      <td>35.0</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>373450</td>\n","      <td>8.0500</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-13d9b554-ac6a-4c53-ba28-301cf0085398')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-13d9b554-ac6a-4c53-ba28-301cf0085398 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-13d9b554-ac6a-4c53-ba28-301cf0085398');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","<div id=\"df-d93a1b33-e5fe-49d9-b42a-31102f69ef94\">\n","  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-d93a1b33-e5fe-49d9-b42a-31102f69ef94')\"\n","            title=\"Suggest charts.\"\n","            style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","  </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","  <script>\n","    async function quickchart(key) {\n","      const quickchartButtonEl =\n","        document.querySelector('#' + key + ' button');\n","      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","      quickchartButtonEl.classList.add('colab-df-spinner');\n","      try {\n","        const charts = await google.colab.kernel.invokeFunction(\n","            'suggestCharts', [key], {});\n","      } catch (error) {\n","        console.error('Error during call to suggestCharts:', error);\n","      }\n","      quickchartButtonEl.classList.remove('colab-df-spinner');\n","      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","    }\n","    (() => {\n","      let quickchartButtonEl =\n","        document.querySelector('#df-d93a1b33-e5fe-49d9-b42a-31102f69ef94 button');\n","      quickchartButtonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","    })();\n","  </script>\n","</div>\n","    </div>\n","  </div>\n"]},"metadata":{},"execution_count":7}],"source":["df_train = pd.read_csv(\"./drive/MyDrive/train.csv\")\n","df_train.head(5)"]},{"cell_type":"code","execution_count":8,"id":"7c5ba4a2-8b96-4dd9-aacc-f739763738e1","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7c5ba4a2-8b96-4dd9-aacc-f739763738e1","executionInfo":{"status":"ok","timestamp":1696422541244,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"d5566925-1b61-46e2-a9d9-95224a894aac"},"outputs":[{"output_type":"stream","name":"stdout","text":["(891, 8) (891,)\n"]}],"source":["# Input Feature 8개 활용\n","num_features = 8\n","x_train = np.zeros([len(df_train), num_features])\n","y_train = df_train[\"Survived\"]\n","\n","print(x_train.shape, y_train.shape)"]},{"cell_type":"code","execution_count":9,"id":"6a420b3e-f754-4eea-ab1e-f5af1e11ebb8","metadata":{"id":"6a420b3e-f754-4eea-ab1e-f5af1e11ebb8","executionInfo":{"status":"ok","timestamp":1696422542379,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["# Sex\n","x_train[:, 0] = df_train[\"Sex\"].map({\"male\": 0, \"female\": 1}).astype(float)\n","# Pclass\n","x_train[:, 1] = df_train[\"Pclass\"].map({3: 0, 2: 1, 1: 2}).astype(float)\n","# Fare\n","x_train[:, 2] = (df_train[\"Fare\"] - df_train[\"Fare\"].mean()) / df_train[\"Fare\"].std()\n","# Embarked\n","x_train[:, 3] = df_train[\"Embarked\"].fillna(\"S\").map({\"S\": 0, \"Q\": 1, \"C\": 2}).astype(float)\n","\n","# Age\n","# 결측치 처리: 훈련 데이터의 평균 나이로 대체\n","x_train[:, 4] = df_train[\"Age\"].fillna(df_train[\"Age\"].mean())\n","\n","# 나이를 연령대별로 그룹화\n","bins = [0, 18, 25, 35, 60, 100]\n","x_train[:, 4] = pd.cut(df_train['Age'].fillna(df_train[\"Age\"].mean()), bins=bins, labels=False)\n","\n","# SibSp (동반한 형제자매 또는 배우자의 수)\n","x_train[:, 5] = df_train[\"SibSp\"]\n","\n","# Parch (동반한 부모 또는 자녀의 수)\n","x_train[:, 6] = df_train[\"Parch\"]\n","\n","# Ticket의 첫 글자를 ASCII 값으로 변환\n","x_train[:, 7] = df_train[\"Ticket\"].apply(lambda x: ord(x[0])).astype(float)"]},{"cell_type":"markdown","id":"a4719a97-315d-4cb3-8923-ad94226220d0","metadata":{"id":"a4719a97-315d-4cb3-8923-ad94226220d0"},"source":["# Logistic Regression Model"]},{"cell_type":"code","execution_count":10,"id":"67341e0e-44f1-4f47-b199-825b651da01d","metadata":{"id":"67341e0e-44f1-4f47-b199-825b651da01d","executionInfo":{"status":"ok","timestamp":1696422543633,"user_tz":-540,"elapsed":2,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["# 초기 가중치 값으로 램던 변수 정의\n","w = np.zeros([x_train.shape[1], 1])\n","b = np.random.rand()"]},{"cell_type":"code","execution_count":11,"id":"72fc506e-53ea-40c6-8e65-82491c723b0e","metadata":{"id":"72fc506e-53ea-40c6-8e65-82491c723b0e","executionInfo":{"status":"ok","timestamp":1696422544539,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["def sigmoid(x):\n","    return 1.0 / (1.0 + np.exp(-x))\n","def hypothesis(w, x, b):\n","    return sigmoid(x.dot(w) + b)\n","def cost_function(h, y):\n","    return -np.mean(y * np.log(h + 1e-8) + (1.0 - y) * np.log(1.0 - h + 1e-8))"]},{"cell_type":"markdown","id":"8ff587fc-3e81-4e46-b343-9de9e909a636","metadata":{"id":"8ff587fc-3e81-4e46-b343-9de9e909a636"},"source":["# Train"]},{"cell_type":"code","execution_count":12,"id":"f943e80b-f03c-4ec3-940b-41c8209a7440","metadata":{"id":"f943e80b-f03c-4ec3-940b-41c8209a7440","executionInfo":{"status":"ok","timestamp":1696422547967,"user_tz":-540,"elapsed":2540,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["epoch = 20000  # 하이퍼파라메타를 설정하자!\n","alpha = 0.002   # 하이퍼파라메타를 설정하자!\n","\n","w = np.zeros([x_train.shape[1], 1])\n","y_train_np = np.array(y_train).reshape(-1, 1)\n","\n","total_loss = []\n","for i in range(epoch):\n","    h = hypothesis(w, x_train, b).reshape(-1, 1)\n","\n","    # 경사 하강법 구현\n","    # 예측한 h에 대하여 실제값 y_train_np와의 오차를 기반으로\n","    # gradient_w 및 gradient_b 값 업데이트함 => 경사 하강법\n","    gradient_w = np.dot(x_train.T, (h - y_train_np)) / y_train_np.size\n","    gradient_b = np.sum(h - y_train_np) / y_train_np.size\n","\n","    w -= alpha * gradient_w\n","    b -= alpha * gradient_b\n","\n","    # 매 epoch 마다 오차(loss)를 계산하고 이 값은 학습을 통해 점차 줄어들음\n","    loss = cost_function(h, y_train_np)\n","    total_loss.append(loss)\n","\n","total_loss = np.array(total_loss)"]},{"cell_type":"markdown","id":"48471614-c1ef-4596-a43a-1ec1b9c34378","metadata":{"id":"48471614-c1ef-4596-a43a-1ec1b9c34378"},"source":["# Result"]},{"cell_type":"code","execution_count":13,"id":"fb7dea50-b694-4fc2-be35-61fee0a7302c","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":430},"id":"fb7dea50-b694-4fc2-be35-61fee0a7302c","executionInfo":{"status":"ok","timestamp":1696422547968,"user_tz":-540,"elapsed":3,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"38eb1c16-2004-4c3f-e9cd-a91afd124ee9"},"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4WElEQVR4nO3deXyU5b3///dMkpnsCdkJ2VllX5QIKm5U4Ni6tFWrHBVLKVr9nrZaK5yeU7TnZ7HFg/0ej7X2nIJ+q63VurbugqACQmWVLRAEAglZCCSTdbLM9fsjychIWIKZ3DOZ1/PxmEcm933N3J/Lm8z99r6v+xqbMcYIAADAAnarCwAAAKGLIAIAACxDEAEAAJYhiAAAAMsQRAAAgGUIIgAAwDIEEQAAYBmCCAAAsEy41QWcjsfjUVlZmeLi4mSz2awuBwAAnAVjjOrq6pSZmSm7/fTnPAI6iJSVlSk7O9vqMgAAwDk4dOiQsrKyTtsmoINIXFycpI6OxMfHW1wNAAA4Gy6XS9nZ2d7j+OkEdBDpuhwTHx9PEAEAIMiczbAKBqsCAADLEEQAAIBlCCIAAMAyBBEAAGAZgggAALAMQQQAAFiGIAIAACxDEAEAAJYhiAAAAMv0SRB54oknlJeXp8jISBUWFmrDhg19sVkAABDg/B5E/vKXv+jee+/VokWLtGnTJo0bN04zZsxQZWWlvzcNAAACnN+DyNKlSzVv3jzdcccdGjlypH73u98pOjpay5Yt8/emAQBAgPNrEGlpadHGjRs1ffr0LzZot2v69Olat27dSe3dbrdcLpfPwx+KK+v14Os79LvV+/zy/gAA4Oz4NYgcPXpU7e3tSk9P91menp6u8vLyk9ovXrxYCQkJ3kd2drZf6iqradLTaw/o9S1lfnl/AABwdgLqrpmFCxeqtrbW+zh06JDVJQEAAD8K9+ebp6SkKCwsTBUVFT7LKyoqlJGRcVJ7p9Mpp9Ppz5IAAEAA8esZEYfDoUmTJmnFihXeZR6PRytWrNCUKVP8uemzYqwuAACAEOfXMyKSdO+99+r222/X+eefr8mTJ+s3v/mNGhoadMcdd/h706dks1m2aQAAcAK/B5GbbrpJVVVV+vnPf67y8nKNHz9eb7/99kkDWAEAQOjxexCRpHvuuUf33HNPX2yqR4zh4gwAAFYKqLtmAABAaAnJIGITg0QAAAgEIRlEAABAYCCIAAAAy4RkEOH2XQAAAkNIBhEAABAYCCIAAMAyIR1EmEYEAABrhWQQYYgIAACBISSDCAAACAwEEQAAYJmQDiJGDBIBAMBKoRlEGCQCAEBACM0gAgAAAkJIBxFu3wUAwFohHUQAAIC1QjKI2BgkAgBAQAjJIAIAAAJDSAcRhogAAGCtkA4iAADAWiEZRGwMEQEAICCEZBABAACBIaSDiGEiEQAALBXSQQQAAFgrJIMIQ0QAAAgMIRlEunBhBgAAa4V0EAEAANYKySBi4/5dAAACQkgGEQAAEBhCO4gwSAQAAEuFdhABAACWCskgwhARAAACQ0gGEQAAEBhCOogwRAQAAGuFdBABAADWCskgwhARAAACQ0gGEQAAEBhCOogYwygRAACsFNJBBAAAWCskgwjziAAAEBhCMoh04cIMAADWCukgAgAArEUQAQAAlvFbEHn44Yc1depURUdHKzEx0V+bOUcMEgEAIBD4LYi0tLTohhtu0F133eWvTXxl3L0LAIC1wv31xg899JAk6emnn/bXJgAAQJBjjAgAALCM386InAu32y232+393eVy+WU7zCMCAEBg6NEZkQULFshms532sXv37nMuZvHixUpISPA+srOzz/m9zoZhJhEAACzVozMi9913n+bMmXPaNgUFBedczMKFC3Xvvfd6f3e5XH4PIwAAwDo9CiKpqalKTU31Vy1yOp1yOp1+e/8uXJkBACAw+G2MSElJiY4dO6aSkhK1t7dry5YtkqQhQ4YoNjbWX5vtEW7fBQDAWn4LIj//+c/1zDPPeH+fMGGCJOmDDz7QZZdd5q/NAgCAIOK323effvppGWNOehBCAABAl5CcR8TG/bsAAASEkAwiXRgjAgCAtUI6iAAAAGsRRAAAgGVCMogwQgQAgMAQkkEEAAAEBoIIAACwDEEEAABYJiSDCNOIAAAQGEIyiHQxTCQCAIClQjqIAAAAaxFEAACAZUIyiNg6ZxLhwgwAANYKySACAAACA0EEAABYhiACAAAsE5JBpGseEe7eBQDAWiEZRAAAQGAgiAAAAMsQRAAAgGVCOogYZhIBAMBSIR1EAACAtQgiAADAMiEZRLh9FwCAwBCSQQQAAAQGgggAALAMQQQAAFgmJIOITR2DRBgiAgCAtUIyiAAAgMBAEAEAAJYhiAAAAMuEZBBhHhEAAAJDSAYRAAAQGAgiAADAMgQRAABgmZAMIl1jRJhJBAAAa4VkEAEAAIGBIAIAACwTkkHEO8U7V2YAALBUSAYRAAAQGAgiAADAMgQRAABgmZAMIt4p3q0tAwCAkBeSQQQAAAQGvwWRAwcOaO7cucrPz1dUVJQGDx6sRYsWqaWlxV+bBAAAQSbcX2+8e/dueTwePfXUUxoyZIi2b9+uefPmqaGhQY8++qi/NgsAAIKI34LIzJkzNXPmTO/vBQUFKioq0pNPPml5EOma4d0wkQgAAJbyWxDpTm1trZKSkk653u12y+12e393uVx9URYAALBInw1WLS4u1uOPP6758+efss3ixYuVkJDgfWRnZ/dVeQAAwAI9DiILFiyQzWY77WP37t0+ryktLdXMmTN1ww03aN68ead874ULF6q2ttb7OHToUM971ANcmAEAwFo9vjRz3333ac6cOadtU1BQ4H1eVlamyy+/XFOnTtXvf//7077O6XTK6XT2tKQe65pHBAAAWKvHQSQ1NVWpqaln1ba0tFSXX365Jk2apOXLl8tuZ9oSAADwBb8NVi0tLdVll12m3NxcPfroo6qqqvKuy8jI8NdmAQBAEPFbEHnvvfdUXFys4uJiZWVl+awLlNtmA6QMAABClt+ulcyZM0fGmG4f1mOQCAAAgYBBGwAAwDIEEQAAYJmQDiKBcZkIAIDQFZJBhHlEAAAIDCEZRAAAQGAgiAAAAMuEZBDpujLDCBEAAKwVkkEEAAAEBoIIAACwTGgHEa7NAABgqZAMIjbu3wUAICCEZBABAACBgSACAAAsE5JBJKzz0oy73aN2DwNFAACwSkgGkczESEU7wtTS5tGeijqrywEAIGSFZBAJD7NrYs4ASdKG/ccsrgYAgNAVkkFEki4sSJIkffJ5tcWVAAAQukI4iCRLktbvPyYP40QAALBEyAaRsVmJiooI07GGFu2pZJwIAABWCNkg4gi36/y8jnEi6/ZxeQYAACuEbBCRvrg8wzgRAACsEdJBZMpgxokAAGClkA4iYwYlKNoRpprGVu0uZ5wIAAB9LaSDSESYXRfkddzGu47LMwAA9LmQDiIS40QAALBSyAeRrnEin3xerbZ2j8XVAAAQWkI+iIwZlKCEqAjVNbdp6+Eaq8sBACCkhHwQCbPbdPGQFEnS6j1HLa4GAIDQEvJBRJKmDesIIh/uqbK4EgAAQgtBRNK0YamSpG2Ha1TT2GJxNQAAhA6CiKSBCVEamhYrj5HWFHP3DAAAfYUg0qnrrAiXZwAA6DsEkU7eILK3SsYw3TsAAH2BINKpMD9JznC7jtQ2q7iy3upyAAAICQSRTpERYZqc3zHd+2ouzwAA0CcIIie4fHiaJGnFrkqLKwEAIDQQRE4w/bx0SdKGA8dU29hqcTUAAPR/BJET5CRHa3h6nNo9Rqv2cFYEAAB/I4h8yfSRHZdn3ttZYXElAAD0fwSRL7my8/LM6j1Vamnj23gBAPAngsiXjM9KVEqsQ3XNbfrHgWNWlwMAQL9GEPkSu92mK0d0nBXh8gwAAP5FEOnG9JEdQeT9XRXMsgoAgB/5NYhcc801ysnJUWRkpAYOHKhbb71VZWVl/txkr7h4SIoiI+w6fLxJO8pcVpcDAEC/5dcgcvnll+uFF15QUVGRXnrpJe3bt0/f/va3/bnJXhHlCPNObvbGZ0csrgYAgP7LZvrw2sPrr7+u6667Tm63WxEREWds73K5lJCQoNraWsXHx/dBhV/4+7Yy3fOnzcpNjtaqn1wmm83Wp9sHACBY9eT4Hd5HNenYsWN67rnnNHXq1FOGELfbLbfb7f3d5bLussgVI9IUGWHXwepG7ShzafSgBMtqAQCgv/L7YNUHHnhAMTExSk5OVklJiV577bVTtl28eLESEhK8j+zsbH+Xd0rRjnAuzwAA4Gc9DiILFiyQzWY77WP37t3e9vfff782b96sd999V2FhYbrttttOeSfKwoULVVtb630cOnTo3HvWC64eO1CS9Ma2I9w9AwCAH/R4jEhVVZWqq6tP26agoEAOh+Ok5YcPH1Z2drbWrl2rKVOmnHFbVo4RkaTGljZN/I/31Nzq0d//z8VcngEA4Cz4dYxIamqqUlNTz6kwj6djyvQTx4EEsq7LM29tL9fftx0hiAAA0Mv8NkZk/fr1+u///m9t2bJFBw8e1MqVK3XzzTdr8ODBZ3U2JFB8fWymJOn1LaXyeLg8AwBAb/JbEImOjtbLL7+sK6+8UsOHD9fcuXM1duxYrV69Wk6n01+b7XVXnpemuMhwldU265P9p78kBQAAesZvt++OGTNGK1eu9Nfb95nIiDB9fexA/XnDIb2yqVRTB6dYXRIAAP0G3zVzFq6fkCVJemt7uZpa2i2uBgCA/oMgchbOzx2g7KQo1bvb9O7OcqvLAQCg3yCInAW73abrxw+SJL2yudTiagAA6D8IImfp+okdl2c+3FOlyrpmi6sBAKB/IIicpfyUGE3MSZTHSC9v4qwIAAC9gSDSA9+5IEeS9PyGEuYUAQCgFxBEeuDr4wYq1hmuA9WN+uRz5hQBAOCrIoj0QLQjXNdN6Jhp9bkNJRZXAwBA8COI9NAtk3MlSe/uKNfR+uD4zhwAAAIVQaSHRmbGa1x2olrbjV7aeNjqcgAACGoEkXNwy+RsSdKfGbQKAMBXQhA5B18fm6m4zkGrq/dWWV0OAABBiyByDmKc4brpgo6zIss+3m9xNQAABC+CyDm6fWqe7Dbpo71HtaeizupyAAAISgSRc5SdFK2vjUyXJC1fc8DaYgAACFIEka/guxflS5Je3nRYxxtaLK4GAIDgQxD5CibnJ2lUZrzcbR79iQnOAADoMYLIV2Cz2XRH51mRZ9YekLut3eKKAAAILgSRr+gb4wYqIz5SlXVuvbSRb+UFAKAnCCJfkTM8TN+fViBJ+t3qfWpr91hcEQAAwYMg0gu+MzlbSTEOlRxr1BufHbG6HAAAggZBpBdEO8L13YvyJEm//WAf074DAHCWCCK95NYpeYp1hquook4rdldaXQ4AAEGBINJLEqIidOuUXEnSf63YK2M4KwIAwJkQRHrR9y7OV7QjTJ+V1uqdHRVWlwMAQMAjiPSi5Find7bVpe8VqZ2xIgAAnBZBpJfNm1ag+Mhw7amo19+3lVldDgAAAY0g0ssSoiI0/9LBkqTH3tujVuYVAQDglAgifjBnap6SYxw6UN2olzYetrocAAACFkHED2Kc4brrss6zIu/vUWNLm8UVAQAQmAgifnLrlFxlJ0WpwuXWU6s/t7ocAAACEkHET5zhYVo46zxJ0lMf7tOR2iaLKwIAIPAQRPxo1ugMXZA3QM2tHi15p8jqcgAACDgEET+y2Wz6t6tHSpJe3lSqbYdrrC0IAIAAQxDxs3HZibp+wiBJ0kN/28kX4gEAcAKCSB/46czhinaEaePB4/rrJm7nBQCgC0GkDwxMiNKPpg+VJC1+c5eON7RYXBEAAIGBINJH7rgoX8PT43S8sVW/enu31eUAABAQCCJ9JCLMroevHy1Jev4fh7Tx4DGLKwIAwHoEkT50fl6Sbjw/S5L0s1e28z00AICQRxDpYwtmnacB0RHaXV6nJ1fts7ocAAAsRRDpY0kxDj10bcclmsdX7tWuIy6LKwIAwDoEEQt8Y+xAzRiVrtZ2o5+8uJVLNACAkNUnQcTtdmv8+PGy2WzasmVLX2wyoNlsNv3HdaOVGB2hHWUu/Y5LNACAENUnQeSnP/2pMjMz+2JTQSMtLlIPXTNKkvRfK/dqZxmXaAAAocfvQeStt97Su+++q0cffdTfmwo614zL1FUjOy7R/PD5zWpqabe6JAAA+pRfg0hFRYXmzZunP/7xj4qOjj5je7fbLZfL5fPoz2w2mx751lilxTm1t7JeD7+50+qSAADoU34LIsYYzZkzR3feeafOP//8s3rN4sWLlZCQ4H1kZ2f7q7yAkRTj0NIbx0uSnv2kRO/uKLe2IAAA+lCPg8iCBQtks9lO+9i9e7cef/xx1dXVaeHChWf93gsXLlRtba33cejQoZ6WF5QuHpqi+dMKJEk/fWmbymubLa4IAIC+YTPG9Oh76auqqlRdXX3aNgUFBbrxxhv1t7/9TTabzbu8vb1dYWFhmj17tp555pkzbsvlcikhIUG1tbWKj4/vSZlBp6XNo28+uUbbS126sCBJz84tVHgYd1cDAIJPT47fPQ4iZ6ukpMRnjEdZWZlmzJihv/71ryosLFRWVtYZ3yOUgogkfV5Vr68//rEaW9p156WDtWDWCKtLAgCgx3py/A73VxE5OTk+v8fGxkqSBg8efFYhJBQVpMbq198eq3v+tFm/W71PE3ISNWNUhtVlAQDgN5z7DzBfH5upuRfnS5J+8sJW7T/aYHFFAAD4T58Fkby8PBljNH78+L7aZNBaMGuELsgboDp3m+7840Y1trRZXRIAAH7BGZEAFBFm1xO3TFRqnFNFFXX6yYtb5fH4ZSgPAACWIogEqLT4SP129kRFhNn05mfleuz9PVaXBABAryOIBLAL8pK0+JtjJUmPryzWq5tLLa4IAIDeRRAJcN+elKU7Lx0sSfrpX7dp48FjFlcEAEDvIYgEgZ/OGK6rRqarpd2j7/+/jSqpbrS6JAAAegVBJAjY7Tb95jvjNSozXtUNLbpt2XodrXdbXRYAAF8ZQSRIRDvCtWzOBcoaEKUD1Y26Y/k/VO/mtl4AQHAjiASR9PhI/b/vTlZSjEOfldbqzj9ulLut3eqyAAA4ZwSRIFOQGqun77hA0Y4wfVx8VPe9wBwjAIDgRRAJQmOzEvXUrZMUEWbT37cd0b++8hlhBAAQlAgiQeqSoal67Kbxstuk5/9xSD9/fbv89EXKAAD4DUEkiH19bKYevWGcbDbp2U9K9Iu/7ySMAACCCkEkyH1zYpZ+1Tn76vI1B7T4rd2EEQBA0CCI9AM3XpCth68fLUn6/Yef65dv7iKMAACCAkGkn5hdmKuHrhklSfqfj/br317dzgBWAEDAI4j0I7dPzdOvvjVGNpv03PoS3ffiVrW1e6wuCwCAUyKI9DM3XZCj39w0XmF2m17ZXKq7/7SJSc8AAAGLINIPXTt+kH73z5PkCLPrnR0V+t4znzIdPAAgIBFE+qmvjUzXsjkXKCoiTB/tPaobf7dOla5mq8sCAMAHQaQfu3hoiv4y/0KlxDq084hL1/92rYor66wuCwAAL4JIPzc2K1Ev33WR8lNiVFrTpG/+dq027D9mdVkAAEgiiISEnORovXTXVE3MSZSruU3//If1em1LqdVlAQBAEAkVSTEOPfe9C3XVyHS1tHn0w+e36Fdv72auEQCApQgiISTKEaYn/3mS7rpssCTpyVX79P0/fqq65laLKwMAhCqCSIgJs9v0wMwR+s1N4+UIt+v9XZX61pNrdbC6werSAAAhiCASoq6bMEgvzp+itDin9lTU69on1mhVUaXVZQEAQgxBJISNy07U3/7PxRqXlaCaxlbd8fQ/tPS9PWpn3AgAoI8QREJcenyk/jJ/imYX5sgY6b9W7NXtyzaout5tdWkAgBBAEIEiI8L08PVj9NhN4xQVEaaPi4/q6v/6WJ8eYL4RAIB/EUTgdf2ELL12z0UanBqjclezvvP7T/TEB8VcqgEA+A1BBD6Gpcfp9Xsu1jXjMtXmMVryTpFu+Z9PVFbTZHVpAIB+iCCCk8Q4w/V/vzNeS749VtGOMK3ff0wzf/Oh3th2xOrSAAD9DEEE3bLZbLrh/Gy9+S+XaFxWglzNbbr7T5t0/4tb1eBus7o8AEA/QRDBaeWlxOivd03VPZcPkc0mvbjxsGb+3w+1dt9Rq0sDAPQDBBGcUUSYXT+ZMVzPz7tQgxKjdOhYk275n/X691e3c3YEAPCVEERw1goLkvXOj6dpdmGOJOmPnxzUjN98qLXFnB0BAJwbggh6JNYZroevH6PnvleoQYlROny8Sbf873r97JXP5OLL8wAAPUQQwTm5aEiK3vnxNN16Ya4k6bn1JZr+n6v1xrYjMoZ5RwAAZ4cggnMW6wzXf1w3Wn+aV6i85GhV1rl195826Y6n/6GS6karywMABAGCCL6yqYNT9PaPpulfrhwqR5hdq4qq9LXHVuuJD4rV0uaxujwAQAAjiKBXREaE6d6vDdNbP7pEUwqS5W7zaMk7Rbr6vz7SGgazAgBOgSCCXjU4NVZ/mleox24ap+QYh/ZW1mv2/67X/D9+yuUaAMBJbCaARxa6XC4lJCSotrZW8fHxVpeDHqppbNFv3t+rP35yUO0eI0eYXXMvydfdlw9RrDPc6vIAAH7Sk+O3X8+I5OXlyWaz+TweeeQRf24SASQx2qEHrxmlt354iS4ekqKWdo+eXLVPlz+6Sn/deFgevtUXAEKeX8+I5OXlae7cuZo3b553WVxcnGJiYs7q9ZwR6T+MMXp/V6X+vzd26mDnJZrRg+K1YOZ5unhoisXVAQB6U0+O334/Px4XF6eMjAx/bwYBzmaz6Wsj0zVtWIqWrzmg/15ZrO2lLv3zH9brkqEpemDmCI0elGB1mQCAPub3MyLNzc1qbW1VTk6ObrnlFv34xz9WeHj3+cftdsvtdnt/d7lcys7O5oxIP1Rd79Z/f1CsZz85qNb2jn+C3xiXqZ9cNUy5yWd3xgwAEJh6ckbEr0Fk6dKlmjhxopKSkrR27VotXLhQd9xxh5YuXdpt+wcffFAPPfTQScsJIv3XoWON+s93i/TqljJJUrjdptmFObr78iFKi4+0uDoAwLnwaxBZsGCBfvWrX522za5duzRixIiTli9btkzz589XfX29nE7nSes5IxK6tpfW6tfvFOnDPVWSJGe4XbMLc3XnZQVKiyOQAEAw8WsQqaqqUnV19WnbFBQUyOFwnLR8x44dGj16tHbv3q3hw4efcVsMVg09a4uP6tF3i7SppEaSFBlh1z8X5mr+pYOVGndyeAUABB6/DlZNTU1VamrqORW2ZcsW2e12paWlndPr0f9NHZKilwYn66O9R/XY+3u0uaRG//vxfj27/qBuvbAjkKTEEkgAoL/w2xiRdevWaf369br88ssVFxendevW6cc//rFmzZqlZ5555qzegzMioc0Yo9V7qvTY+3u19VCNpI4zJN+5IEfzphVoUGKUtQUCALoVEINVN23apB/84AfavXu33G638vPzdeutt+ree+/tdnxIdwgikDoCyao9VfrNe3u09XCtpI5BrdeOH6Q7Ly3Q0PQ4iysEAJwoIIJIbyCI4ETGGK0prtaTq4u1pviLcUpfG5muuy4brIk5AyysDgDQhSCCfm/roRr9bvU+vb2jXF3/ggvzk/T9aQW6fHia7HabtQUCQAgjiCBk7Kuq1+9Xf66XNx/2ToyWnxKjOVPz9O1JWYrhy/UAoM8RRBByymubtXzNfv15Q4lczW2SpLjIcH3ngmzdNiVP2UnRFlcIAKGDIIKQ1eBu08ubDmv5mgP6/GiDJMluk64amaHvXpyvC/IGyGbjsg0A+BNBBCHP4zFavbdKyz7er4/2HvUuH5ERp9kX5uq68ZmKi4ywsEIA6L8IIsAJ9lTUafmaA3pl82E1t3okSdGOMF07fpBmF+bwrb8A0MsIIkA3ahtb9fLmw3pufYmKK+u9y8dnJ2p2YY6+PjZTUY4wCysEgP6BIAKchjFG6/cf03PrS/T29iPeu23iI8N1/YRBuuH8bI3KjGcsCQCcI4IIcJaO1rv1wqeH9Kf1JTp8vMm7fERGnG44P1vXjc9UMt9tAwA9QhABesjjMfqo+Khe/PSQ3t1ZoZa2jrEkEWE2XTEiTTeen61Lh6UqPMxucaUAEPgIIsBXUNvYqte3lurFjYe1rfO7bSQpNc6p6ycM0nXjB+m8gXFcugGAUyCIAL2kqLxOL356SK9sLlV1Q4t3+dC0WF03YZCuGZfJZGkA8CUEEaCXtbZ79MHuSr2yuVQrdld6L91I0sScRF03YZD+acxApTCeBAAIIoA/uZpb9fb2cr2+pUxr9x2Vp/MvKMxu08VDUnTt+ExNH5mueCZMAxCiCCJAH6l0Netv247o9S2l2nrCeBJHmF0XD03RrNEZ+trIdCVGOyysEgD6FkEEsMD+ow16bUup/ra1TPuqGrzLw+02TR2Son8anaGrRmUoKYZQAqB/I4gAFttbUac3PyvXW9uPaHd5nXd5mN2mCwuSNGv0QF01Kl1pcZEWVgkA/kEQAQLIvqp6vb29XG9+dkQ7ylw+68ZnJ+prI9M1/bx0DUuP5ZZgAP0CQQQIUAerG/TW9nK99dkRnzElkpSdFKXp56Xra+el64L8JEUweRqAIEUQAYJAhatZK3ZV6v1dFfq4+KjPLcFxkeG6fHiapo9M16XDUpUQxR04AIIHQQQIMo0tbfpo71Gt2FWhFbsqfSZPC7PbNCE7UZcOS9Vlw9M0KjNedjuXcAAELoIIEMTaPUZbDtXo/V0Ven9nhfZW1vusT45xaNqwVF06LFWXDE3hS/kABByCCNCPHD7eqA/3HNXqPZVaU1ytenebd53NJo0dlKBLh6Vq2rBUjctOZGwJAMsRRIB+qrXdo40Hj2v1niqtLqrSziO+d+HEOsM1OT9JUwcn66IhKRqeHsdlHAB9jiAChIhKV3NHKNlTpY+Lj6qmsdVnfXKMQxcOTtZFg1N00ZBk5SRFc4swAL8jiAAhyOMx2nnEpbX7jmpNcbU27D+mptZ2nzaDEqN00ZBkTR2cosKCJA1MiLKoWgD9GUEEgFraPNp6uEZrio9qbXG1Nh86rtZ23z/37KQoTc5L1uT8AZqcn6y8ZM6YAPjqCCIATtLY0qYN+49p3b5qrd1XrR1ltd5vDu6SGufU5PwkTc5L0uT8JMaYADgnBBEAZ1TX3KpNJTXasL9a/9h/XFsO1ail3ePTJj4yXBfkJemC/CRNzBmgMYMSFOUIs6hiAMGCIAKgx5pb27X1UI027D+mDQeOaePB42ps8R1jEm636byB8ZqYk6iJuQM0MWeAsgZEcTkHgA+CCICvrLXdo51lLm3Y3xFKNpUcV2Wd+6R2KbFOn2AyNitBkRGcNQFCGUEEQK8zxqi0pkmbSmq06eBxbS45rh1lLrV9aaBJ11mTsVkJGpuVoDGDEjUsPVbhTLQGhAyCCIA+0dzaru2ltdpUclybDtac8qyJM9yuUZnxGpuVqDGDEjQuO0H5KbEKYyAs0C8RRABYouusydZDtdpWWqPPDtfqs8O1qjthWvouMY4wjRqUoLGDEjQ2uyOg5CZFc5cO0A8QRAAEDI/H6EB1gz4rrdXWQ7X6rLRG20tdJ022JknRjjCdNzBeIwfGa2Rmx8/hGXGMOQGCDEEEQEBr9xgVV9Zr2+GajoByuFa7j7jkbvOc1NZukwanxnqDycjMeJ03MF4pfOswELAIIgCCTlu7R/uPNmjnEZd2lrm8P6sbWrptnxbn1MjMjjMmw9LiNDwjTkPSYjl7AgQAggiAfsEYo8o69xfB5IhLu8pc2l/doO4+uew2KTc5RsPSYzU8PU5D0zsCSn5KjCK4awfoMwQRAP1ag7tNu8vrtPOIS3sr6lRUXqc9FXU6/qVvH+4SEWZTQUqshmXEaXh6rIamx2loWqyyk6IJKIAfEEQAhBxjjI7Wt2jPCcGkqKJOeyvqVd/NXTtSx5wnucnRGpwaq8FpsR0/U2NUkBqrhKiIPu4B0H8QRACgkzFGZbXN2lPeEUz2lNdpT2Wd9lU2dHvnTpfUOKcGp8Z0hpOOoFKQEqNBiVHcYgycAUEEAM7A4zEqdzVrX1W99lXWa19VQ8fzqnpVuE6elK1LZIRduUkxyk2OVn5KjHKTY5SXHK3clBgNjI8kpAAiiADAV1LX3KrPTwgm+yo7nh+oblBr+6k/Mh3hduUmRfuEk/zkjtCSmRjFTLIIGQETRN544w394he/0LZt2xQZGalLL71Ur7766lm/niACIJC0tXt06HiTDlQ36ODRBh2obtTB6gYdrG5UybHGk75350QRYTZlJ0UrLzlG2QOilJ0UrawB0crqfM6YFPQnPTl+h/uriJdeeknz5s3TL3/5S11xxRVqa2vT9u3b/bU5APC78DC78lNilJ8SIw33XdfW7lFZTXNHSKnuCCkHjjboQHWDDh1rUku7R59XNejzqoZu3zs+MlzZSdHKPiGcZCdFdf4erSgH86Ogf/LLGZG2tjbl5eXpoYce0ty5c8/5fTgjAqA/aPcYHalt0sHqRm8wOXy8UYeON+nwscZTTtp2opRYpzegZA2IUmZilDITIjt/Rik+Klw2G5d+EBgsPyOyadMmlZaWym63a8KECSovL9f48eO1ZMkSjR492h+bBICAFWa3dV6GidZFQ1JOWt/gbtPh453h5FhHQDl0rFGHjzfp0PFG1TW36Wi9W0fr3dpyqKbbbUQ7wpSZGKWBCZEalBilgQlRykzsDCqdy5l1FoHIL0Hk888/lyQ9+OCDWrp0qfLy8vSf//mfuuyyy7Rnzx4lJSV1+zq32y23+4vR6i6Xyx/lAUBAiXGGa3hGxyyw3altbNUhb0hpVFlNs0prmnSktkllNc061tCixpZ2FVfWq7iy/pTbSY5xaGBipDITOsJJRkKk0uOdSo+PVHp8pDLiIxXj9NsVe6BbPfoXt2DBAv3qV786bZtdu3bJ4+n44qqf/exn+ta3viVJWr58ubKysvTiiy9q/vz53b528eLFeuihh3pSEgD0ewnREUqITtDoQQndrm9ubVdZTZOO1HYGlJpmldU0qay2ybu8saVd1Q0tqm5o0fbSU/9PXqwzXGnxTmV0hpOOR8fvaZ3P0+Ii5QhnRlr0jh6NEamqqlJ1dfVp2xQUFGjNmjW64oor9NFHH+niiy/2rissLNT06dP18MMPd/va7s6IZGdnM0YEAL4CY4xcTW0nnEVpUmlNsypdzSp3NavC1awKl/uUM9B2JznG8UVISYhUaqxTKXFOn5+pcU7OsIQov40RSU1NVWpq6hnbTZo0SU6nU0VFRd4g0traqgMHDig3N/eUr3M6nXI6+WpvAOhNNput86xKhEZmnvqgUO9u6wwlX4STE5+X1zarsq5Zre3Ge3Zl55HTbzsqIkypcU6lxDo6fzp9fqZ2hZdYJ3cGhSi/RNX4+HjdeeedWrRokbKzs5Wbm6slS5ZIkm644QZ/bBIA8BXFOsMV2zml/al4PEbHG1t8Qkq5q1lH692qqnPraH2Lquo6nje1tquptV0lxzrmWTmb7XeFluQYp5JiHUqOcSjpS4/kGKeSYhxcHuon/HbObMmSJQoPD9ett96qpqYmFRYWauXKlRowYIC/NgkA8DO73abkWKeSY52nPbsiddwN9EVA6fhZ1RlUvrzc3eZRvbtN9e427T/a/VwrXxbnDFdSbFc46fg5wPvc6RNikmMdinZwmSgQMcU7AMBSxhjVudt0tO6LsyrVDW5V17foeGPHJaBj9S061nk56Hhji9pPM4vtqTjD7RoQ7VBidETHI6rrecfPAdERSojqev5FO2c4l4x6yvJ5RAAAOFs2m03xkRGKj4xQwWkuC3XxeIxcza0dAaWhRdWdIeV4Y9dzt3ddV3hpafPI3eZReeelpJ6Iigj7IrBERWhAzImBpSPQJERHKCGqow/xUeGKj4pQrCOcL0E8CwQRAEBQsdttnWcxHBp85vsnZIxRQ0u7jje0qKaxVccbW1TT1KraxhYdb2xVTWOrapo61tU0dv5s6njuMeoY61LbriO1PQswNlvH5aP4EwNKZITio74UWjqXxUd2tu18HusMjdlyCSIAgH7NZrN1DMR1hiu7+/k0u+XxdFwyqu0MKsc7g0ptU6uON/iGl+ONraprbpWruU2upla52zwyRh2/N7dJaupx3XabFHdiWImMUFxkuGIjwxXn7PgZ6+xYFtcZXGI7l8dHRnifR4QF9qBegggAAN2w221K6Dx7kaPoHr22ubVddc1tcjW3ytXUEVBqm7qet8rV5LvOZ3lTq1raPfIYqbapVbVNrTqXINPFGW73BpW4EwJKV5gZnhGn2YWnnlrD3wgiAAD0ssiIMEV2zqFyLppb208KLLVNrR13FjV33F1U1/mzvrlNde7Wzp9frG9saZckuds8cte36Gh991+uOG1YKkEEAAB8oSvIpHX/9UNnpa3dowZ3e0dI8QaWzgDT3Kb6zvCSldSzsz29jSACAEA/FB5mV0K0XQnREVaXclqBPYIFAAD0awQRAABgGYIIAACwDEEEAABYhiACAAAsQxABAACWIYgAAADLEEQAAIBlCCIAAMAyBBEAAGAZgggAALAMQQQAAFiGIAIAACwT0N++a4yRJLlcLosrAQAAZ6vruN11HD+dgA4idXV1kqTs7GyLKwEAAD1VV1enhISE07axmbOJKxbxeDwqKytTXFycbDZbr763y+VSdna2Dh06pPj4+F5970DQ3/sn9f8+0r/g19/7SP+Cn7/6aIxRXV2dMjMzZbeffhRIQJ8RsdvtysrK8us24uPj++0/MKn/90/q/32kf8Gvv/eR/gU/f/TxTGdCujBYFQAAWIYgAgAALBOyQcTpdGrRokVyOp1Wl+IX/b1/Uv/vI/0Lfv29j/Qv+AVCHwN6sCoAAOjfQvaMCAAAsB5BBAAAWIYgAgAALEMQAQAAlgnJIPLEE08oLy9PkZGRKiws1IYNG6wuqVuLFy/WBRdcoLi4OKWlpem6665TUVGRT5vLLrtMNpvN53HnnXf6tCkpKdHVV1+t6OhopaWl6f7771dbW5tPm1WrVmnixIlyOp0aMmSInn76aX93Tw8++OBJtY8YMcK7vrm5WXfffbeSk5MVGxurb33rW6qoqAiKvklSXl7eSf2z2Wy6++67JQXnvvvwww/1jW98Q5mZmbLZbHr11Vd91htj9POf/1wDBw5UVFSUpk+frr179/q0OXbsmGbPnq34+HglJiZq7ty5qq+v92mzbds2XXLJJYqMjFR2drZ+/etfn1TLiy++qBEjRigyMlJjxozRm2++6df+tba26oEHHtCYMWMUExOjzMxM3XbbbSorK/N5j+72+yOPPBIQ/TtTHyVpzpw5J9U/c+ZMnzbBug8ldfs3abPZtGTJEm+bQN6HZ3Nc6MvPzl45npoQ8/zzzxuHw2GWLVtmduzYYebNm2cSExNNRUWF1aWdZMaMGWb58uVm+/btZsuWLeaf/umfTE5Ojqmvr/e2ufTSS828efPMkSNHvI/a2lrv+ra2NjN69Ggzffp0s3nzZvPmm2+alJQUs3DhQm+bzz//3ERHR5t7773X7Ny50zz++OMmLCzMvP32237t36JFi8yoUaN8aq+qqvKuv/POO012drZZsWKF+fTTT82FF15opk6dGhR9M8aYyspKn7699957RpL54IMPjDHBue/efPNN87Of/cy8/PLLRpJ55ZVXfNY/8sgjJiEhwbz66qtm69at5pprrjH5+fmmqanJ22bmzJlm3Lhx5pNPPjEfffSRGTJkiLn55pu962tra016erqZPXu22b59u/nzn/9soqKizFNPPeVts2bNGhMWFmZ+/etfm507d5p/+7d/MxEREeazzz7zW/9qamrM9OnTzV/+8heze/dus27dOjN58mQzadIkn/fIzc01v/jFL3z264l/s1b270x9NMaY22+/3cycOdOn/mPHjvm0CdZ9aIzx6deRI0fMsmXLjM1mM/v27fO2CeR9eDbHhb767Oyt42nIBZHJkyebu+++2/t7e3u7yczMNIsXL7awqrNTWVlpJJnVq1d7l1166aXmhz/84Slf8+abbxq73W7Ky8u9y5588kkTHx9v3G63McaYn/70p2bUqFE+r7vpppvMjBkzercDX7Jo0SIzbty4btfV1NSYiIgI8+KLL3qX7dq1y0gy69atM8YEdt+688Mf/tAMHjzYeDweY0xw7ztjzEkf8h6Px2RkZJglS5Z4l9XU1Bin02n+/Oc/G2OM2blzp5Fk/vGPf3jbvPXWW8Zms5nS0lJjjDG//e1vzYABA7x9NMaYBx54wAwfPtz7+4033miuvvpqn3oKCwvN/Pnz/da/7mzYsMFIMgcPHvQuy83NNY899tgpXxMo/TOm+z7efvvt5tprrz3la/rbPrz22mvNFVdc4bMsmPbhl48LffnZ2VvH05C6NNPS0qKNGzdq+vTp3mV2u13Tp0/XunXrLKzs7NTW1kqSkpKSfJY/99xzSklJ0ejRo7Vw4UI1NjZ6161bt05jxoxRenq6d9mMGTPkcrm0Y8cOb5sT/5t0temL/yZ79+5VZmamCgoKNHv2bJWUlEiSNm7cqNbWVp+6RowYoZycHG9dgd63E7W0tOjZZ5/Vd7/7XZ8vcAzmffdl+/fvV3l5uU89CQkJKiws9NlniYmJOv/8871tpk+fLrvdrvXr13vbTJs2TQ6Hw9tmxowZKioq0vHjx71tAqHftbW1stlsSkxM9Fn+yCOPKDk5WRMmTNCSJUt8TnkHQ/9WrVqltLQ0DR8+XHfddZeqq6t96u8v+7CiokJvvPGG5s6de9K6YNmHXz4u9NVnZ28eTwP6S+9629GjR9Xe3u7zH1+S0tPTtXv3bouqOjsej0c/+tGPdNFFF2n06NHe5bfccotyc3OVmZmpbdu26YEHHlBRUZFefvllSVJ5eXm3/e1ad7o2LpdLTU1NioqK8kufCgsL9fTTT2v48OE6cuSIHnroIV1yySXavn27ysvL5XA4TvqAT09PP2PdgdC3L3v11VdVU1OjOXPmeJcF877rTldN3dVzYr1paWk+68PDw5WUlOTTJj8//6T36Fo3YMCAU/a76z36QnNzsx544AHdfPPNPl8W9i//8i+aOHGikpKStHbtWi1cuFBHjhzR0qVLvX0I5P7NnDlT3/zmN5Wfn699+/bpX//1XzVr1iytW7dOYWFh/WofPvPMM4qLi9M3v/lNn+XBsg+7Oy701Wfn8ePHe+14GlJBJJjdfffd2r59uz7++GOf5d///ve9z8eMGaOBAwfqyiuv1L59+zR48OC+LrNHZs2a5X0+duxYFRYWKjc3Vy+88EKfHkD7wh/+8AfNmjVLmZmZ3mXBvO9CXWtrq2688UYZY/Tkk0/6rLv33nu9z8eOHSuHw6H58+dr8eLFQTFV+He+8x3v8zFjxmjs2LEaPHiwVq1apSuvvNLCynrfsmXLNHv2bEVGRvosD5Z9eKrjQrAJqUszKSkpCgsLO2n0cEVFhTIyMiyq6szuuece/f3vf9cHH3ygrKys07YtLCyUJBUXF0uSMjIyuu1v17rTtYmPj+/TQJCYmKhhw4apuLhYGRkZamlpUU1NzUl1nanurnWna9OXfTt48KDef/99fe973zttu2DedyfWdLq/r4yMDFVWVvqsb2tr07Fjx3plv/bF33FXCDl48KDee++9M351emFhodra2nTgwAFJgd+/LysoKFBKSorPv8tg34eS9NFHH6moqOiMf5dSYO7DUx0X+uqzszePpyEVRBwOhyZNmqQVK1Z4l3k8Hq1YsUJTpkyxsLLuGWN0zz336JVXXtHKlStPOhXYnS1btkiSBg4cKEmaMmWKPvvsM58Pjq4Pz5EjR3rbnPjfpKtNX/83qa+v1759+zRw4EBNmjRJERERPnUVFRWppKTEW1ew9G358uVKS0vT1Vdffdp2wbzvJCk/P18ZGRk+9bhcLq1fv95nn9XU1Gjjxo3eNitXrpTH4/EGsSlTpujDDz9Ua2urt817772n4cOHa8CAAd42VvS7K4Ts3btX77//vpKTk8/4mi1btshut3svZwRy/7pz+PBhVVdX+/y7DOZ92OUPf/iDJk2apHHjxp2xbSDtwzMdF/rqs7NXj6c9GtraDzz//PPG6XSap59+2uzcudN8//vfN4mJiT6jhwPFXXfdZRISEsyqVat8biNrbGw0xhhTXFxsfvGLX5hPP/3U7N+/37z22mumoKDATJs2zfseXbdpXXXVVWbLli3m7bffNqmpqd3epnX//febXbt2mSeeeKJPbnG97777zKpVq8z+/fvNmjVrzPTp001KSoqprKw0xnTcgpaTk2NWrlxpPv30UzNlyhQzZcqUoOhbl/b2dpOTk2MeeOABn+XBuu/q6urM5s2bzebNm40ks3TpUrN582bvXSOPPPKISUxMNK+99prZtm2bufbaa7u9fXfChAlm/fr15uOPPzZDhw71ufWzpqbGpKenm1tvvdVs377dPP/88yY6OvqkWyPDw8PNo48+anbt2mUWLVrUK7dGnq5/LS0t5pprrjFZWVlmy5YtPn+TXXcarF271jz22GNmy5YtZt++febZZ581qamp5rbbbguI/p2pj3V1deYnP/mJWbdundm/f795//33zcSJE83QoUNNc3Oz9z2CdR92qa2tNdHR0ebJJ5886fWBvg/PdFwwpu8+O3vreBpyQcQYYx5//HGTk5NjHA6HmTx5svnkk0+sLqlbkrp9LF++3BhjTElJiZk2bZpJSkoyTqfTDBkyxNx///0+c1EYY8yBAwfMrFmzTFRUlElJSTH33XefaW1t9WnzwQcfmPHjxxuHw2EKCgq82/Cnm266yQwcONA4HA4zaNAgc9NNN5ni4mLv+qamJvODH/zADBgwwERHR5vrr7/eHDlyJCj61uWdd94xkkxRUZHP8mDddx988EG3/yZvv/12Y0zHLbz//u//btLT043T6TRXXnnlSX2vrq42N998s4mNjTXx8fHmjjvuMHV1dT5ttm7dai6++GLjdDrNoEGDzCOPPHJSLS+88IIZNmyYcTgcZtSoUeaNN97wa//2799/yr/JrrlhNm7caAoLC01CQoKJjIw05513nvnlL3/pcxC3sn9n6mNjY6O56qqrTGpqqomIiDC5ublm3rx5Jx1YgnUfdnnqqadMVFSUqampOen1gb4Pz3RcMKZvPzt743hq6+wYAABAnwupMSIAACCwEEQAAIBlCCIAAMAyBBEAAGAZgggAALAMQQQAAFiGIAIAACxDEAEAAJYhiAAAAMsQRAAAgGUIIgAAwDIEEQAAYJn/HySFjBFuJ31sAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["plt.plot(10.0 * np.log(total_loss / (np.max(total_loss + 1e-5))))\n","plt.show()"]},{"cell_type":"markdown","id":"b95e6c40-ca0a-49c5-8add-a023dfc144ce","metadata":{"id":"b95e6c40-ca0a-49c5-8add-a023dfc144ce"},"source":["# Test"]},{"cell_type":"code","execution_count":14,"id":"632f4556-aa9f-41de-a88a-9199b07e7c52","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":452},"id":"632f4556-aa9f-41de-a88a-9199b07e7c52","executionInfo":{"status":"ok","timestamp":1696422554357,"user_tz":-540,"elapsed":361,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"5a4715b4-cd2c-428f-90c4-31ae6ea532d1"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["   PassengerId  Pclass                                          Name     Sex  \\\n","0          892       3                              Kelly, Mr. James    male   \n","1          893       3              Wilkes, Mrs. James (Ellen Needs)  female   \n","2          894       2                     Myles, Mr. Thomas Francis    male   \n","3          895       3                              Wirz, Mr. Albert    male   \n","4          896       3  Hirvonen, Mrs. Alexander (Helga E Lindqvist)  female   \n","\n","    Age  SibSp  Parch   Ticket     Fare Cabin Embarked  \n","0  34.5      0      0   330911   7.8292   NaN        Q  \n","1  47.0      1      0   363272   7.0000   NaN        S  \n","2  62.0      0      0   240276   9.6875   NaN        Q  \n","3  27.0      0      0   315154   8.6625   NaN        S  \n","4  22.0      1      1  3101298  12.2875   NaN        S  "],"text/html":["\n","  <div id=\"df-5d3521d9-e129-4289-91a7-d519c8b4e55d\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>PassengerId</th>\n","      <th>Pclass</th>\n","      <th>Name</th>\n","      <th>Sex</th>\n","      <th>Age</th>\n","      <th>SibSp</th>\n","      <th>Parch</th>\n","      <th>Ticket</th>\n","      <th>Fare</th>\n","      <th>Cabin</th>\n","      <th>Embarked</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>892</td>\n","      <td>3</td>\n","      <td>Kelly, Mr. James</td>\n","      <td>male</td>\n","      <td>34.5</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>330911</td>\n","      <td>7.8292</td>\n","      <td>NaN</td>\n","      <td>Q</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>893</td>\n","      <td>3</td>\n","      <td>Wilkes, Mrs. James (Ellen Needs)</td>\n","      <td>female</td>\n","      <td>47.0</td>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>363272</td>\n","      <td>7.0000</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>894</td>\n","      <td>2</td>\n","      <td>Myles, Mr. Thomas Francis</td>\n","      <td>male</td>\n","      <td>62.0</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>240276</td>\n","      <td>9.6875</td>\n","      <td>NaN</td>\n","      <td>Q</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>895</td>\n","      <td>3</td>\n","      <td>Wirz, Mr. Albert</td>\n","      <td>male</td>\n","      <td>27.0</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>315154</td>\n","      <td>8.6625</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>896</td>\n","      <td>3</td>\n","      <td>Hirvonen, Mrs. Alexander (Helga E Lindqvist)</td>\n","      <td>female</td>\n","      <td>22.0</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>3101298</td>\n","      <td>12.2875</td>\n","      <td>NaN</td>\n","      <td>S</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5d3521d9-e129-4289-91a7-d519c8b4e55d')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-5d3521d9-e129-4289-91a7-d519c8b4e55d button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-5d3521d9-e129-4289-91a7-d519c8b4e55d');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","<div id=\"df-41eb3618-b3f3-4892-bb79-2f5514bce02f\">\n","  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-41eb3618-b3f3-4892-bb79-2f5514bce02f')\"\n","            title=\"Suggest charts.\"\n","            style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","  </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","  <script>\n","    async function quickchart(key) {\n","      const quickchartButtonEl =\n","        document.querySelector('#' + key + ' button');\n","      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","      quickchartButtonEl.classList.add('colab-df-spinner');\n","      try {\n","        const charts = await google.colab.kernel.invokeFunction(\n","            'suggestCharts', [key], {});\n","      } catch (error) {\n","        console.error('Error during call to suggestCharts:', error);\n","      }\n","      quickchartButtonEl.classList.remove('colab-df-spinner');\n","      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","    }\n","    (() => {\n","      let quickchartButtonEl =\n","        document.querySelector('#df-41eb3618-b3f3-4892-bb79-2f5514bce02f button');\n","      quickchartButtonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","    })();\n","  </script>\n","</div>\n","    </div>\n","  </div>\n"]},"metadata":{},"execution_count":14}],"source":["# 자신의 경로에 맞게 설정하자!\n","# Test 데이터셋에 대한 File Open\n","df_test = pd.read_csv(\"./drive/MyDrive/test.csv\")\n","df_test.head(5)\n"]},{"cell_type":"code","execution_count":15,"id":"6180153e-2855-4745-b195-9ebf9991e2f0","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"6180153e-2855-4745-b195-9ebf9991e2f0","executionInfo":{"status":"ok","timestamp":1696422556923,"user_tz":-540,"elapsed":414,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"6e6197c7-f4b6-4abe-b4ad-2bf11bbf4387"},"outputs":[{"output_type":"stream","name":"stdout","text":["<class 'pandas.core.frame.DataFrame'>\n","RangeIndex: 418 entries, 0 to 417\n","Data columns (total 11 columns):\n"," #   Column       Non-Null Count  Dtype  \n","---  ------       --------------  -----  \n"," 0   PassengerId  418 non-null    int64  \n"," 1   Pclass       418 non-null    int64  \n"," 2   Name         418 non-null    object \n"," 3   Sex          418 non-null    object \n"," 4   Age          332 non-null    float64\n"," 5   SibSp        418 non-null    int64  \n"," 6   Parch        418 non-null    int64  \n"," 7   Ticket       418 non-null    object \n"," 8   Fare         417 non-null    float64\n"," 9   Cabin        91 non-null     object \n"," 10  Embarked     418 non-null    object \n","dtypes: float64(2), int64(4), object(5)\n","memory usage: 36.0+ KB\n"]}],"source":["df_test.info()"]},{"cell_type":"code","execution_count":16,"id":"a80ccce2-1007-400c-9621-d911b503ccef","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"a80ccce2-1007-400c-9621-d911b503ccef","executionInfo":{"status":"ok","timestamp":1696422557338,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"de27dd91-7f07-4a37-a4e9-9ceec8ec6fe9"},"outputs":[{"output_type":"stream","name":"stdout","text":["(418, 8)\n"]}],"source":["# 새롭게 선택된 8개의 피쳐를 활용한 x_test 설정\n","x_test = np.zeros([len(df_test), 8])\n","print(x_test.shape)"]},{"cell_type":"code","execution_count":17,"id":"11efd403-cfa4-4e1f-b84b-d2d412ec655b","metadata":{"id":"11efd403-cfa4-4e1f-b84b-d2d412ec655b","executionInfo":{"status":"ok","timestamp":1696422557688,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["# 앞선 train부분에서 해줬던 방식과 동일한 전처리를 test에대 해줌.\n","\n","# Sex\n","x_test[:, 0] = df_test[\"Sex\"].map({\"male\": 0, \"female\": 1}).astype(float)\n","# Pclass\n","x_test[:, 1] = df_test[\"Pclass\"].map({3: 0, 2: 1, 1: 2}).astype(float)\n","# Fare - use mean and std from training data to standardize test data\n","x_test[:, 2] = (df_test[\"Fare\"].fillna(df_test[\"Fare\"].mean()) - df_train[\"Fare\"].mean()) / df_train[\"Fare\"].std()\n","# Embarked\n","x_test[:, 3] = df_test[\"Embarked\"].fillna(\"S\").map({\"S\": 0, \"Q\": 1, \"C\": 2}).astype(float)\n","# Age\n","x_test[:, 4] = df_test[\"Age\"].fillna(df_train[\"Age\"].mean())\n","bins = [0, 18, 25, 35, 60, 100]\n","x_test[:, 4] = pd.cut(df_test['Age'].fillna(df_train[\"Age\"].mean()), bins=bins, labels=False)\n","# SibSp\n","x_test[:, 5] = df_test[\"SibSp\"]\n","# Parch\n","x_test[:, 6] = df_test[\"Parch\"]\n","# Ticket's first letter as ASCII value\n","x_test[:, 7] = df_test[\"Ticket\"].apply(lambda x: ord(x[0])).astype(float)\n","\n"]},{"cell_type":"code","execution_count":18,"id":"7dc8f5c8-3b8b-4c79-95a1-a0c1b8f080ad","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7dc8f5c8-3b8b-4c79-95a1-a0c1b8f080ad","executionInfo":{"status":"ok","timestamp":1696422558672,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}},"outputId":"a1b0eb52-a3de-43f9-f44a-6e0bb121305d"},"outputs":[{"output_type":"stream","name":"stdout","text":["(418, 1)\n"]}],"source":["y_pred = hypothesis(w, x_test, b)\n","y_pred = np.round(y_pred)\n","print(y_pred.shape)"]},{"cell_type":"markdown","id":"b21ada7e-78da-4caa-bff4-c9748c8a365d","metadata":{"id":"b21ada7e-78da-4caa-bff4-c9748c8a365d"},"source":["# Submission"]},{"cell_type":"code","execution_count":19,"id":"74767333-29d7-42dc-b8d1-288295d76aa8","metadata":{"id":"74767333-29d7-42dc-b8d1-288295d76aa8","executionInfo":{"status":"ok","timestamp":1696422566412,"user_tz":-540,"elapsed":1,"user":{"displayName":"Yuntae Jeon","userId":"14079734616922641221"}}},"outputs":[],"source":["y_pred = y_pred.reshape(-1)\n","\n","submission = pd.DataFrame({\n"," \"PassengerId\" : df_test[\"PassengerId\"].astype(int),\n"," \"Survived\" : y_pred.astype(int)\n","})\n","# 구글 코랩에 대한 파일 경로를 추가하자!\n","submission.to_csv(\"./drive/MyDrive/result.csv\", index=False)"]},{"cell_type":"code","source":[],"metadata":{"id":"YOVrIWqYqhYA"},"id":"YOVrIWqYqhYA","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"prac","language":"python","name":"prac"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.0"},"colab":{"provenance":[]}},"nbformat":4,"nbformat_minor":5}