{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Membangun sistem AI yang belajar dari data harga kendaraan bekas dan dapat memprediksi harga masa depan berdasarkan tren depresiasi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Packages"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:49:16.104468Z",
"iopub.status.busy": "2025-05-07T19:49:16.103716Z",
"iopub.status.idle": "2025-05-07T19:51:00.330501Z",
"shell.execute_reply": "2025-05-07T19:51:00.329776Z",
"shell.execute_reply.started": "2025-05-07T19:49:16.104435Z"
},
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: transformers in /usr/local/lib/python3.11/dist-packages (4.51.1)\n",
"Requirement already satisfied: datasets in /usr/local/lib/python3.11/dist-packages (3.5.0)\n",
"Requirement already satisfied: torch in /usr/local/lib/python3.11/dist-packages (2.5.1+cu124)\n",
"Collecting scikit-learn==1.6.1\n",
" Downloading scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)\n",
"Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.6.1) (1.26.4)\n",
"Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.6.1) (1.15.2)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.6.1) (1.4.2)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.6.1) (3.6.0)\n",
"Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from transformers) (3.18.0)\n",
"Requirement already satisfied: huggingface-hub<1.0,>=0.30.0 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.30.2)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from transformers) (24.2)\n",
"Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from transformers) (6.0.2)\n",
"Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.11/dist-packages (from transformers) (2024.11.6)\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from transformers) (2.32.3)\n",
"Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.21.0)\n",
"Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.5.2)\n",
"Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.11/dist-packages (from transformers) (4.67.1)\n",
"Requirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.11/dist-packages (from datasets) (19.0.1)\n",
"Requirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.11/dist-packages (from datasets) (0.3.8)\n",
"Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (from datasets) (2.2.3)\n",
"Requirement already satisfied: xxhash in /usr/local/lib/python3.11/dist-packages (from datasets) (3.5.0)\n",
"Requirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.11/dist-packages (from datasets) (0.70.16)\n",
"Collecting fsspec<=2024.12.0,>=2023.1.0 (from fsspec[http]<=2024.12.0,>=2023.1.0->datasets)\n",
" Downloading fsspec-2024.12.0-py3-none-any.whl.metadata (11 kB)\n",
"Requirement already satisfied: aiohttp in /usr/local/lib/python3.11/dist-packages (from datasets) (3.11.16)\n",
"Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.11/dist-packages (from torch) (4.13.1)\n",
"Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch) (3.4.2)\n",
"Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch) (3.1.6)\n",
"Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch) (12.4.127)\n",
"Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch) (12.4.127)\n",
"Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch) (12.4.127)\n",
"Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch)\n",
" Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Collecting nvidia-cublas-cu12==12.4.5.8 (from torch)\n",
" Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cufft-cu12==11.2.1.3 (from torch)\n",
" Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-curand-cu12==10.3.5.147 (from torch)\n",
" Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch)\n",
" Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch)\n",
" Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch) (2.21.5)\n",
"Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch) (12.4.127)\n",
"Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch)\n",
" Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Requirement already satisfied: triton==3.1.0 in /usr/local/lib/python3.11/dist-packages (from torch) (3.1.0)\n",
"Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch) (1.13.1)\n",
"Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy==1.13.1->torch) (1.3.0)\n",
"Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (2.6.1)\n",
"Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (1.3.2)\n",
"Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (25.3.0)\n",
"Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (1.5.0)\n",
"Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (6.2.0)\n",
"Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (0.3.1)\n",
"Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp->datasets) (1.19.0)\n",
"Requirement already satisfied: mkl_fft in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (1.3.8)\n",
"Requirement already satisfied: mkl_random in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (1.2.4)\n",
"Requirement already satisfied: mkl_umath in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (0.1.1)\n",
"Requirement already satisfied: mkl in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (2025.1.0)\n",
"Requirement already satisfied: tbb4py in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (2022.1.0)\n",
"Requirement already satisfied: mkl-service in /usr/local/lib/python3.11/dist-packages (from numpy>=1.19.5->scikit-learn==1.6.1) (2.4.1)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (3.4.1)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (3.10)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (2.3.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (2025.1.31)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch) (3.0.2)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2025.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n",
"Requirement already satisfied: intel-openmp<2026,>=2024 in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.19.5->scikit-learn==1.6.1) (2024.2.0)\n",
"Requirement already satisfied: tbb==2022.* in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.19.5->scikit-learn==1.6.1) (2022.1.0)\n",
"Requirement already satisfied: tcmlib==1.* in /usr/local/lib/python3.11/dist-packages (from tbb==2022.*->mkl->numpy>=1.19.5->scikit-learn==1.6.1) (1.2.0)\n",
"Requirement already satisfied: intel-cmplr-lib-rt in /usr/local/lib/python3.11/dist-packages (from mkl_umath->numpy>=1.19.5->scikit-learn==1.6.1) (2024.2.0)\n",
"Requirement already satisfied: intel-cmplr-lib-ur==2024.2.0 in /usr/local/lib/python3.11/dist-packages (from intel-openmp<2026,>=2024->mkl->numpy>=1.19.5->scikit-learn==1.6.1) (2024.2.0)\n",
"Downloading scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.5 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.5/13.5 MB\u001b[0m \u001b[31m89.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m4.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0:00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0:00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m2.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0:00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m28.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m12.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0mm\n",
"\u001b[?25hDownloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m50.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
"\u001b[?25hDownloading fsspec-2024.12.0-py3-none-any.whl (183 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m183.9/183.9 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hInstalling collected packages: nvidia-nvjitlink-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cublas-cu12, fsspec, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nvidia-cusolver-cu12, scikit-learn\n",
" Attempting uninstall: nvidia-nvjitlink-cu12\n",
" Found existing installation: nvidia-nvjitlink-cu12 12.8.93\n",
" Uninstalling nvidia-nvjitlink-cu12-12.8.93:\n",
" Successfully uninstalled nvidia-nvjitlink-cu12-12.8.93\n",
" Attempting uninstall: nvidia-curand-cu12\n",
" Found existing installation: nvidia-curand-cu12 10.3.9.90\n",
" Uninstalling nvidia-curand-cu12-10.3.9.90:\n",
" Successfully uninstalled nvidia-curand-cu12-10.3.9.90\n",
" Attempting uninstall: nvidia-cufft-cu12\n",
" Found existing installation: nvidia-cufft-cu12 11.3.3.83\n",
" Uninstalling nvidia-cufft-cu12-11.3.3.83:\n",
" Successfully uninstalled nvidia-cufft-cu12-11.3.3.83\n",
" Attempting uninstall: nvidia-cublas-cu12\n",
" Found existing installation: nvidia-cublas-cu12 12.8.4.1\n",
" Uninstalling nvidia-cublas-cu12-12.8.4.1:\n",
" Successfully uninstalled nvidia-cublas-cu12-12.8.4.1\n",
" Attempting uninstall: fsspec\n",
" Found existing installation: fsspec 2025.3.2\n",
" Uninstalling fsspec-2025.3.2:\n",
" Successfully uninstalled fsspec-2025.3.2\n",
" Attempting uninstall: nvidia-cusparse-cu12\n",
" Found existing installation: nvidia-cusparse-cu12 12.5.8.93\n",
" Uninstalling nvidia-cusparse-cu12-12.5.8.93:\n",
" Successfully uninstalled nvidia-cusparse-cu12-12.5.8.93\n",
" Attempting uninstall: nvidia-cudnn-cu12\n",
" Found existing installation: nvidia-cudnn-cu12 9.3.0.75\n",
" Uninstalling nvidia-cudnn-cu12-9.3.0.75:\n",
" Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75\n",
" Attempting uninstall: nvidia-cusolver-cu12\n",
" Found existing installation: nvidia-cusolver-cu12 11.7.3.90\n",
" Uninstalling nvidia-cusolver-cu12-11.7.3.90:\n",
" Successfully uninstalled nvidia-cusolver-cu12-11.7.3.90\n",
" Attempting uninstall: scikit-learn\n",
" Found existing installation: scikit-learn 1.2.2\n",
" Uninstalling scikit-learn-1.2.2:\n",
" Successfully uninstalled scikit-learn-1.2.2\n",
"\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
"category-encoders 2.7.0 requires scikit-learn<1.6.0,>=1.0.0, but you have scikit-learn 1.6.1 which is incompatible.\n",
"gcsfs 2024.10.0 requires fsspec==2024.10.0, but you have fsspec 2024.12.0 which is incompatible.\n",
"bigframes 1.36.0 requires rich<14,>=12.4.4, but you have rich 14.0.0 which is incompatible.\n",
"pylibcugraph-cu12 24.12.0 requires pylibraft-cu12==24.12.*, but you have pylibraft-cu12 25.2.0 which is incompatible.\n",
"pylibcugraph-cu12 24.12.0 requires rmm-cu12==24.12.*, but you have rmm-cu12 25.2.0 which is incompatible.\u001b[0m\u001b[31m\n",
"\u001b[0mSuccessfully installed fsspec-2024.12.0 nvidia-cublas-cu12-12.4.5.8 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-nvjitlink-cu12-12.4.127 scikit-learn-1.6.1\n",
"Requirement already satisfied: sentence-transformers in /usr/local/lib/python3.11/dist-packages (3.4.1)\n",
"Requirement already satisfied: transformers<5.0.0,>=4.41.0 in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (4.51.1)\n",
"Requirement already satisfied: tqdm in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (4.67.1)\n",
"Requirement already satisfied: torch>=1.11.0 in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (2.5.1+cu124)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (1.6.1)\n",
"Requirement already satisfied: scipy in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (1.15.2)\n",
"Requirement already satisfied: huggingface-hub>=0.20.0 in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (0.30.2)\n",
"Requirement already satisfied: Pillow in /usr/local/lib/python3.11/dist-packages (from sentence-transformers) (11.1.0)\n",
"Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (3.18.0)\n",
"Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2024.12.0)\n",
"Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (24.2)\n",
"Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (6.0.2)\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2.32.3)\n",
"Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (4.13.1)\n",
"Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (3.4.2)\n",
"Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (3.1.6)\n",
"Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.127)\n",
"Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.127)\n",
"Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.127)\n",
"Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (9.1.0.70)\n",
"Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.5.8)\n",
"Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (11.2.1.3)\n",
"Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (10.3.5.147)\n",
"Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (11.6.1.9)\n",
"Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.3.1.170)\n",
"Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (2.21.5)\n",
"Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.127)\n",
"Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (12.4.127)\n",
"Requirement already satisfied: triton==3.1.0 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (3.1.0)\n",
"Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch>=1.11.0->sentence-transformers) (1.13.1)\n",
"Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy==1.13.1->torch>=1.11.0->sentence-transformers) (1.3.0)\n",
"Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.11/dist-packages (from transformers<5.0.0,>=4.41.0->sentence-transformers) (1.26.4)\n",
"Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.11/dist-packages (from transformers<5.0.0,>=4.41.0->sentence-transformers) (2024.11.6)\n",
"Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.11/dist-packages (from transformers<5.0.0,>=4.41.0->sentence-transformers) (0.21.0)\n",
"Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from transformers<5.0.0,>=4.41.0->sentence-transformers) (0.5.2)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->sentence-transformers) (1.4.2)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->sentence-transformers) (3.6.0)\n",
"Requirement already satisfied: mkl_fft in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (1.3.8)\n",
"Requirement already satisfied: mkl_random in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (1.2.4)\n",
"Requirement already satisfied: mkl_umath in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (0.1.1)\n",
"Requirement already satisfied: mkl in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2025.1.0)\n",
"Requirement already satisfied: tbb4py in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2022.1.0)\n",
"Requirement already satisfied: mkl-service in /usr/local/lib/python3.11/dist-packages (from numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2.4.1)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch>=1.11.0->sentence-transformers) (3.0.2)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.4.1)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.10)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2.3.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2025.1.31)\n",
"Requirement already satisfied: intel-openmp<2026,>=2024 in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2024.2.0)\n",
"Requirement already satisfied: tbb==2022.* in /usr/local/lib/python3.11/dist-packages (from mkl->numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2022.1.0)\n",
"Requirement already satisfied: tcmlib==1.* in /usr/local/lib/python3.11/dist-packages (from tbb==2022.*->mkl->numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (1.2.0)\n",
"Requirement already satisfied: intel-cmplr-lib-rt in /usr/local/lib/python3.11/dist-packages (from mkl_umath->numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2024.2.0)\n",
"Requirement already satisfied: intel-cmplr-lib-ur==2024.2.0 in /usr/local/lib/python3.11/dist-packages (from intel-openmp<2026,>=2024->mkl->numpy>=1.17->transformers<5.0.0,>=4.41.0->sentence-transformers) (2024.2.0)\n"
]
}
],
"source": [
"!pip install transformers datasets torch scikit-learn==1.6.1\n",
"!pip install sentence-transformers\n",
"# !pip uninstall -y scikit-learn\n",
"# !pip install scikit-learn==1.6.1"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:00.332413Z",
"iopub.status.busy": "2025-05-07T19:51:00.332155Z",
"iopub.status.idle": "2025-05-07T19:51:00.617776Z",
"shell.execute_reply": "2025-05-07T19:51:00.617208Z",
"shell.execute_reply.started": "2025-05-07T19:51:00.332391Z"
},
"trusted": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from datetime import datetime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Preprocessing Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rules\n",
"- Tidak menggunakan drop duplicates karena merk bisa sama dan harga berbeda\n",
"- Menggunakan fungsi untuk feature engineering yaitu tahun, nama merk dan harga (integer)\n",
"- normalisasi harga\n",
"- tahun akan diubah menjadi one-hot-encoding\n",
"- ada logic untuk depresiasi harga dengan 10% penurunan tiap tahun\n",
" harga = harga_awal * (0.9) ** umur"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-06T16:38:53.637390Z",
"iopub.status.busy": "2025-05-06T16:38:53.636652Z",
"iopub.status.idle": "2025-05-06T16:38:53.678424Z",
"shell.execute_reply": "2025-05-06T16:38:53.677330Z",
"shell.execute_reply.started": "2025-05-06T16:38:53.637360Z"
},
"trusted": true
},
"outputs": [],
"source": [
"df = pd.read_csv('/kaggle/input/legoas-scrapping-otomotif/results.csv')\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-06T16:38:56.063738Z",
"iopub.status.busy": "2025-05-06T16:38:56.063438Z",
"iopub.status.idle": "2025-05-06T16:38:56.334665Z",
"shell.execute_reply": "2025-05-06T16:38:56.333648Z",
"shell.execute_reply.started": "2025-05-06T16:38:56.063716Z"
},
"trusted": true
},
"outputs": [],
"source": [
"# current year datetime dynamic\n",
"curent_year = datetime.now().year\n",
"\n",
"# feature engineering\n",
"df['year'] = df['car_names'].str.extract(r'(\\b\\d{4}\\b)')\n",
"df['car_names_clean'] = df['car_names'].str.replace(r'^\\d{4}\\s+', '', regex=True).str.split(r' - ').str[0].str.strip()\n",
"df['prices'] = df['car_prices'].str.replace(r'\\D', '', regex=True).apply(lambda x: int(x) if x else None)\n",
"df['ages'] = df['year'].apply(lambda x: curent_year - int(x))\n",
"df['estimated_original_price'] = df.apply(\n",
" lambda row: row['prices'] if row['ages'] == 0 else int(row['prices'] / (0.9 ** row['ages'])),\n",
" axis=1\n",
")\n",
"df['deprecate_percentage'] = ((df['estimated_original_price'] - df['prices']) / df['estimated_original_price'])\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-06T16:39:17.065222Z",
"iopub.status.busy": "2025-05-06T16:39:17.064476Z",
"iopub.status.idle": "2025-05-06T16:39:17.080912Z",
"shell.execute_reply": "2025-05-06T16:39:17.079946Z",
"shell.execute_reply.started": "2025-05-06T16:39:17.065190Z"
},
"trusted": true
},
"outputs": [],
"source": [
"feature_selected = df[['car_names_clean', 'prices', 'ages', 'estimated_original_price', 'deprecate_percentage','year']]\n",
"feature_selected"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-06T16:40:50.642557Z",
"iopub.status.busy": "2025-05-06T16:40:50.641742Z",
"iopub.status.idle": "2025-05-06T16:40:50.702984Z",
"shell.execute_reply": "2025-05-06T16:40:50.702219Z",
"shell.execute_reply.started": "2025-05-06T16:40:50.642528Z"
},
"trusted": true
},
"outputs": [],
"source": [
"feature_selected.to_csv('/kaggle/working/pemrosesan.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Modeling"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:00.618979Z",
"iopub.status.busy": "2025-05-07T19:51:00.618498Z",
"iopub.status.idle": "2025-05-07T19:51:40.777507Z",
"shell.execute_reply": "2025-05-07T19:51:40.776631Z",
"shell.execute_reply.started": "2025-05-07T19:51:00.618958Z"
},
"trusted": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2025-05-07 19:51:20.403766: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
"E0000 00:00:1746647480.840255 31 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
"E0000 00:00:1746647480.968271 31 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n"
]
}
],
"source": [
"import torch, joblib\n",
"from torch import nn\n",
"from torch.utils.data import Dataset, DataLoader\n",
"from transformers import RobertaTokenizer, RobertaModel\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n",
"from sentence_transformers import SentenceTransformer\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:40.779745Z",
"iopub.status.busy": "2025-05-07T19:51:40.779227Z",
"iopub.status.idle": "2025-05-07T19:51:40.849371Z",
"shell.execute_reply": "2025-05-07T19:51:40.848610Z",
"shell.execute_reply.started": "2025-05-07T19:51:40.779724Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" car_names_clean | \n",
" prices | \n",
" ages | \n",
" estimated_original_price | \n",
" deprecate_percentage | \n",
" year | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Mazda CX-5 2.5 Elite SUV | \n",
" 415000000 | \n",
" 3 | \n",
" 569272976 | \n",
" 0.271000 | \n",
" 2022 | \n",
"
\n",
" \n",
" 1 | \n",
" Mitsubishi Xpander Cross 1.5 Premium MPV | \n",
" 222000000 | \n",
" 6 | \n",
" 417732165 | \n",
" 0.468559 | \n",
" 2019 | \n",
"
\n",
" \n",
" 2 | \n",
" Wuling Alvez 1.5 EX SUV | \n",
" 286000000 | \n",
" 0 | \n",
" 286000000 | \n",
" 0.000000 | \n",
" 2025 | \n",
"
\n",
" \n",
" 3 | \n",
" Mitsubishi Pajero Sport 2.4 Dakar 4x2 SUV | \n",
" 450000000 | \n",
" 3 | \n",
" 617283950 | \n",
" 0.271000 | \n",
" 2022 | \n",
"
\n",
" \n",
" 4 | \n",
" Daihatsu Terios 1.5 TX SUV | \n",
" 111000000 | \n",
" 16 | \n",
" 599022075 | \n",
" 0.814698 | \n",
" 2009 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 11820 | \n",
" Hyundai IONIQ 6 Fastback | \n",
" 1020000000 | \n",
" 1 | \n",
" 1133333333 | \n",
" 0.100000 | \n",
" 2024 | \n",
"
\n",
" \n",
" 11821 | \n",
" Toyota Raize 1.0 GR Sport (2 Tone) SUV | \n",
" 200000000 | \n",
" 3 | \n",
" 274348422 | \n",
" 0.271000 | \n",
" 2022 | \n",
"
\n",
" \n",
" 11822 | \n",
" Toyota Sienta 1.5 G MPV | \n",
" 150000000 | \n",
" 7 | \n",
" 313612737 | \n",
" 0.521703 | \n",
" 2018 | \n",
"
\n",
" \n",
" 11823 | \n",
" Mitsubishi Pajero Sport 2.4 Dakar 4X2 SUV | \n",
" 415000000 | \n",
" 5 | \n",
" 702806144 | \n",
" 0.409510 | \n",
" 2020 | \n",
"
\n",
" \n",
" 11824 | \n",
" Toyota Calya 1.2 G MPV | \n",
" 108000000 | \n",
" 7 | \n",
" 225801170 | \n",
" 0.521703 | \n",
" 2018 | \n",
"
\n",
" \n",
"
\n",
"
11825 rows × 6 columns
\n",
"
"
],
"text/plain": [
" car_names_clean prices ages \\\n",
"0 Mazda CX-5 2.5 Elite SUV 415000000 3 \n",
"1 Mitsubishi Xpander Cross 1.5 Premium MPV 222000000 6 \n",
"2 Wuling Alvez 1.5 EX SUV 286000000 0 \n",
"3 Mitsubishi Pajero Sport 2.4 Dakar 4x2 SUV 450000000 3 \n",
"4 Daihatsu Terios 1.5 TX SUV 111000000 16 \n",
"... ... ... ... \n",
"11820 Hyundai IONIQ 6 Fastback 1020000000 1 \n",
"11821 Toyota Raize 1.0 GR Sport (2 Tone) SUV 200000000 3 \n",
"11822 Toyota Sienta 1.5 G MPV 150000000 7 \n",
"11823 Mitsubishi Pajero Sport 2.4 Dakar 4X2 SUV 415000000 5 \n",
"11824 Toyota Calya 1.2 G MPV 108000000 7 \n",
"\n",
" estimated_original_price deprecate_percentage year \n",
"0 569272976 0.271000 2022 \n",
"1 417732165 0.468559 2019 \n",
"2 286000000 0.000000 2025 \n",
"3 617283950 0.271000 2022 \n",
"4 599022075 0.814698 2009 \n",
"... ... ... ... \n",
"11820 1133333333 0.100000 2024 \n",
"11821 274348422 0.271000 2022 \n",
"11822 313612737 0.521703 2018 \n",
"11823 702806144 0.409510 2020 \n",
"11824 225801170 0.521703 2018 \n",
"\n",
"[11825 rows x 6 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('/kaggle/working/pemrosesan.csv')\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:40.850347Z",
"iopub.status.busy": "2025-05-07T19:51:40.850100Z",
"iopub.status.idle": "2025-05-07T19:51:40.883221Z",
"shell.execute_reply": "2025-05-07T19:51:40.882458Z",
"shell.execute_reply.started": "2025-05-07T19:51:40.850328Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" car_names_clean | \n",
" prices | \n",
" ages | \n",
" estimated_original_price | \n",
" deprecate_percentage | \n",
" year | \n",
" p_norm | \n",
" eop_norm | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Mazda CX-5 2.5 Elite SUV | \n",
" 415000000 | \n",
" 3 | \n",
" 569272976 | \n",
" 0.271000 | \n",
" 2022 | \n",
" 0.001652 | \n",
" 0.001338 | \n",
"
\n",
" \n",
" 1 | \n",
" Mitsubishi Xpander Cross 1.5 Premium MPV | \n",
" 222000000 | \n",
" 6 | \n",
" 417732165 | \n",
" 0.468559 | \n",
" 2019 | \n",
" 0.000884 | \n",
" 0.000982 | \n",
"
\n",
" \n",
" 2 | \n",
" Wuling Alvez 1.5 EX SUV | \n",
" 286000000 | \n",
" 0 | \n",
" 286000000 | \n",
" 0.000000 | \n",
" 2025 | \n",
" 0.001139 | \n",
" 0.000672 | \n",
"
\n",
" \n",
" 3 | \n",
" Mitsubishi Pajero Sport 2.4 Dakar 4x2 SUV | \n",
" 450000000 | \n",
" 3 | \n",
" 617283950 | \n",
" 0.271000 | \n",
" 2022 | \n",
" 0.001792 | \n",
" 0.001451 | \n",
"
\n",
" \n",
" 4 | \n",
" Daihatsu Terios 1.5 TX SUV | \n",
" 111000000 | \n",
" 16 | \n",
" 599022075 | \n",
" 0.814698 | \n",
" 2009 | \n",
" 0.000442 | \n",
" 0.001408 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 11820 | \n",
" Hyundai IONIQ 6 Fastback | \n",
" 1020000000 | \n",
" 1 | \n",
" 1133333333 | \n",
" 0.100000 | \n",
" 2024 | \n",
" 0.004061 | \n",
" 0.002665 | \n",
"
\n",
" \n",
" 11821 | \n",
" Toyota Raize 1.0 GR Sport (2 Tone) SUV | \n",
" 200000000 | \n",
" 3 | \n",
" 274348422 | \n",
" 0.271000 | \n",
" 2022 | \n",
" 0.000796 | \n",
" 0.000645 | \n",
"
\n",
" \n",
" 11822 | \n",
" Toyota Sienta 1.5 G MPV | \n",
" 150000000 | \n",
" 7 | \n",
" 313612737 | \n",
" 0.521703 | \n",
" 2018 | \n",
" 0.000597 | \n",
" 0.000737 | \n",
"
\n",
" \n",
" 11823 | \n",
" Mitsubishi Pajero Sport 2.4 Dakar 4X2 SUV | \n",
" 415000000 | \n",
" 5 | \n",
" 702806144 | \n",
" 0.409510 | \n",
" 2020 | \n",
" 0.001652 | \n",
" 0.001652 | \n",
"
\n",
" \n",
" 11824 | \n",
" Toyota Calya 1.2 G MPV | \n",
" 108000000 | \n",
" 7 | \n",
" 225801170 | \n",
" 0.521703 | \n",
" 2018 | \n",
" 0.000430 | \n",
" 0.000531 | \n",
"
\n",
" \n",
"
\n",
"
11825 rows × 8 columns
\n",
"
"
],
"text/plain": [
" car_names_clean prices ages \\\n",
"0 Mazda CX-5 2.5 Elite SUV 415000000 3 \n",
"1 Mitsubishi Xpander Cross 1.5 Premium MPV 222000000 6 \n",
"2 Wuling Alvez 1.5 EX SUV 286000000 0 \n",
"3 Mitsubishi Pajero Sport 2.4 Dakar 4x2 SUV 450000000 3 \n",
"4 Daihatsu Terios 1.5 TX SUV 111000000 16 \n",
"... ... ... ... \n",
"11820 Hyundai IONIQ 6 Fastback 1020000000 1 \n",
"11821 Toyota Raize 1.0 GR Sport (2 Tone) SUV 200000000 3 \n",
"11822 Toyota Sienta 1.5 G MPV 150000000 7 \n",
"11823 Mitsubishi Pajero Sport 2.4 Dakar 4X2 SUV 415000000 5 \n",
"11824 Toyota Calya 1.2 G MPV 108000000 7 \n",
"\n",
" estimated_original_price deprecate_percentage year p_norm \\\n",
"0 569272976 0.271000 2022 0.001652 \n",
"1 417732165 0.468559 2019 0.000884 \n",
"2 286000000 0.000000 2025 0.001139 \n",
"3 617283950 0.271000 2022 0.001792 \n",
"4 599022075 0.814698 2009 0.000442 \n",
"... ... ... ... ... \n",
"11820 1133333333 0.100000 2024 0.004061 \n",
"11821 274348422 0.271000 2022 0.000796 \n",
"11822 313612737 0.521703 2018 0.000597 \n",
"11823 702806144 0.409510 2020 0.001652 \n",
"11824 225801170 0.521703 2018 0.000430 \n",
"\n",
" eop_norm \n",
"0 0.001338 \n",
"1 0.000982 \n",
"2 0.000672 \n",
"3 0.001451 \n",
"4 0.001408 \n",
"... ... \n",
"11820 0.002665 \n",
"11821 0.000645 \n",
"11822 0.000737 \n",
"11823 0.001652 \n",
"11824 0.000531 \n",
"\n",
"[11825 rows x 8 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# normalisasi, karena komputer sebatas bisa membaca angka 0-1 dan memudahkan komputasi \n",
"p_scaler = MinMaxScaler()\n",
"eop_scaler = MinMaxScaler()\n",
"df['p_norm'] = p_scaler.fit_transform(df[['prices']])\n",
"df['eop_norm'] = eop_scaler.fit_transform(df[['estimated_original_price']])\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:40.884278Z",
"iopub.status.busy": "2025-05-07T19:51:40.884008Z",
"iopub.status.idle": "2025-05-07T19:51:40.893468Z",
"shell.execute_reply": "2025-05-07T19:51:40.892785Z",
"shell.execute_reply.started": "2025-05-07T19:51:40.884259Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/plain": [
"['/kaggle/working/eop_norm.pkl']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"joblib.dump(p_scaler, \"/kaggle/working/price_norm.pkl\")\n",
"joblib.dump(eop_scaler, \"/kaggle/working/eop_norm.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:40.894668Z",
"iopub.status.busy": "2025-05-07T19:51:40.894391Z",
"iopub.status.idle": "2025-05-07T19:51:51.842095Z",
"shell.execute_reply": "2025-05-07T19:51:51.841383Z",
"shell.execute_reply.started": "2025-05-07T19:51:40.894635Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "546eeae9f79f476ba920558002287196",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"modules.json: 0%| | 0.00/349 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a84117e873294c05be0dc10b18f55d27",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"config_sentence_transformers.json: 0%| | 0.00/116 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5b2346546af04bc0a55066aacf7661a7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"README.md: 0%| | 0.00/10.5k [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "afd4fb3a2c1a4632b7713128949c80da",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"sentence_bert_config.json: 0%| | 0.00/53.0 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0785187f3e1a4786b4707b29c47b3df1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"config.json: 0%| | 0.00/612 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Xet Storage is enabled for this repo, but the 'hf_xet' package is not installed. Falling back to regular HTTP download. For better performance, install the package with: `pip install huggingface_hub[hf_xet]` or `pip install hf_xet`\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a6f46bf4b3b84c95b9a7c53b7f8b3469",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"model.safetensors: 0%| | 0.00/90.9M [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "19a345faa30d4a7988925ac78c672416",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"tokenizer_config.json: 0%| | 0.00/350 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3cbd190197e946448dd7443b26031b51",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"vocab.txt: 0%| | 0.00/232k [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "200e6c29af4846448cfb0cf2e93f6b10",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"tokenizer.json: 0%| | 0.00/466k [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "31f510e2e486453cab57483ef72dd39b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"special_tokens_map.json: 0%| | 0.00/112 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "203c6e02011b4b17b6ea38729766ce3f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"config.json: 0%| | 0.00/190 [00:00, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "56810e3b5bef416c962b3ac222fa4f39",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Batches: 0%| | 0/370 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"bert_model = SentenceTransformer('all-MiniLM-L6-v2')\n",
"car_names_embeddings = bert_model.encode(df['car_names_clean'].tolist(), show_progress_bar=True)\n",
"car_names_df = pd.DataFrame(car_names_embeddings, columns=[f'bert_{i}' for i in range(car_names_embeddings.shape[1])])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:51.844223Z",
"iopub.status.busy": "2025-05-07T19:51:51.843924Z",
"iopub.status.idle": "2025-05-07T19:51:52.135146Z",
"shell.execute_reply": "2025-05-07T19:51:52.134449Z",
"shell.execute_reply.started": "2025-05-07T19:51:51.844193Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"image/png": "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FRWln376ST179tQff/xhP95xcXFq3bq1vv76a6WkpDgsM3jw4HTXVa1aNftZdOmvB8lVrlxZx48ft0/z9PS037ucnJysP/74Q35+fqpcubL27t1rH7d+/XoVL15cjz/+uH2aj4+Pw4PLUt38PY+Li9OFCxf04IMPyrIs7du3L834YcOG2f8/9bLkxMREffXVVxkepztxdr9S9enTx6HuM2fOaP/+/erdu7fDA9lCQkIUHBzssOzy5cuVL18+tW3b1uFnpF69evLz87vjz8iddOnSxeHsesOGDdWoUSOtX78+0+vq27evPDw87J9T+yO1J/bs2aNz585pyJAhDs9Q6NSpk6pUqaJ169alWeezzz6b7rZat27tcBVM6lU1Xbt2lb+/f5rpN/clgLyDy8sBAPe9xYsXa/To0Wrfvr127NihypUr2+edP39e8fHxDtNSVa1aVSkpKfrll1/slxpLUtmyZR3G/fTTT5KkVq1apbv9gICA29YXGRmp8PBwffvtt4qPj3eYd/nyZeXLl08hISHq2rWrJk+erNdff10tWrRQly5d1LNnz7t+6FnFihXVpk2bu1r2Xtx6/DIr9Xj36dMnwzGXL19WgQIF7rjN0qVLp5lWoEABh/uMU1JSNG/ePC1YsEAnTpxQcnKyfV7BggXt///zzz+rQoUKad7Dnl5vnTp1ShMnTtSaNWsctpVa+81cXFzSPBStUqVKknRP9/k6u1+pbj2GP//8sySpQoUKacZWqFDBIbj/9NNPunz5sooUKZJuLefOnburfUhVsWLFNNMqVaqkTz75JNPrurUnUvso9fuUut/pfV+rVKminTt3Okxzc3PL8NkFt24rX758kpTmF4Sp02/tFQB5A6EbAHDfq1atmtavX6/WrVurbdu2ioyMTPest7NuPtsnyX5W9b333lOxYsXSjL/dK7yOHTum1q1bq0qVKpozZ44CAwPl4eGh9evX6/XXX7ev22azacWKFfruu+/0+eef68svv1S/fv00e/Zsfffdd7ny1U83h7ib3Xr8Miv1mLz22msZvkrs1uOR0TYzOuNu3XTf9/Tp0/XSSy+pX79+mjp1qh544AG5uLho5MiRac6oOyM5OVlt27bVn3/+qXHjxqlKlSry9fXV6dOnFRYWdlfrvBuZ3a97+b6lpKSoSJEi+uCDD9Kdn/qqutzAmZ7IjJuvKHB2W1ldA4DcjdANAMgTGjZsqNWrV6tTp05q27atduzYocKFC6tw4cLy8fFRTExMmmUOHz4sFxeXOwb08uXLS5KKFCmS6TPHn3/+uRISErRmzRqHs14ZXW7buHFjNW7cWNOmTdOHH36oXr16admyZRowYECmtptZt569vVmBAgV06dIlh2mJiYn67bffjGwz9XgHBARky5n6FStWqGXLlvrPf/7jMP3SpUsqVKiQ/XOZMmV04MABWZblUPutvbV//34dOXJE77zzjnr37m2fvmnTpnS3n5KSouPHj9vPbkvSkSNHJOme3pnu7H5lpEyZMpKU7pO9b51Wvnx5ffXVV2ratOkdw/vtei0jqVc/3OzIkSNG3imfut8xMTFprm6JiYmxzwcAZ3FPNwAgz2jdurU++ugjHT16VO3bt1dsbKxcXV3Vrl07ffbZZw6X6v7+++/68MMP1axZszteHh4aGqqAgABNnz493futz58/n+GyqWe0bj6DdfnyZS1dutRh3MWLF9Oc5Uo9y5veK6myWup7hW8N19Jfgerrr792mPbWW29leKb7XrdZr149lS9fXrNmzdLVq1fTLHe74303XF1d0xz75cuXp3k9VMeOHXXmzBmtWLHCPi0+Pl5vvfVWmvVJjt9zy7I0b968DGt48803Hca++eabcnd3V+vWrTO/QzfV4cx+ZaREiRKqUaOG3n33XYfvw/bt2+2vvUrVvXt3JScna+rUqWnWc+PGDYfvsa+vb7p9djurV692qPv777/Xrl271KFDh0ytxxn169dXkSJFtGjRIoefvS+++EKHDh1K8zpCALgTznQDAPKURx99VEuWLFG/fv30yCOPaMOGDXr55Ze1adMmNWvWTEOGDJGbm5sWL16shIQEvfrqq3dcZ0BAgBYuXKinn35adevW1ZNPPqnChQvr1KlTWrdunZo2beoQmm7Wrl07eXh4qHPnznrmmWd09epVLVmyREWKFHE4U/zOO+9owYIFevTRR1W+fHlduXJFS5YsUUBAgDp27JhlxycjtWvXlqurq1555RVdvnxZnp6e9neLDxgwQIMHD1bXrl3Vtm1bRUdH68svv3TqbOntlC9fXvnz59eiRYvk7+8vX19fNWrUSGXLltXbb7+tDh06qHr16urbt69Kliyp06dPa+vWrQoICNDnn3+eRXsuPfzww5oyZYr69u2rBx98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bDaFhYVJklJSUjRjxgyVLVtW3t7eqlWrllasWOHU8Uo9e75u3TrVrFlTXl5eaty4sQ4cOOAwbufOnWrevLm8vb0VGBio5557TnFxcfb5QUFBmjp1qnr37q2AgAANGjRIkhQZGakWLVrIx8dHBQoUUGhoqC5evOhU3am1bd68WfXr15ePj48efPBBxcTE2L9XkydPVnR0tGw2m2w2myIiIiRJc+bMUXBwsHx9fRUYGKghQ4bo6tWrDvu0ZMkSBQYGysfHR48++qjmzJmj/PnzO4z57LPPVLduXXl5ealcuXKaPHmybty44dSxBQAAAAATcjR0P//889q+fbs+++wzbdy4Udu2bdPevXvt84cNG6Zvv/1Wy5Yt0//+9z9169ZN7du3108//WQfEx8fr2nTpundd99VZGSkLl26pCeffNJhO0ePHtWnn36qlStXKioqSpLUrVs3nTt3Tl988YV++OEH1a1bV61bt9aff/4pSVq3bp0effRRdezYUfv27dPmzZvVsGFD+zqTkpI0depURUdHa/Xq1Tp58qQ9WAcGBurTTz+VJMXExOi3337TvHnzJEkzZszQu+++q0WLFunHH3/UqFGj9NRTT2n79u2ZOm6zZ8/W7t27VbhwYXXu3FlJSUmSpGPHjql9+/bq2rWr/ve//+njjz/Wzp07NWzYMId1zJo1S7Vq1dK+ffv00ksvKSoqSq1bt1a1atX07bffaufOnercubOSk5MzVfeECRM0e/Zs7dmzR25uburXr58k6YknntA///lPVa9eXb/99pt+++03PfHEE5IkFxcXvfHGG/rxxx/1zjvvaMuWLRo7dqx9nZGRkRo8eLBGjBihqKgotW3bVtOmTXPY7o4dO9S7d2+NGDFCBw8e1OLFixUREZFmHAAAAABkJ5tlWVZObPjq1asqWLCg3n//fXXr1k2S9Oeff6pUqVIaNGiQRo8erXLlyunUqVMqUaKEfbk2bdqoYcOGmj59uiIiItS3b1999913atSokSTp8OHDqlq1qnbt2qWGDRtq0qRJmj59uk6fPq3ChQtL+utMcKdOnXTu3Dl5enra112hQgWNHTtWgwYN0oMPPqhy5crp/fffd2p/9uzZowYNGujKlSvy8/PTtm3b1LJlS128eNF+RjYhIUEPPPCAvvrqKzVp0sS+7IABAxQfH68PP/zwtttIXeeyZcvsgTX1mEVERKh79+4aMGCAXF1dtXjxYvtyO3fuVEhIiOLi4uTl5aWgoCDVqVNHq1atso/p2bOnTp06pZ07d6bZrjN1p9b21VdfqXXr1pKk9evXq1OnTrp27Zq8vLw0adIkrV692v6Lj4ysWLFCgwcP1oULFyRJTz75pK5evaq1a9faxzz11FNau3at/Z75Nm3aqHXr1nrhhRfsY95//32NHTtWZ86cSXc7CQkJSkhIsH+OjY1VYGCgLly4oICAgNvWmFPaLW5318t62Dw0pNQQtW3bVu7u7llYFfKSpKQkbdq0iT7BHdErcAZ9AmfRK3BGbuuT2NhYFSpUSJcvX75tfnDLxpocHDt2TImJifawLEkPPPCAKleuLEnav3+/kpOTValSJYflEhISVLBgQftnNzc3NWjQwP65SpUqyp8/vw4dOmQ/M12mTBl74Jak6Ohoe+i/2bVr13Ts2DFJUlRUlAYOHJhh/T/88IMmTZqk6OhoXbx4USkpKZKkU6dOqVq1aukuc/ToUcXHx6tt27YO0xMTE1WnTp0Mt3Wrm4Nv6jE7dOiQfd/+97//6YMPPrCPsSxLKSkpOnHihKpWrSpJql+/vsM6o6Ki7L/8uJe6a9asaf//4sWLS5LOnTun0qVLZ7g/X331lWbMmKHDhw8rNjZWN27c0PXr1xUfHy8fHx/FxMQ4XNovSQ0bNnQI4dHR0YqMjHQ4s52cnOywnlvNmDFDkydPTjN948aN6Y7PDUYGjrzndWzatOneC0GeR5/AWfQKnEGfwFn0CpyRW/okPj7eqXE5Frrv5OrVq3J1ddUPP/wgV1dXh3l+fn6ZWpevr2+adRcvXtzh/vBUqWelvb29M1xfXFycQkNDFRoaqg8++ECFCxfWqVOnFBoaetuHkqXep7xu3TqVLFnSYd7NZ9zvxdWrV/XMM8/oueeeSzPv5uB76zG53f5mpu6bf+Nks9kkyf4LifScPHlSDz/8sJ599llNmzZNDzzwgHbu3Kn+/fsrMTHR6fB79epVTZ48WY899liaean38d/qhRde0OjRo+2fU890t2vXjjPd+NvKbb9BRu5Fr8AZ9AmcRa/AGbmtT2JjY50al2Ohu3z58nJ3d9euXbvsYfDixYs6cuSIQkJCVKdOHSUnJ+vcuXNq3rx5huu5ceOG9uzZYz+rHRMTo0uXLtnP6Kanbt26Onv2rNzc3BQUFJTumJo1a2rz5s3q27dvmnmHDx/WH3/8oZkzZyowMFDSX5eX38zDw0OS7PdES1K1atXk6empU6dOKSQkJMP67uS7775Lc8xS97du3bo6ePCgKlSokKl1pu5vemd+s6puDw8Ph+Mh/XXFQEpKimbPni0Xl78eMfDJJ584jKlcubJ2797tMO3Wz3Xr1lVMTEym9tvT0zPdX3a4u7vnih/i9CRa9/6k+dy8f8g96BM4i16BM+gTOItegTNyS584W0OOhW4/Pz/1799fzz//vAoWLKgiRYpowoQJ9uBVqVIl9erVS71799bs2bNVp04dnT9/Xps3b1bNmjXVqVMnSX/t6PDhw/XGG2/Izc1Nw4YNU+PGjR0eenarNm3aqEmTJurSpYteffVVVapUSWfOnLE/PK1+/foKDw9X69atVb58eT355JO6ceOG1q9fr3Hjxql06dLy8PDQ/PnzNXjwYB04cEBTp0512EaZMmVks9m0du1adezYUd7e3vL399eYMWM0atQopaSkqFmzZrp8+bIiIyMVEBCgPn36OHXspkyZooIFC6po0aKaMGGCChUqpC5dukiSxo0bp8aNG2vYsGEaMGCAfH19dfDgQW3atElvvvlmhut84YUXFBwcrCFDhmjw4MHy8PDQ1q1b1a1bNxUqVChL6g4KCtKJEycUFRWlUqVKyd/fXxUqVFBSUpLmz5+vzp07KzIyUosWLXJYbvjw4XrooYc0Z84cde7cWVu2bNEXX3xhP5MuSRMnTtTDDz+s0qVL6/HHH5eLi4uio6N14MABvfzyy07VBwAAAABZLUefXv7aa6+pefPm6ty5s9q0aaNmzZqpXr169vlLly5V79699c9//lOVK1dWly5dtHv3bofLpH18fDRu3Dj17NlTTZs2lZ+fnz7++OPbbtdms2n9+vV66KGH1LdvX1WqVElPPvmkfv75ZxUtWlSS1KJFCy1fvlxr1qxR7dq11apVK33//feSpMKFCysiIkLLly9XtWrVNHPmTM2aNcthGyVLltTkyZM1fvx4FS1a1P708KlTp+qll17SjBkzVLVqVbVv317r1q1T2bJlnT5uM2fO1IgRI1SvXj2dPXtWn3/+uf3Mes2aNbV9+3YdOXJEzZs3V506dTRx4kSHh9Glp1KlStq4caOio6PVsGFDNWnSRJ999pnc3NyyrO6uXbuqffv2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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"p_norm 1.000000\n",
"eop_norm 0.730175\n",
"deprecate_percentage -0.022325\n",
"ages -0.028863\n",
"Name: p_norm, dtype: float64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"analysis_df = pd.concat([df[['p_norm' , 'eop_norm', 'ages', 'deprecate_percentage']]], axis=1)\n",
"\n",
"correlations = analysis_df.corr(numeric_only=True)['p_norm'].sort_values(ascending=False)\n",
"\n",
"plt.figure(figsize=(10, 6))\n",
"sns.barplot(x=correlations.values, y=correlations.index)\n",
"plt.title('Korelasi Fitur terhadap Target p_norm')\n",
"plt.xlabel('Korelasi')\n",
"plt.ylabel('Fitur')\n",
"plt.grid(True)\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"correlations.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:52.136742Z",
"iopub.status.busy": "2025-05-07T19:51:52.135970Z",
"iopub.status.idle": "2025-05-07T19:51:52.165009Z",
"shell.execute_reply": "2025-05-07T19:51:52.164196Z",
"shell.execute_reply.started": "2025-05-07T19:51:52.136717Z"
},
"trusted": true
},
"outputs": [],
"source": [
"X = pd.concat([car_names_df, df[['eop_norm', 'ages']].reset_index(drop=True)], axis=1)\n",
"y = df['p_norm']"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:52.167635Z",
"iopub.status.busy": "2025-05-07T19:51:52.167277Z",
"iopub.status.idle": "2025-05-07T19:51:52.188251Z",
"shell.execute_reply": "2025-05-07T19:51:52.187478Z",
"shell.execute_reply.started": "2025-05-07T19:51:52.167618Z"
},
"trusted": true
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:52.189278Z",
"iopub.status.busy": "2025-05-07T19:51:52.189023Z",
"iopub.status.idle": "2025-05-07T19:51:52.212945Z",
"shell.execute_reply": "2025-05-07T19:51:52.212299Z",
"shell.execute_reply.started": "2025-05-07T19:51:52.189256Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" bert_0 | \n",
" bert_1 | \n",
" bert_2 | \n",
" bert_3 | \n",
" bert_4 | \n",
" bert_5 | \n",
" bert_6 | \n",
" bert_7 | \n",
" bert_8 | \n",
" bert_9 | \n",
" ... | \n",
" bert_376 | \n",
" bert_377 | \n",
" bert_378 | \n",
" bert_379 | \n",
" bert_380 | \n",
" bert_381 | \n",
" bert_382 | \n",
" bert_383 | \n",
" eop_norm | \n",
" ages | \n",
"
\n",
" \n",
" \n",
" \n",
" 11378 | \n",
" -0.029470 | \n",
" -0.013234 | \n",
" -0.041143 | \n",
" -0.077063 | \n",
" 0.026463 | \n",
" 0.027834 | \n",
" -0.050274 | \n",
" 0.031605 | \n",
" -0.003844 | \n",
" 0.016589 | \n",
" ... | \n",
" -0.063193 | \n",
" 0.065644 | \n",
" -0.057080 | \n",
" -0.018810 | \n",
" 0.041155 | \n",
" 0.026669 | \n",
" -0.023711 | \n",
" 0.013544 | \n",
" 0.001236 | \n",
" 4 | \n",
"
\n",
" \n",
" 10383 | \n",
" -0.114898 | \n",
" 0.106321 | \n",
" -0.001228 | \n",
" 0.049948 | \n",
" -0.084037 | \n",
" 0.012905 | \n",
" -0.019098 | \n",
" 0.118853 | \n",
" -0.006946 | \n",
" -0.044849 | \n",
" ... | \n",
" -0.038572 | \n",
" 0.093288 | \n",
" -0.036840 | \n",
" -0.013068 | \n",
" 0.022624 | \n",
" 0.001857 | \n",
" -0.011609 | \n",
" -0.008182 | \n",
" 0.002801 | \n",
" 2 | \n",
"
\n",
" \n",
" 6106 | \n",
" -0.056078 | \n",
" -0.041918 | \n",
" -0.029557 | \n",
" -0.082310 | \n",
" 0.018389 | \n",
" 0.034702 | \n",
" -0.072229 | \n",
" 0.045174 | \n",
" -0.078204 | \n",
" -0.050956 | \n",
" ... | \n",
" -0.010363 | \n",
" 0.088272 | \n",
" -0.067078 | \n",
" -0.078614 | \n",
" 0.004449 | \n",
" -0.020617 | \n",
" -0.007253 | \n",
" 0.090385 | \n",
" 0.000987 | \n",
" 6 | \n",
"
\n",
" \n",
" 11605 | \n",
" -0.013787 | \n",
" 0.090064 | \n",
" -0.060155 | \n",
" 0.045836 | \n",
" -0.021725 | \n",
" -0.035984 | \n",
" 0.042096 | \n",
" 0.078376 | \n",
" -0.027304 | \n",
" -0.036993 | \n",
" ... | \n",
" 0.011080 | \n",
" 0.027116 | \n",
" -0.027053 | \n",
" -0.004418 | \n",
" 0.048515 | \n",
" 0.030234 | \n",
" -0.105104 | \n",
" 0.006796 | \n",
" 0.001058 | \n",
" 1 | \n",
"
\n",
" \n",
" 1451 | \n",
" -0.017672 | \n",
" 0.009427 | \n",
" -0.010428 | \n",
" -0.034253 | \n",
" 0.012339 | \n",
" 0.030820 | \n",
" -0.008325 | \n",
" 0.042181 | \n",
" -0.021712 | \n",
" -0.017776 | \n",
" ... | \n",
" -0.044356 | \n",
" 0.066460 | \n",
" -0.077470 | \n",
" -0.044359 | \n",
" 0.021946 | \n",
" 0.009875 | \n",
" -0.039396 | \n",
" 0.026865 | \n",
" 0.000720 | \n",
" 0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 9079 | \n",
" -0.006589 | \n",
" 0.065311 | \n",
" -0.084001 | \n",
" 0.045546 | \n",
" -0.001115 | \n",
" -0.023570 | \n",
" -0.004520 | \n",
" 0.047788 | \n",
" -0.083888 | \n",
" -0.026300 | \n",
" ... | \n",
" -0.004477 | \n",
" -0.015251 | \n",
" -0.071699 | \n",
" -0.046150 | \n",
" -0.010536 | \n",
" 0.025932 | \n",
" -0.077295 | \n",
" 0.021511 | \n",
" 0.003156 | \n",
" 1 | \n",
"
\n",
" \n",
" 8966 | \n",
" 0.000738 | \n",
" 0.005126 | \n",
" -0.024787 | \n",
" 0.088250 | \n",
" 0.054263 | \n",
" -0.008861 | \n",
" -0.047321 | \n",
" -0.011977 | \n",
" -0.055715 | \n",
" 0.041752 | \n",
" ... | \n",
" 0.007776 | \n",
" -0.033882 | \n",
" -0.043081 | \n",
" -0.022249 | \n",
" -0.047681 | \n",
" -0.022898 | \n",
" -0.035075 | \n",
" 0.022517 | \n",
" 0.001959 | \n",
" 1 | \n",
"
\n",
" \n",
" 1818 | \n",
" 0.002087 | \n",
" -0.030689 | \n",
" -0.024057 | \n",
" -0.034905 | \n",
" 0.054794 | \n",
" 0.021325 | \n",
" -0.003245 | \n",
" 0.047044 | \n",
" -0.026661 | \n",
" 0.024959 | \n",
" ... | \n",
" -0.052493 | \n",
" 0.039645 | \n",
" -0.044388 | \n",
" -0.023784 | \n",
" 0.004011 | \n",
" -0.025987 | \n",
" -0.015762 | \n",
" 0.003220 | \n",
" 0.003932 | \n",
" 8 | \n",
"
\n",
" \n",
" 1629 | \n",
" -0.028334 | \n",
" 0.006627 | \n",
" -0.034478 | \n",
" -0.008797 | \n",
" 0.041649 | \n",
" 0.038520 | \n",
" 0.030150 | \n",
" 0.124965 | \n",
" -0.036034 | \n",
" 0.007961 | \n",
" ... | \n",
" 0.033675 | \n",
" -0.004588 | \n",
" -0.044272 | \n",
" -0.052477 | \n",
" 0.076229 | \n",
" -0.010224 | \n",
" 0.011423 | \n",
" 0.048818 | \n",
" 0.000363 | \n",
" 2 | \n",
"
\n",
" \n",
" 10768 | \n",
" 0.020114 | \n",
" -0.015322 | \n",
" -0.012969 | \n",
" -0.066782 | \n",
" 0.063144 | \n",
" 0.054644 | \n",
" -0.021472 | \n",
" 0.017250 | \n",
" 0.015408 | \n",
" -0.004987 | \n",
" ... | \n",
" -0.048061 | \n",
" 0.102294 | \n",
" -0.041882 | \n",
" -0.041273 | \n",
" 0.020969 | \n",
" -0.015416 | \n",
" 0.016927 | \n",
" 0.026058 | \n",
" 0.001368 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
9460 rows × 386 columns
\n",
"
"
],
"text/plain": [
" bert_0 bert_1 bert_2 bert_3 bert_4 bert_5 bert_6 \\\n",
"11378 -0.029470 -0.013234 -0.041143 -0.077063 0.026463 0.027834 -0.050274 \n",
"10383 -0.114898 0.106321 -0.001228 0.049948 -0.084037 0.012905 -0.019098 \n",
"6106 -0.056078 -0.041918 -0.029557 -0.082310 0.018389 0.034702 -0.072229 \n",
"11605 -0.013787 0.090064 -0.060155 0.045836 -0.021725 -0.035984 0.042096 \n",
"1451 -0.017672 0.009427 -0.010428 -0.034253 0.012339 0.030820 -0.008325 \n",
"... ... ... ... ... ... ... ... \n",
"9079 -0.006589 0.065311 -0.084001 0.045546 -0.001115 -0.023570 -0.004520 \n",
"8966 0.000738 0.005126 -0.024787 0.088250 0.054263 -0.008861 -0.047321 \n",
"1818 0.002087 -0.030689 -0.024057 -0.034905 0.054794 0.021325 -0.003245 \n",
"1629 -0.028334 0.006627 -0.034478 -0.008797 0.041649 0.038520 0.030150 \n",
"10768 0.020114 -0.015322 -0.012969 -0.066782 0.063144 0.054644 -0.021472 \n",
"\n",
" bert_7 bert_8 bert_9 ... bert_376 bert_377 bert_378 \\\n",
"11378 0.031605 -0.003844 0.016589 ... -0.063193 0.065644 -0.057080 \n",
"10383 0.118853 -0.006946 -0.044849 ... -0.038572 0.093288 -0.036840 \n",
"6106 0.045174 -0.078204 -0.050956 ... -0.010363 0.088272 -0.067078 \n",
"11605 0.078376 -0.027304 -0.036993 ... 0.011080 0.027116 -0.027053 \n",
"1451 0.042181 -0.021712 -0.017776 ... -0.044356 0.066460 -0.077470 \n",
"... ... ... ... ... ... ... ... \n",
"9079 0.047788 -0.083888 -0.026300 ... -0.004477 -0.015251 -0.071699 \n",
"8966 -0.011977 -0.055715 0.041752 ... 0.007776 -0.033882 -0.043081 \n",
"1818 0.047044 -0.026661 0.024959 ... -0.052493 0.039645 -0.044388 \n",
"1629 0.124965 -0.036034 0.007961 ... 0.033675 -0.004588 -0.044272 \n",
"10768 0.017250 0.015408 -0.004987 ... -0.048061 0.102294 -0.041882 \n",
"\n",
" bert_379 bert_380 bert_381 bert_382 bert_383 eop_norm ages \n",
"11378 -0.018810 0.041155 0.026669 -0.023711 0.013544 0.001236 4 \n",
"10383 -0.013068 0.022624 0.001857 -0.011609 -0.008182 0.002801 2 \n",
"6106 -0.078614 0.004449 -0.020617 -0.007253 0.090385 0.000987 6 \n",
"11605 -0.004418 0.048515 0.030234 -0.105104 0.006796 0.001058 1 \n",
"1451 -0.044359 0.021946 0.009875 -0.039396 0.026865 0.000720 0 \n",
"... ... ... ... ... ... ... ... \n",
"9079 -0.046150 -0.010536 0.025932 -0.077295 0.021511 0.003156 1 \n",
"8966 -0.022249 -0.047681 -0.022898 -0.035075 0.022517 0.001959 1 \n",
"1818 -0.023784 0.004011 -0.025987 -0.015762 0.003220 0.003932 8 \n",
"1629 -0.052477 0.076229 -0.010224 0.011423 0.048818 0.000363 2 \n",
"10768 -0.041273 0.020969 -0.015416 0.016927 0.026058 0.001368 0 \n",
"\n",
"[9460 rows x 386 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:51:52.214334Z",
"iopub.status.busy": "2025-05-07T19:51:52.213827Z",
"iopub.status.idle": "2025-05-07T19:54:15.197146Z",
"shell.execute_reply": "2025-05-07T19:54:15.196397Z",
"shell.execute_reply.started": "2025-05-07T19:51:52.214306Z"
},
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MAE: 0.0001\n",
"RMSE: 0.0006\n",
"R²: 0.9754\n"
]
}
],
"source": [
"model = RandomForestRegressor(random_state=42)\n",
"model.fit(X_train, y_train)\n",
"y_pred = model.predict(X_test)\n",
"\n",
"mae = mean_absolute_error(y_test, y_pred)\n",
"rmse = np.sqrt(mean_squared_error(y_test, y_pred))\n",
"r2 = r2_score(y_test, y_pred)\n",
"\n",
"print(f\"MAE: {mae:.4f}\")\n",
"print(f\"RMSE: {rmse:.4f}\")\n",
"print(f\"R²: {r2:.4f}\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:20.181580Z",
"iopub.status.busy": "2025-05-07T19:54:20.180891Z",
"iopub.status.idle": "2025-05-07T19:54:20.191401Z",
"shell.execute_reply": "2025-05-07T19:54:20.190419Z",
"shell.execute_reply.started": "2025-05-07T19:54:20.181557Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" pred | \n",
" label | \n",
"
\n",
" \n",
" \n",
" \n",
" 2987 | \n",
" 0.000661 | \n",
" 0.000661 | \n",
"
\n",
" \n",
" 6075 | \n",
" 0.002270 | \n",
" 0.002270 | \n",
"
\n",
" \n",
" 4156 | \n",
" 0.001119 | \n",
" 0.001119 | \n",
"
\n",
" \n",
" 8111 | \n",
" 0.001394 | \n",
" 0.001394 | \n",
"
\n",
" \n",
" 8080 | \n",
" 0.001113 | \n",
" 0.001115 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 1704 | \n",
" 0.001199 | \n",
" 0.001194 | \n",
"
\n",
" \n",
" 5150 | \n",
" 0.001416 | \n",
" 0.001425 | \n",
"
\n",
" \n",
" 11731 | \n",
" 0.001097 | \n",
" 0.001095 | \n",
"
\n",
" \n",
" 11002 | \n",
" 0.000549 | \n",
" 0.000549 | \n",
"
\n",
" \n",
" 10663 | \n",
" 0.002886 | \n",
" 0.002887 | \n",
"
\n",
" \n",
"
\n",
"
2365 rows × 2 columns
\n",
"
"
],
"text/plain": [
" pred label\n",
"2987 0.000661 0.000661\n",
"6075 0.002270 0.002270\n",
"4156 0.001119 0.001119\n",
"8111 0.001394 0.001394\n",
"8080 0.001113 0.001115\n",
"... ... ...\n",
"1704 0.001199 0.001194\n",
"5150 0.001416 0.001425\n",
"11731 0.001097 0.001095\n",
"11002 0.000549 0.000549\n",
"10663 0.002886 0.002887\n",
"\n",
"[2365 rows x 2 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"check_df = pd.DataFrame({'pred': y_pred, 'label': y_test})\n",
"check_df"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:23.741639Z",
"iopub.status.busy": "2025-05-07T19:54:23.741083Z",
"iopub.status.idle": "2025-05-07T19:54:23.846173Z",
"shell.execute_reply": "2025-05-07T19:54:23.845423Z",
"shell.execute_reply.started": "2025-05-07T19:54:23.741616Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/plain": [
"['model.pkl']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"joblib.dump(model, 'model.pkl')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:27.229964Z",
"iopub.status.busy": "2025-05-07T19:54:27.229464Z",
"iopub.status.idle": "2025-05-07T19:54:27.237833Z",
"shell.execute_reply": "2025-05-07T19:54:27.237002Z",
"shell.execute_reply.started": "2025-05-07T19:54:27.229942Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" car_names | \n",
" car_prices | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... | \n",
" Rp 764.200.000 | \n",
"
\n",
" \n",
" 1 | \n",
" 2022 Mitsubishi Expander Ultimate CVT | \n",
" Rp331.950.000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" car_names car_prices\n",
"0 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... Rp 764.200.000\n",
"1 2022 Mitsubishi Expander Ultimate CVT Rp331.950.000"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# contoh testing\n",
"test = {\n",
" 'car_names': ['2025 Mitsubishi Pajero Sport Dakar Ultimate (4X4) AT', '2022 Mitsubishi Expander Ultimate CVT'],\n",
" 'car_prices': ['Rp 764.200.000', 'Rp331.950.000']\n",
"}\n",
"test_df = pd.DataFrame(test)\n",
"test_df"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:32.122104Z",
"iopub.status.busy": "2025-05-07T19:54:32.121342Z",
"iopub.status.idle": "2025-05-07T19:54:32.148102Z",
"shell.execute_reply": "2025-05-07T19:54:32.147175Z",
"shell.execute_reply.started": "2025-05-07T19:54:32.122068Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" car_names | \n",
" car_prices | \n",
" year | \n",
" car_names_clean | \n",
" prices | \n",
" ages | \n",
" estimated_original_price | \n",
" deprecate_percentage | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... | \n",
" Rp 764.200.000 | \n",
" 2025 | \n",
" Mitsubishi Pajero Sport Dakar Ultimate (4X4) AT | \n",
" 764200000 | \n",
" 0 | \n",
" 764200000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" 1 | \n",
" 2022 Mitsubishi Expander Ultimate CVT | \n",
" Rp331.950.000 | \n",
" 2022 | \n",
" Mitsubishi Expander Ultimate CVT | \n",
" 331950000 | \n",
" 3 | \n",
" 455349794 | \n",
" 0.271 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" car_names car_prices year \\\n",
"0 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... Rp 764.200.000 2025 \n",
"1 2022 Mitsubishi Expander Ultimate CVT Rp331.950.000 2022 \n",
"\n",
" car_names_clean prices ages \\\n",
"0 Mitsubishi Pajero Sport Dakar Ultimate (4X4) AT 764200000 0 \n",
"1 Mitsubishi Expander Ultimate CVT 331950000 3 \n",
"\n",
" estimated_original_price deprecate_percentage \n",
"0 764200000 0.000 \n",
"1 455349794 0.271 "
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# current year datetime dynamic\n",
"curent_year = datetime.now().year\n",
"\n",
"# feature engineering\n",
"test_df['year'] = test_df['car_names'].str.extract(r'(\\b\\d{4}\\b)')\n",
"test_df['car_names_clean'] = test_df['car_names'].str.replace(r'^\\d{4}\\s+', '', regex=True).str.split(r' - ').str[0].str.strip()\n",
"test_df['prices'] = test_df['car_prices'].str.replace(r'\\D', '', regex=True).apply(lambda x: int(x) if x else None)\n",
"test_df['ages'] = test_df['year'].apply(lambda x: curent_year - int(x))\n",
"test_df['estimated_original_price'] = test_df.apply(\n",
" lambda row: row['prices'] if row['ages'] == 0 else int(row['prices'] / (0.9 ** row['ages'])),\n",
" axis=1\n",
")\n",
"test_df['deprecate_percentage'] = ((test_df['estimated_original_price'] - test_df['prices']) / test_df['estimated_original_price'])\n",
"test_df"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:37.131755Z",
"iopub.status.busy": "2025-05-07T19:54:37.130977Z",
"iopub.status.idle": "2025-05-07T19:54:37.148763Z",
"shell.execute_reply": "2025-05-07T19:54:37.148110Z",
"shell.execute_reply.started": "2025-05-07T19:54:37.131732Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" car_names | \n",
" car_prices | \n",
" year | \n",
" car_names_clean | \n",
" prices | \n",
" ages | \n",
" estimated_original_price | \n",
" deprecate_percentage | \n",
" p_norm | \n",
" eop_norm | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... | \n",
" Rp 764.200.000 | \n",
" 2025 | \n",
" Mitsubishi Pajero Sport Dakar Ultimate (4X4) AT | \n",
" 764200000 | \n",
" 0 | \n",
" 764200000 | \n",
" 0.000 | \n",
" 0.003043 | \n",
" 0.001797 | \n",
"
\n",
" \n",
" 1 | \n",
" 2022 Mitsubishi Expander Ultimate CVT | \n",
" Rp331.950.000 | \n",
" 2022 | \n",
" Mitsubishi Expander Ultimate CVT | \n",
" 331950000 | \n",
" 3 | \n",
" 455349794 | \n",
" 0.271 | \n",
" 0.001322 | \n",
" 0.001071 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" car_names car_prices year \\\n",
"0 2025 Mitsubishi Pajero Sport Dakar Ultimate (4... Rp 764.200.000 2025 \n",
"1 2022 Mitsubishi Expander Ultimate CVT Rp331.950.000 2022 \n",
"\n",
" car_names_clean prices ages \\\n",
"0 Mitsubishi Pajero Sport Dakar Ultimate (4X4) AT 764200000 0 \n",
"1 Mitsubishi Expander Ultimate CVT 331950000 3 \n",
"\n",
" estimated_original_price deprecate_percentage p_norm eop_norm \n",
"0 764200000 0.000 0.003043 0.001797 \n",
"1 455349794 0.271 0.001322 0.001071 "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p_scaler = joblib.load('price_norm.pkl')\n",
"eop_scaler = joblib.load('eop_norm.pkl')\n",
"\n",
"test_df['p_norm'] = p_scaler.transform(test_df[['prices']])\n",
"test_df['eop_norm'] = eop_scaler.transform(test_df[['estimated_original_price']])\n",
"test_df"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:40.021134Z",
"iopub.status.busy": "2025-05-07T19:54:40.020566Z",
"iopub.status.idle": "2025-05-07T19:54:40.598197Z",
"shell.execute_reply": "2025-05-07T19:54:40.597443Z",
"shell.execute_reply.started": "2025-05-07T19:54:40.021108Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b3c7fbcafddf4971ad925b043f669452",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Batches: 0%| | 0/1 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"bert_model = SentenceTransformer('all-MiniLM-L6-v2')\n",
"car_names_embeddings = bert_model.encode(test_df['car_names_clean'].tolist(), show_progress_bar=True)\n",
"car_names_df = pd.DataFrame(car_names_embeddings, columns=[f'bert_{i}' for i in range(car_names_embeddings.shape[1])])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:48.244155Z",
"iopub.status.busy": "2025-05-07T19:54:48.243854Z",
"iopub.status.idle": "2025-05-07T19:54:48.264609Z",
"shell.execute_reply": "2025-05-07T19:54:48.263524Z",
"shell.execute_reply.started": "2025-05-07T19:54:48.244135Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" bert_0 | \n",
" bert_1 | \n",
" bert_2 | \n",
" bert_3 | \n",
" bert_4 | \n",
" bert_5 | \n",
" bert_6 | \n",
" bert_7 | \n",
" bert_8 | \n",
" bert_9 | \n",
" ... | \n",
" bert_376 | \n",
" bert_377 | \n",
" bert_378 | \n",
" bert_379 | \n",
" bert_380 | \n",
" bert_381 | \n",
" bert_382 | \n",
" bert_383 | \n",
" eop_norm | \n",
" ages | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.014066 | \n",
" 0.086013 | \n",
" -0.082927 | \n",
" -0.061399 | \n",
" -0.053758 | \n",
" 0.035179 | \n",
" -0.010706 | \n",
" 0.091782 | \n",
" -0.015837 | \n",
" 0.025600 | \n",
" ... | \n",
" -0.013559 | \n",
" 0.080615 | \n",
" -0.132412 | \n",
" -0.047983 | \n",
" 0.037217 | \n",
" -0.044200 | \n",
" -0.040456 | \n",
" 0.087468 | \n",
" 0.001797 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" -0.099028 | \n",
" -0.024163 | \n",
" -0.014358 | \n",
" -0.033732 | \n",
" 0.055197 | \n",
" -0.001037 | \n",
" -0.047434 | \n",
" 0.204618 | \n",
" -0.023997 | \n",
" -0.052195 | \n",
" ... | \n",
" 0.008176 | \n",
" 0.049285 | \n",
" -0.047141 | \n",
" 0.001278 | \n",
" -0.053189 | \n",
" -0.036602 | \n",
" -0.017618 | \n",
" 0.066720 | \n",
" 0.001071 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
2 rows × 386 columns
\n",
"
"
],
"text/plain": [
" bert_0 bert_1 bert_2 bert_3 bert_4 bert_5 bert_6 \\\n",
"0 0.014066 0.086013 -0.082927 -0.061399 -0.053758 0.035179 -0.010706 \n",
"1 -0.099028 -0.024163 -0.014358 -0.033732 0.055197 -0.001037 -0.047434 \n",
"\n",
" bert_7 bert_8 bert_9 ... bert_376 bert_377 bert_378 bert_379 \\\n",
"0 0.091782 -0.015837 0.025600 ... -0.013559 0.080615 -0.132412 -0.047983 \n",
"1 0.204618 -0.023997 -0.052195 ... 0.008176 0.049285 -0.047141 0.001278 \n",
"\n",
" bert_380 bert_381 bert_382 bert_383 eop_norm ages \n",
"0 0.037217 -0.044200 -0.040456 0.087468 0.001797 0 \n",
"1 -0.053189 -0.036602 -0.017618 0.066720 0.001071 3 \n",
"\n",
"[2 rows x 386 columns]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_input = pd.concat([car_names_df, test_df[['eop_norm', 'ages']].reset_index(drop=True)], axis=1)\n",
"test_input"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:50.894730Z",
"iopub.status.busy": "2025-05-07T19:54:50.894336Z",
"iopub.status.idle": "2025-05-07T19:54:51.015278Z",
"shell.execute_reply": "2025-05-07T19:54:51.014547Z",
"shell.execute_reply.started": "2025-05-07T19:54:50.894700Z"
},
"trusted": true
},
"outputs": [],
"source": [
"model = joblib.load('model.pkl')\n",
"test_result = model.predict(test_input)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"execution": {
"iopub.execute_input": "2025-05-07T19:54:53.094448Z",
"iopub.status.busy": "2025-05-07T19:54:53.093810Z",
"iopub.status.idle": "2025-05-07T19:54:53.102418Z",
"shell.execute_reply": "2025-05-07T19:54:53.101518Z",
"shell.execute_reply.started": "2025-05-07T19:54:53.094425Z"
},
"trusted": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" pred | \n",
" label | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.003007 | \n",
" 0.003043 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.001382 | \n",
" 0.001322 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" pred label\n",
"0 0.003007 0.003043\n",
"1 0.001382 0.001322"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# hasil prediksi\n",
"check_df_1 = pd.DataFrame({'pred': test_result, 'label': test_df['p_norm']})\n",
"check_df_1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. feature -> estimate origin price, age and car names\n",
"2. result -> MAE: 0.0001, RMSE: 0.0006, R²: 0.9754"
]
}
],
"metadata": {
"kaggle": {
"accelerator": "nvidiaTeslaT4",
"dataSources": [
{
"datasetId": 7345863,
"sourceId": 11703231,
"sourceType": "datasetVersion"
}
],
"dockerImageVersionId": 31011,
"isGpuEnabled": true,
"isInternetEnabled": true,
"language": "python",
"sourceType": "notebook"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 4
}