{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# **Penting**\n",
        "- Jangan menambahkan import libary atau function apa pun, selain yang sudah tersedia pada cell code atau yang diperbolehkan.\n",
        "- Misal, Anda ingin membangun lebih dari satu model selain decision tree, yang mana itu diperbolehkan dalam instruksi, maka diperbolehkan untuk menambahkan beberapa code selain bagian yang rumpang.\n",
        "- Jangan mengubah atau menambahkan cell text yang sudah disediakan, Anda hanya perlu mengerjakan cell code yang sudah disediakan.\n",
        "- Ingat, tugas Anda hanyalah melengkapi code yang rumpang pada bagian yang sudah ditandai \"________\" saja.\n",
        "- Pastikan seluruh kriteria memiliki output yang sesuai, karena jika tidak ada output dianggap tidak selesai.\n",
        "- Misal, Anda menggunakan df = df.dropna() silakan gunakan df.isnull().sum() sebagai tanda sudah berhasil. Silakan sesuaikan seluruh output dengan perintah yang sudah disediakan.\n",
        "- Pastikan juga output yang dihasilkan sesuai dengan output yang diharapkan (expected output). Sehingga Anda dapat mereview sendiri terlebih dahulu output dari cell code yang dijalankan.\n",
        "- Pastikan Anda melakukan Run All sebelum mengirimkan submission untuk memastikan seluruh cell berjalan dengan baik.\n",
        "- Pastikan Anda menggunakan variabel df dari awal sampai akhir dan tidak diperbolehkan mengganti nama variabel tersebut.\n",
        "- Pastikan Anda mengerjakan sesuai section yang sudah diberikan tanpa mengubah judul atau header yang disediakan."
      ],
      "metadata": {
        "id": "0tvAKGat01Sd"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# **1. Import Library**\n",
        "Pada tahap ini, Anda perlu mengimpor beberapa pustaka (library) Python yang dibutuhkan untuk analisis data dan pembangunan model machine learning."
      ],
      "metadata": {
        "id": "fKADPWcFKlj3"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
        "from sklearn.model_selection import GridSearchCV, RandomizedSearchCV\n",
        "from sklearn.metrics import classification_report\n",
        "import joblib"
      ],
      "metadata": {
        "id": "BlmvjLY9M4Yj"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# **2. Memuat Dataset dari Hasil Clustering**\n",
        "Memuat dataset hasil clustering dari file CSV ke dalam variabel DataFrame."
      ],
      "metadata": {
        "id": "f3YIEnAFKrKL"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Gunakan dataset hasil clustering yang memiliki fitur Target\n",
        "# Silakan gunakan dataset data_clustering jika tidak menerapkan Interpretasi Hasil Clustering [Advanced]\n",
        "# Silakan gunakan dataset data_clustering_inverse jika menerapkan Interpretasi Hasil Clustering [Advanced]\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "________ = pd.read_csv(\"________.csv\")\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "GHCGNTyrM5fS"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Tampilkan 5 baris pertama dengan function head\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "________.head()\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "bCsep0NZ0LUf"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## **(OPSIONAL) Feature Encoding: One Hot Encoding**\n",
        "Langkah ini **HANYA** dilakukan saat Anda menggunakan **data hasil Inverse** untuk memenuhi kriteria Advanced pada latihan sebelumnya."
      ],
      "metadata": {
        "id": "qNR71KYLg565"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "### MULAI CODE OPSIONAL ###\n",
        "\n",
        "categorical_cols = list(________.select_dtypes(include=['object']).columns)\n",
        "\n",
        "# Gunakan 'pd.get_dummies' untuk melakukan OneHotEncoding\n",
        "df_encoded = pd.________(\n",
        "    df,\n",
        "    columns = ________,\n",
        "    drop_first = True\n",
        ")\n",
        "\n",
        "# Tampilkan 5 baris pertama untuk memverifikasi hasilnya\n",
        "df_encoded.________()\n",
        "\n",
        "### SELESEI CODE OPSIONAL ###"
      ],
      "metadata": {
        "id": "XxD6WMo4gxVx"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# **3. Data Splitting**\n",
        "Tahap Data Splitting bertujuan untuk memisahkan dataset menjadi dua bagian: data latih (training set) dan data uji (test set)."
      ],
      "metadata": {
        "id": "KkPem5eWL2UP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Menggunakan train_test_split() untuk melakukan pembagian dataset.\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# Buat 'X' dengan menghapus 'Target' dari 'df_encoded' dan gunakan 'axis=1' untuk menandakan drop kolom.\n",
        "X = df_encoded.________('Target', axis=________)\n",
        "\n",
        "# Buat 'y' dengan HANYA memilih kolom 'Target'.\n",
        "y = df_encoded[________]\n",
        "\n",
        "# Panggil fungsi untuk membagi data.\n",
        "#  - Gunakan 'stratify=y' agar proporsi kelas di train/test set sama.\n",
        "X_train, X_test, y_train, y_test = ________(\n",
        "    X,\n",
        "    y,\n",
        "    test_size = ________,\n",
        "    random_state = 42,\n",
        "    stratify = ________\n",
        ")\n",
        "\n",
        "### SELESAI CODE ###\n",
        "\n",
        "print(\"Jumlah data total: \",len(X))\n",
        "print(\"Jumlah data latih: \",len(X_train))\n",
        "print(\"Jumlah data test: \",len(X_test))"
      ],
      "metadata": {
        "id": "OubAW-7ONKVj"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# **4. Membangun Model Klasifikasi**\n",
        "Setelah memilih algoritma klasifikasi yang sesuai, langkah selanjutnya adalah melatih model menggunakan data latih.\n",
        "\n",
        "Berikut adalah rekomendasi tahapannya.\n",
        "1. Menggunakan algoritma klasifikasi yaitu Decision Tree.\n",
        "2. Latih model menggunakan data yang sudah dipisah."
      ],
      "metadata": {
        "id": "IVPbB03CMhTT"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Buatlah model klasifikasi menggunakan Decision Tree\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# 1. Buat (instantiate) objek model Decision Tree\n",
        "#    Gunakan 'random_state=42' agar hasilnya konsisten\n",
        "decision_tree_model = ________(random_state=42)\n",
        "\n",
        "# 2. Latih (fit) model dengan data training (X_train dan y_train)\n",
        "decision_tree_model.________(________, ________)\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "4JYxBe87NLDk"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Menyimpan Model\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "joblib.dump(________, 'decision_tree_model.h5')\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "P_AakAxghYv-"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# **5. Memenuhi Kriteria Skilled dan Advanced dalam Membangun Model Klasifikasi**\n",
        "\n"
      ],
      "metadata": {
        "id": "epO4HhrzBXMg"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "**Biarkan kosong jika tidak menerapkan kriteria skilled atau advanced**"
      ],
      "metadata": {
        "id": "DNOEZk24uiXu"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Melatih model menggunakan algoritma klasifikasi scikit-learn selain Decision Tree. (Contoh: RandomForestClassifier)\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# Buat (instantiate) objek model baru\n",
        "new_model = ________(________)\n",
        "\n",
        "# Latih (fit) model dengan data training (X_train dan y_train)\n",
        "new_model.________(________, ________)\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "kB_8LIWMATl6"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Menampilkan hasil evaluasi akurasi, presisi, recall, dan F1-Score pada seluruh algoritma yang sudah dibuat.\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# Buat prediksi pada data 'X_test' menggunakan kedua model\n",
        "y_pred_dt = decision_tree_model.________(________)\n",
        "y_pred_new = new_model.________(________)\n",
        "\n",
        "# Tampilkan classification_report untuk Decision Tree\n",
        "print(\"Decision Tree Performance\")\n",
        "print(classification_report(________, ________))\n",
        "\n",
        "print(\"=\"*50)\n",
        "\n",
        "# Tampilkan classification_report untuk New Model\n",
        "print(\"New Model Performance\")\n",
        "print(classification_report(________, ________))\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "bRlKm5BVAT91"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Menyimpan Model Selain Decision Tree\n",
        "# Model ini bisa lebih dari satu\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "________.dump(new_model, 'explore_<NAMA ALGORITMA-MU>_classification.h5')\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "dUPItkbXBNkO"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Hyperparameter Tuning Model\n",
        "\n",
        "Pilih salah satu algoritma yang ingin Anda tuning"
      ],
      "metadata": {
        "id": "u23H2guj-h9h"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Lakukan Hyperparameter Tuning dan Latih ulang.\n",
        "# Lakukan dalam satu cell ini saja.\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# Tentukan Hyperparameter yang akan di-tuning\n",
        "params = {________,\n",
        "          ________,\n",
        "          ________,}\n",
        "\n",
        "# Buat (instantiate) objek dari algoritma tuning\n",
        "#  - 'estimator': Model yang akan di-tuning\n",
        "#  - 'params': Hyperparameter yang sudah kita tentukan\n",
        "new_model_tuned = ________(\n",
        "    estimator = ________(random_state=42),\n",
        "    ________ = params,\n",
        "    cv = 5,\n",
        "    scoring = 'accuracy'\n",
        ")\n",
        "\n",
        "# Latih objek model dengan data training (X_train dan y_train)\n",
        "new_model_tuned.________(________, ________)\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "dFCTxJJq-m-l"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Menampilkan hasil evaluasi akurasi, presisi, recall, dan F1-Score pada algoritma yang sudah dituning.\n",
        "\n",
        "### MULAI CODE ###\n",
        "\n",
        "# Buat prediksi pada 'X_test' Gunakan model yang sudah di-tuning\n",
        "y_pred_tuning = new_model_tuned.________(________)\n",
        "\n",
        "# Tampilkan classification_report untuk model yang sudah di-tuning\n",
        "print(\"Tuned Model Performance\")\n",
        "print(classification_report(________, ________))\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "1g6EPSSWxjcQ"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Menyimpan Model hasil tuning\n",
        "\n",
        "### MULAI CODE\n",
        "\n",
        "________.dump(new_model_tuned, 'tuning_classification.h5')\n",
        "\n",
        "### SELESAI CODE ###"
      ],
      "metadata": {
        "id": "7UJNcVP--n7S"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "End of Code"
      ],
      "metadata": {
        "id": "0Hs4Xp4OiGEk"
      }
    }
  ]
}