{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import seaborn as sns\n", "# \n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.preprocessing import OrdinalEncoder\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.preprocessing import QuantileTransformer" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "url='https://raw.githubusercontent.com/digipodium/Datasets/main/regression/diamonds.csv'" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \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", " \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", " \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", " \n", "
caratcutcolorclaritydepthtablepricexyz
10.23IdealESI261.555.03263.953.982.43
20.21PremiumESI159.861.03263.893.842.31
30.23GoodEVS156.965.03274.054.072.31
40.29PremiumIVS262.458.03344.204.232.63
50.31GoodJSI263.358.03354.344.352.75
.................................
539360.72IdealDSI160.857.027575.755.763.50
539370.72GoodDSI163.155.027575.695.753.61
539380.70Very GoodDSI162.860.027575.665.683.56
539390.86PremiumHSI261.058.027576.156.123.74
539400.75IdealDSI262.255.027575.835.873.64
\n", "

53940 rows × 10 columns

\n", "
" ], "text/plain": [ " carat cut color clarity depth table price x y z\n", "1 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43\n", "2 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31\n", "3 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31\n", "4 0.29 Premium I VS2 62.4 58.0 334 4.20 4.23 2.63\n", "5 0.31 Good J SI2 63.3 58.0 335 4.34 4.35 2.75\n", "... ... ... ... ... ... ... ... ... ... ...\n", "53936 0.72 Ideal D SI1 60.8 57.0 2757 5.75 5.76 3.50\n", "53937 0.72 Good D SI1 63.1 55.0 2757 5.69 5.75 3.61\n", "53938 0.70 Very Good D SI1 62.8 60.0 2757 5.66 5.68 3.56\n", "53939 0.86 Premium H SI2 61.0 58.0 2757 6.15 6.12 3.74\n", "53940 0.75 Ideal D SI2 62.2 55.0 2757 5.83 5.87 3.64\n", "\n", "[53940 rows x 10 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(url, index_col=0)\n", "df" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
caratdepthtablepricexyz
count53940.00000053940.00000053940.00000053940.00000053940.00000053940.00000053940.000000
mean0.79794061.74940557.4571843932.7997225.7311575.7345263.538734
std0.4740111.4326212.2344913989.4397381.1217611.1421350.705699
min0.20000043.00000043.000000326.0000000.0000000.0000000.000000
25%0.40000061.00000056.000000950.0000004.7100004.7200002.910000
50%0.70000061.80000057.0000002401.0000005.7000005.7100003.530000
75%1.04000062.50000059.0000005324.2500006.5400006.5400004.040000
max5.01000079.00000095.00000018823.00000010.74000058.90000031.800000
\n", "
" ], "text/plain": [ " carat depth table price x \\\n", "count 53940.000000 53940.000000 53940.000000 53940.000000 53940.000000 \n", "mean 0.797940 61.749405 57.457184 3932.799722 5.731157 \n", "std 0.474011 1.432621 2.234491 3989.439738 1.121761 \n", "min 0.200000 43.000000 43.000000 326.000000 0.000000 \n", "25% 0.400000 61.000000 56.000000 950.000000 4.710000 \n", "50% 0.700000 61.800000 57.000000 2401.000000 5.700000 \n", "75% 1.040000 62.500000 59.000000 5324.250000 6.540000 \n", "max 5.010000 79.000000 95.000000 18823.000000 10.740000 \n", "\n", " y z \n", "count 53940.000000 53940.000000 \n", "mean 5.734526 3.538734 \n", "std 1.142135 0.705699 \n", "min 0.000000 0.000000 \n", "25% 4.720000 2.910000 \n", "50% 5.710000 3.530000 \n", "75% 6.540000 4.040000 \n", "max 58.900000 31.800000 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# handling skewness" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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P0mSzWbTkCFDnObq1q2r5s2ba9asWZXWHAAAAAAAAFBdVSh4KykpkSSFhYXpiy++kJ+fnyVNAQAAAAAAANXdNV3jLSsri9ANAACgmvr73/+uO++8U8HBwfrmm28kSXPnztWHH37o4s4AAABqlmsK3iQpJSVFL7zwgoYOHaqnn37a6QEAAICqaeHChUpISNB9992nvLw884ZZvr6+mjt37lVtY+fOnbr//vsVHBwsm82mNWvWOM0bhqGJEycqKChI9erVU2RkpI4cOeJUc/r0aQ0aNEje3t7y9fVVbGyszp4961Szf/9+9ejRQ15eXgoJCdGMGTPK9LJ69Wq1bt1aXl5e6tChg9avX3/1OwMAAMBi1xS8TZ48WX369FFKSoq+++47/fDDD04PAAAAVE3z58/X66+/rj/96U9yd3c3x7t166YDBw5c1TbOnTunjh07Kikpqdz5GTNm6NVXX9WiRYu0Z88eNWjQQFFRUbpw4YJZM2jQIGVkZCg5OVlr167Vzp07NXz4cHPe4XCoT58+Cg0NVVpammbOnKlJkyZp8eLFZs2uXbs0cOBAxcbGat++ferXr5/69eungwcPVnS3AAAAWKJC13grtWjRIi1fvlxPPPFEZfcDAAAAC2VlZalz585lxj09PXXu3Lmr2kZ0dLSio6PLnTMMQ3PnztWECRP04IMPSpLeeustBQQEaM2aNRowYIC++uorbdy4UV988YW6desm6edA8L777tMrr7yi4OBgrVixQgUFBVq6dKk8PDzUrl07paena/bs2WZAN2/ePPXt21djx46VJE2dOlXJycl67bXXtGjRogrvGwAAgMp2TUe8FRQU6I477qjsXgAAAGCxsLAwpaenlxnfuHGj2rRpc93bz8rKUk5OjiIjI80xHx8fRUREKDU1VZKUmpoqX19fM3STpMjISLm5uWnPnj1mTc+ePeXh4WHWREVFKTMz0zzDIjU11el9SmtK36c8+fn5cjgcTg8AAACrXFPwNnToUK1cubKyewEAAIDFEhISFBcXp3fffVeGYejzzz/XX/7yFyUmJmrcuHHXvf2cnBxJUkBAgNN4QECAOZeTkyN/f3+n+Tp16qhx48ZONeVt4+L3uFRN6Xx5pk2bJh8fH/MREhJS0SUCAABctWs61fTChQtavHixtmzZovDwcNWtW9dpfvbs2ZXSHAAAACrX0KFD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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(ncols=2, figsize=(15,5))\n", "sns.histplot(data=df, x = 'price', ax=ax[0])\n", "sns.boxplot(data=df, y = 'price', ax=ax[1])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "X = df.drop('price', axis=1)\n", "y = df['price']\n", "\n", "# transform the y to log scale\n", "y = np.log1p(y) # this log1p will remove the skewness of the data and make it more normal distribution for better prediction" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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gjcAAAD4hF27dmnw4MEaNGiQJKlZs2Z67bXXtGfPnjL7RkREqGHDhmW2y8/PV35+vmvfZrNVul4AAICy+Hm7AAAAAECSevbsqbS0NH311VeSpM8//1yffPKJBg4cWGbfjh07KioqSrfddps+/fTTEtulpKQoLCzMtcXExFRZ/QAAAL/EHW8AAADwCdOmTZPNZlOrVq3k7+8vp9Opp59+WiNGjCixT1RUlJYtW6auXbsqPz9fK1asUO/evbV792517ty5SPvk5GQlJSW59m02G+EbAADwGII3AAAA+IQ333xT69at0/r169W2bVtlZGRo4sSJio6O1qhRo4rt07JlS7Vs2dK137NnT504cUILFy7UmjVrirQ3m80ym3n2JgAAqB4EbwAAAPAJkydP1rRp0zRs2DBJUrt27XT69GmlpKSUGLwVp3v37vrkk088VSYAAEC58Yw3AAAA+IQff/xRfn7uX0/9/f1VWFhYoetkZGQoKiqqKksDAACoFO54AwAAgE+488479fTTT6tp06Zq27atDh48qAULFmj06NGuNsnJyTp79qz+8Y9/SJIWLVqkuLg4tW3bVleuXNGKFSu0Y8cObdu2zVvDAAAAcCF4AwAAgE9YvHixpk+frv/+7//WuXPnFB0drYcfflgzZsxwtcnOzlZWVpZrv6CgQE888YTOnj2revXqqX379tq+fbv69OnjjSEAAAC4IXgDAB+Rl5dXZpuAgAAFBgZWQzUAUP0aNGigRYsWadGiRSW2WbVqldv+lClTNGXKFM8WBgAAUEkEbwDgZYVOh+Tnr/Dw8DLbRlii9G3WacI3AAAAAKgBCN4AwMsMp1MqdGrw/M0KMIeU2M5pz9fGpAFyOBwEbx7AHYcAAAAAqhrBGwD4CP9AswKCzN4uo87hjkMAAAAAnkLwBgCo07jjEAAAAICnELwBQA1TnimREtMiK4o7DgEAAABUNYI3AKghKjIlUpKujbTo+FeZZYZv5Q3yAAAAAAAVQ/AGADVEeadESpL9ymW9M3WwwsLCyn99w/i1JQIAAAAAfsarwdtHH32k5557Tvv371d2drY2bNigIUOGSJLsdruefPJJbd68WSdPnlRYWJj69eunZ555RtHR0a5rNGvWTKdPn3a7bkpKiqZNm+baP3TokBITE7V3715de+21mjBhgqZMmVItYwSAqlaeKZHOgvxy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9r5KUlxcnCwWi9v7ZrPZtHv37hLft6CgIHXp0sWtT2FhodLS0mrUew0AAIAK8vbqDvj19uzZYwQEBBhPP/208fXXXxvr1q0z6tWrZ6xdu9bVZtq0acb999/v2j958qRRr149Y/LkycYXX3xhLFmyxPD39ze2bNnijSFUSGXGu3DhQmPjxo3G119/bRw+fNh4/PHHDT8/P2P79u3eGEKFOJ1Oo2nTpsbUqVOLnLv//vuNadOmufY//fRTIyAgwJg/f77xxRdfGE899ZQRGBhoHD58uDpLrrSKjHXWrFnG1q1bjRMnThj79+83hg0bZgQHBxtHjx6tzpIrZdSoUcZ1111nvPfee8apU6eMt99+22jcuLExZcoUV5va9JmtzHhr8md2y5Ytxvvvv2+cPHnS2LZtm9GhQwejR48eRkFBgWEYteu9rehYa9L7evHiRePgwYPGwYMHDUnGggULjIMHDxqnT582DMMwnnnmGaNhw4bGv/71L+PQoUPG4MGDjbi4OCMvL891jd///vfG4sWLXfuvv/66YTabjVWrVhnHjh0zxo0bZzRs2NCwWq3VPj4AAABUD4K3WuLdd981brzxRsNsNhutWrUyli9f7nZ+1KhRxq233up27IMPPjA6duxoBAUFGddff72xcuXK6iv4V6roeJ999lmjefPmRnBwsNGoUSOjd+/exo4dO6q56srZunWrIcnIzMwscu7WW281Ro0a5XbszTffNH77298aQUFBRtu2bY1NmzZVU6W/XkXGOnHiRKNp06ZGUFCQERkZadx+++3GgQMHqrHayrPZbMbjjz9uNG3a1AgODjauv/56469//auRn5/valObPrOVGW9N/sy+8cYbxvXXX28EBQUZFovFSExMNC5cuOA6X5ve24qOtSa9rx988IEhqch29fdQYWGhMX36dCMyMtIwm81G3759i/zuio2NNZ566im3Y4sXL3b97urevbvx2WefVdOIAAAA4A0mwzAM791vBwAAAAAAANROPOMNAAAAAAAA8ACCNwAAAAAAAMADCN4AAAAAAAAADyB4AwAAAAAAADyA4A0AAAAAAADwAII3AAAAAAAAwAMI3gAAAAAAAAAPIHgDAAAAAAAAPIDgDQAq6ZtvvpHJZFJGRoa3SwEAAAAA+CCTYRiGt4sAgJrI6XTq+++/V+PGjRUQEODtcgAAAAAAPobgDQAqoaCgQEFBQd4uAwAAAADgw5hqCgCSevfurfHjx2v8+PEKCwtT48aNNX36dF39t4lmzZppzpw5GjlypEJDQzVu3Lhip5oePXpUd9xxh0JDQ9WgQQPdcsstOnHihOv8ihUr1Lp1awUHB6tVq1b6+9//Xt1DBQAAAABUE+ZGAcB/rF69WmPGjNGePXu0b98+jRs3Tk2bNtVDDz0kSZo/f75mzJihp556qtj+Z8+eVa9evdS7d2/t2LFDoaGh+vTTT+VwOCRJ69at04wZM/TSSy+pU6dOOnjwoB566CHVr19fo0aNqrZxAgAAAACqB1NNAUA/3fF27tw5HT16VCaTSZI0bdo0vfPOOzp27JiaNWumTp06acOGDa4+33zzjeLi4nTw4EF17NhRf/nLX/T6668rMzNTgYGBRV6jRYsWmjNnjoYPH+469re//U2bN2/Wrl27PD9IAAAAAEC1YqopAPzHTTfd5ArdJCk+Pl5ff/21nE6nJKlr166l9s/IyNAtt9xSbOh2+fJlnThxQmPGjNFvfvMb1/a3v/3NbSoqAAAAAKD2YKopAJRT/fr1Sz0fEhJS4rlLly5Jkl5++WX16NHD7Zy/v/+vLw4AAAAA4HMI3gDgP3bv3u22/9lnn+mGG24odzDWvn17rV69Wna7vchdb5GRkYqOjtbJkyc1YsSIKqsZAAAAAOC7mGoKAP+RlZWlpKQkZWZm6rXXXtPixYv1+OOPl7v/+PHjZbPZNGzYMO3bt09ff/211qxZo8zMTEnSrFmzlJKSohdffFFfffWVDh8+rJUrV2rBggWeGhIAAAAAwIu44w0A/mPkyJHKy8tT9+7d5e/vr8cff1zjxo0rd//w8HDt2LFDkydP1q233ip/f3917NhRN998syRp7Nixqlevnp577jlNnjxZ9evXV7t27TRx4kQPjQgAAAAA4E2sagoA+mlV044dO2rRokXeLgUAAAAAUEsw1RQAAAAAAADwAII3AAAAAAAAwAOYagoAAAAAAAB4AHe8AQAAAAAAAB5A8AYAAAAAAAB4AMEbAAAAAAAA4AEEbwAAAAAAAIAHELwBAAAAAAAAHkDwBgAAAAAAAHgAwRsAAAAAAADgAQRvAAAAAAAAgAf8f9d1lRzfTWQWAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(ncols=2, figsize=(15,5))\n", "sns.histplot(x = y, ax=ax[0])\n", "sns.boxplot(y = y, ax=ax[1])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "y = df['price']\n", "qt = QuantileTransformer()\n", "y_trans = qt.fit_transform(y.values.reshape(-1,1)).flatten()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABN8AAAGsCAYAAADt4QF1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABJEklEQVR4nO3de1yUdd7/8fcMp9EUkIxBjNJty1MeWiwis82NJDPLsl0tV1012VroIHuXUipqB8qMyKK4czPtXlnd+qVbaRRhZq2kibGZmW2pi7c5EEswinGe3x89mHsnQRnkmhmG1/PxmIfOdX2vuT7XxWl48z2YHA6HQwAAAAAAAAA6nNnbBQAAAAAAAAD+ivANAAAAAAAAMAjhGwAAAAAAAGAQwjcAAAAAAADAIIRvAAAAAAAAgEEI3wAAAAAAAACDEL4BAAAAAAAABgn0dgGdRVNTk7799lv17NlTJpPJ2+UAAIBOwOFw6NixY4qOjpbZzN88fRXv8wAAgLvceZ9H+NZG3377rWJiYrxdBgAA6IQOHz6sc88919tloBW8zwMAAO3Vlvd5hG9t1LNnT0k/3tTQ0FAvVwMAADoDu92umJgY5/sI+Cbe5wEAAHe58z6P8K2NmocghIaG8qYMAAC4haGMvo33eQAAoL3a8j6PyUcAAAAAAAAAgxC+AQAAAAAAAAYhfAMAAAAAAAAMQvgGAAAAAAAAGITwDQAAAAAAADAI4RsAAAAAAABgEMI3AAAAAAAAwCCEbwAAAAAAAIBBCN8AAAAAAAAAg3g1fNu2bZsmTJig6OhomUwmbdy48aQ2+/bt04033qiwsDCdddZZuvTSS1VSUuLcX1NTo+TkZJ199tnq0aOHJk2apNLSUpfXKCkp0fjx49W9e3dFRkbq/vvvV0NDg9GXBwAAAAAAgC7Oq+FbdXW1hg8fruzs7Bb3f/PNN7ryyis1cOBAbd26VZ999pkWLlwoi8XibDN37ly9+eabevXVV/XBBx/o22+/1S233OLc39jYqPHjx6uurk7bt2/XmjVrtHr1ai1atMjw6wMAAAAAAEDXZnI4HA5vFyFJJpNJGzZs0MSJE53bpkyZoqCgIP3P//xPi8dUVVXpnHPOUW5urm699VZJ0pdffqlBgwapsLBQl19+ud5++23dcMMN+vbbb2W1WiVJOTk5mjdvnr777jsFBwe3qT673a6wsDBVVVUpNDT0zC4WAAB0Cbx/cM+2bdv05JNPqqioSEePHj3pvWFLtm7dqtTUVO3du1cxMTFasGCBfve737l1Xj5OAADAXe68f/DZOd+ampq0adMmXXTRRUpMTFRkZKTi4uJchqYWFRWpvr5eCQkJzm0DBw7Ueeedp8LCQklSYWGhhg4d6gzeJCkxMVF2u1179+5t9fy1tbWy2+0uDwAAABjndKMifurgwYMaP368xowZo+LiYt13332644479M477xhcKQAAQNsFeruA1pSVlen48eN6/PHH9cgjj+iJJ55QXl6ebrnlFr3//vv65S9/KZvNpuDgYIWHh7sca7VaZbPZJEk2m80leGve37yvNRkZGVqyZEnHXhQAAABaNW7cOI0bN67N7XNyctS/f3899dRTkqRBgwbpo48+0tNPP63ExESjygTOmMPhUE1NjbfLwGk4HA7V1tZKkkJCQmQymbxcEU7HYrHwcYJP8tnwrampSZJ00003ae7cuZKkESNGaPv27crJydEvf/lLQ8+flpam1NRU53O73a6YmBhDzwkAAIC2KywsdBkBIf04wuG+++475XG1tbXOX6glMcIBHldTU+NW0Aygbd5++21169bN22UAJ/HZ8K13794KDAzU4MGDXbY3/0VTkqKiolRXV6fKykqX3m+lpaWKiopyttm5c6fLazSvhtrcpiUhISEKCQnpiEsxTHl5udtvFkNDQ9W7d2+DKgIAAPCc1kY42O12/fDDD63+AsYIBwAA4Ek+G74FBwfr0ksv1f79+122f/XVVzr//PMlSbGxsQoKClJBQYEmTZokSdq/f79KSkoUHx8vSYqPj9ejjz6qsrIyRUZGSpLy8/MVGhp6UrDXmZSXl+uCn/9c9qoqt44LDQvTN19/TQAHAAC6LEY4wNssFovefvttb5eB06ipqdHNN98sSdqwYYMsFouXK8Lp8DGCr/Jq+Hb8+HF9/fXXzucHDx5UcXGxIiIidN555+n+++/X5MmTddVVV2nMmDHKy8vTm2++qa1bt0qSwsLCNHv2bKWmpioiIkKhoaG6++67FR8fr8svv1ySNHbsWA0ePFjTpk3TsmXLZLPZtGDBAiUnJ/t8z7ZTsdvtsldVaUzqc+oeYT39AZJOVJTq/cwU2e12wjcAANDpRUVFOUc0NCstLVVoaOgphx11hhEO8G8mk4mhcZ2M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0bhx47xdBuB3br75Zm+XAPiFt99+W926dfN2GR7n1WGn27Zt04QJExQdHS2TyaSNGzc699XX12vevHkaOnSozjrrLEVHR2v69On69ttvXV6joqJCU6dOVWhoqMLDwzV79mwdP37cpc1nn32m0aNHy2KxKCYmRsuWLfPE5QEAAAAAAKCL82rPt+rqag0fPlyzZs3SLbfc4rLvxIkT2r17txYuXKjhw4fr+++/17333qsbb7xRu3btcrabOnWqjh49qvz8fNXX12vmzJlKSkpSbm6uJMlut2vs2LFKSEhQTk6O9uzZo1mzZik8PFxJSUkevV4AAADAU46PuE0OMwNdgHZzOKSmhh//bw6UuuBQOaAjmJoa1KP4L94uw6u8+tN43LhxrXaLDwsLU35+vsu25557TpdddplKSkp03nnnad++fcrLy9Mnn3yikSNHSpKeffZZXX/99Vq+fLmio6O1du1a1dXVadWqVQoODtaQIUNUXFyszMxMwjcAAAD4LYc5UAoI8nYZQCcX7O0CgE7P4e0CfECnWu20qqpKJpNJ4eHhkqTCwkKFh4c7gzdJSkhIkNls1o4dO5xtrrrqKgUH/983zcTERO3fv1/ff/99q+eqra2V3W53eQAAAAAAAADu6DT90GtqajRv3jzddtttCg0NlSTZbDZFRka6tAsMDFRERIRsNpuzTf/+/V3aWK1W575evXq1eL6MjAwtWbKkoy8DaFFJSYkhbQEAAAAAgHd1ivCtvr5ev/nNb+RwOPTCCy945JxpaWlKTU11Prfb7YqJifHIudF11FXbJZNZY8aMcfvYhoYGAyoCAAAAAAAdyefDt+bg7V//+pe2bNni7PUmSVFRUSorK3Np39DQoIqKCkVFRTnblJaWurRpft7cpiUhISEKCQnpqMsAWtRQ+4PkaNKo5EyF92lbuPvvA3v18arFamxoNLg6AAAAAABwpnw6fGsO3v75z3/q/fff19lnn+2yPz4+XpWVlSoqKlJsbKwkacuWLWpqalJcXJyzzUMPPaT6+noFBf044Wx+fr4GDBjQ6pBTwNO69YpUj3P6tqntiYrS0zcCAAAAAAA+wasLLhw/flzFxcUqLi6WJB08eFDFxcUqKSlRfX29br31Vu3atUtr165VY2OjbDabbDab6urqJEmDBg3Sddddpzlz5mjnzp36+9//rpSUFE2ZMkXR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Y7B161bddtttev/991VYWKiYmBiNHTtWR44c8XDl/sHd+9/s0KFD+q//+i+NHj3aQ5X6J3fvf11dna699lodOnRIr732mvbv36+VK1eqb9++Hq7cP7h7/3NzczV//nylp6dr3759eumll7R+/Xo9+OCDHq6886uurtbw4cOVnZ3dpvYHDx7U+PHjNWbMGBUXF+u+++7THXfcoXfeecfgSgEAAODPTA6Hw+HtIvxdXFycLr30Uj333HOSpKamJsXExOjuu+/W/PnzT2o/efJkVVdX66233nJuu/zyyzVixAjl5OR4rG5/4u7H4KcaGxvVq1cvPffcc5o+fbrR5fqd9tz/xsZGXXXVVZo1a5Y+/PBDVVZWtqnXCk7m7v3PycnRk08+qS+//FJBQUGeLtfvuHv/U1JStG/fPhUUFDi3/fGPf9SOHTv00Ucfeaxuf2MymbRhw4ZT9qKdN2+eNm3a5PLHrilTpqiyslJ5eXkeqBIAAAD+iJ5vBqurq1NRUZESEhKc28xmsxISElRYWNjiMYWFhS7tJSkxMbHV9ji19nwMfurEiROqr69XRESEUWX6rfbe/6VLlyoyMlKzZ8/2RJl+qz33/4033lB8fLySk5NltVp18cUX67HHHlNjY6OnyvYb7bn/V1xxhYqKipxDUw8cOKDNmzfr+uuv90jNXRk/fwEAAGCEQG8X4O/Ky8vV2Ngoq9Xqst1qterLL79s8RibzdZie5vNZlid/qw9H4OfmjdvnqKjo0/6pQyn1577/9FHH+mll15ScXGxByr0b+25/wcOHNCWLVs0depUbd68WV9//bX+8Ic/qL6+Xunp6Z4o22+05/7ffvvtKi8v15VXXimHw6GGhgbdeeedDDv1gNZ+/trtdv3www/q1q2blyoDAABAZ0bPN+A0Hn/8ca1bt04bNmyQxWLxdjl+79ixY5o2bZpWrlyp3r17e7ucLqmpqUmRkZF68cUXFRsbq8mTJ+uhhx5i2LuHbN26VY899pief/557d69W6+//ro2bdqkhx9+2NulAQAAAGgHer4ZrHfv3goICFBpaanL9tLSUkVFRbV4TFRUlFvtcWrt+Rg0W758uR5//HG99957GjZsmJFl+i137/8333yjQ4cOacKECc5tTU1NkqTAwEDt379fF1xwgbFF+5H2fP736dNHQUFBCggIcG4bNGiQbDab6urqFBwcbGjN/qQ993/hwoWaNm2a7rjjDknS0KFDVV1draSkJD300EMym/m7mVFa+/kbGhpKrzcAAAC0G+/gDRYcHKzY2FiXibObmppUUFCg+Pj4Fo+Jj493aS9J+fn5rbbHqbXnYyBJy5Yt08MPP6y8vDyNHDnSE6X6JXfv/8CBA7Vnzx4VFxc7HzfeeKNz9cGYmBhPlt/ptefzf9SoUfr666+doackffXVV+rTpw/Bm5vac/9PnDhxUsDWHISyRpKx+PkLAAAAQzhguHXr1jlCQkIcq1evdnzxxReOpKQkR3h4uMNmszkcDodj2rRpjvnz5zvb//3vf3cEBgY6li9f7ti3b58jPT3dERQU5NizZ4+3LqHTc/dj8PjjjzuCg4Mdr732muPo0aPOx7Fjx7x1CZ2au/f/p2bMmOG46aabPFSt/3H3/peUlDh69uzpSElJcezfv9/x1ltvOSIjIx2PPPKIty6hU3P3/qenpzt69uzp+Mtf/uI4cOCA491333VccMEFjt/85jfeuoRO69ixY45PP/3U8emnnzokOTIzMx2ffvqp41//+pfD4XA45s+f75g2bZqz/YEDBxzdu3d33H///Y59+/Y5srOzHQEBAY68vDxvXQIAAAD8AMNOPWDy5Mn67rvvtGjRItlsNo0YMUJ5eXnOSZ1LSkpcejlcccUVys3N1YIFC/Tggw/qwgsv1MaNG3XxxRd76xI6PXc/Bi+88ILq6up06623urxOenq6Fi9e7MnS/YK79x8dy937HxMTo3feeUdz587VsGHD1LdvX917772aN2+ety6hU3P3/i9YsEAmk0kLFizQkSNHdM4552jChAl69NFHvXUJndauXbs0ZswY5/PU1FRJ0owZM7R69WodPXpUJSUlzv39+/fXpk2bNHfuXD3zzDM699xz9ac//UmJiYkerx0AAAD+w+RwMIYFAAAAAAAAMAJdTQAAAAAAAACDEL4BAAAAAAAABiF8AwAAAAAAAAxC+AYAAAAAAAAYhPANAAAAAAAAMAjhGwAAAAAAAGAQwjcAAAAAAADAIIRvAAAAAAAAgEEI3wAAAAAAAACDEL4BAAAAAAAABiF8AwAAAAAAAAzy/wGjtb+KUg+DxgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(ncols=2, figsize=(15,5))\n", "sns.histplot(x = y_trans, ax=ax[0])\n", "sns.boxplot(y = y_trans, ax=ax[1])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "back to model pipeline creation" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "X = df.drop('price', axis=1)\n", "y = df['price']" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['cut', 'color', 'clarity'], dtype='object')\n", "Index(['carat', 'depth', 'table', 'x', 'y', 'z'], dtype='object')\n" ] } ], "source": [ "cat_cols = df.select_dtypes(exclude='number').columns\n", "num_cols = df.select_dtypes('number').columns\n", "num_cols = num_cols.drop('price')\n", "print(cat_cols)\n", "print(num_cols)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ColumnTransformer(transformers=[('categorical',\n",
       "                                 Pipeline(steps=[('oe', OrdinalEncoder())]),\n",
       "                                 Index(['cut', 'color', 'clarity'], dtype='object')),\n",
       "                                ('numerical',\n",
       "                                 Pipeline(steps=[('sc', StandardScaler())]),\n",
       "                                 Index(['carat', 'depth', 'table', 'x', 'y', 'z'], dtype='object'))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "ColumnTransformer(transformers=[('categorical',\n", " Pipeline(steps=[('oe', OrdinalEncoder())]),\n", " Index(['cut', 'color', 'clarity'], dtype='object')),\n", " ('numerical',\n", " Pipeline(steps=[('sc', StandardScaler())]),\n", " Index(['carat', 'depth', 'table', 'x', 'y', 'z'], dtype='object'))])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat_pipe = Pipeline([('oe', OrdinalEncoder())])\n", "num_pipe = Pipeline([('sc', StandardScaler())])\n", "transformer = ColumnTransformer([\n", " ('categorical', cat_pipe, cat_cols),\n", " ('numerical', num_pipe, num_cols),\n", "])\n", "transformer" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('transformer',\n",
       "                 ColumnTransformer(transformers=[('categorical',\n",
       "                                                  Pipeline(steps=[('oe',\n",
       "                                                                   OrdinalEncoder())]),\n",
       "                                                  Index(['cut', 'color', 'clarity'], dtype='object')),\n",
       "                                                 ('numerical',\n",
       "                                                  Pipeline(steps=[('sc',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  Index(['carat', 'depth', 'table', 'x', 'y', 'z'], dtype='object'))])),\n",
       "                ('model', RandomForestRegressor(max_depth=10))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('transformer',\n", " ColumnTransformer(transformers=[('categorical',\n", " Pipeline(steps=[('oe',\n", " OrdinalEncoder())]),\n", " Index(['cut', 'color', 'clarity'], dtype='object')),\n", " ('numerical',\n", " Pipeline(steps=[('sc',\n", " StandardScaler())]),\n", " Index(['carat', 'depth', 'table', 'x', 'y', 'z'], dtype='object'))])),\n", " ('model', RandomForestRegressor(max_depth=10))])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_pipe = Pipeline([\n", " ('transformer', transformer),\n", " ('model', RandomForestRegressor(max_depth=10))\n", "])\n", "model_pipe" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MAE: 0.024328967523498828\n", "MSE: 0.001065932480652285\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y_trans, test_size=0.2, random_state=42)\n", "model_pipe.fit(X_train, y_train)\n", "y_pred = model_pipe.predict(X_test)\n", "# metrics\n", "print('MAE:', mean_absolute_error(y_test, y_pred))\n", "print('MSE:', mean_squared_error(y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "score 0.9873594998169654\n" ] } ], "source": [ "print(\"score\", r2_score(y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "result = model_pipe.predict(X_test[:10])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 517.79689115],\n", " [2400.05916567],\n", " [1114.18475212],\n", " [1232.31870392],\n", " [8707.42961509],\n", " [4444.12938732],\n", " [1739.14687264],\n", " [1814.46900219],\n", " [2117.05908754],\n", " [5816.43366488]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qt.inverse_transform(result.reshape(-1,1))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 559.],\n", " [2201.],\n", " [1238.],\n", " [1304.],\n", " [6901.],\n", " [3011.],\n", " [1765.],\n", " [1679.],\n", " [2102.],\n", " [4789.]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qt.inverse_transform(y_test[:10].reshape(-1,1))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "from joblib import dump" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['diamond_price.joblib']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dump({\n", " 'model': model_pipe,\n", " 'quantile': qt,\n", " 'description': 'diamond price prediction'\n", "}, 'diamond_price.joblib')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- add a train and test error evaluation\n", "- validation curve analysis\n", "- grid search for hyperparameter tuning" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
caratcutcolorclaritydepthtablexyz
10.23IdealESI261.555.03.953.982.43
20.21PremiumESI159.861.03.893.842.31
30.23GoodEVS156.965.04.054.072.31
40.29PremiumIVS262.458.04.204.232.63
50.31GoodJSI263.358.04.344.352.75
..............................
539360.72IdealDSI160.857.05.755.763.50
539370.72GoodDSI163.155.05.695.753.61
539380.70Very GoodDSI162.860.05.665.683.56
539390.86PremiumHSI261.058.06.156.123.74
539400.75IdealDSI262.255.05.835.873.64
\n", "

53940 rows × 9 columns

\n", "
" ], "text/plain": [ " carat cut color clarity depth table x y z\n", "1 0.23 Ideal E SI2 61.5 55.0 3.95 3.98 2.43\n", "2 0.21 Premium E SI1 59.8 61.0 3.89 3.84 2.31\n", "3 0.23 Good E VS1 56.9 65.0 4.05 4.07 2.31\n", "4 0.29 Premium I VS2 62.4 58.0 4.20 4.23 2.63\n", "5 0.31 Good J SI2 63.3 58.0 4.34 4.35 2.75\n", "... ... ... ... ... ... ... ... ... ...\n", "53936 0.72 Ideal D SI1 60.8 57.0 5.75 5.76 3.50\n", "53937 0.72 Good D SI1 63.1 55.0 5.69 5.75 3.61\n", "53938 0.70 Very Good D SI1 62.8 60.0 5.66 5.68 3.56\n", "53939 0.86 Premium H SI2 61.0 58.0 6.15 6.12 3.74\n", "53940 0.75 Ideal D SI2 62.2 55.0 5.83 5.87 3.64\n", "\n", "[53940 rows x 9 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
caratdepthtablexyz
count53940.00000053940.00000053940.00000053940.00000053940.00000053940.000000
mean0.79794061.74940557.4571845.7311575.7345263.538734
std0.4740111.4326212.2344911.1217611.1421350.705699
min0.20000043.00000043.0000000.0000000.0000000.000000
25%0.40000061.00000056.0000004.7100004.7200002.910000
50%0.70000061.80000057.0000005.7000005.7100003.530000
75%1.04000062.50000059.0000006.5400006.5400004.040000
max5.01000079.00000095.00000010.74000058.90000031.800000
\n", "
" ], "text/plain": [ " carat depth table x y \\\n", "count 53940.000000 53940.000000 53940.000000 53940.000000 53940.000000 \n", "mean 0.797940 61.749405 57.457184 5.731157 5.734526 \n", "std 0.474011 1.432621 2.234491 1.121761 1.142135 \n", "min 0.200000 43.000000 43.000000 0.000000 0.000000 \n", "25% 0.400000 61.000000 56.000000 4.710000 4.720000 \n", "50% 0.700000 61.800000 57.000000 5.700000 5.710000 \n", "75% 1.040000 62.500000 59.000000 6.540000 6.540000 \n", "max 5.010000 79.000000 95.000000 10.740000 58.900000 \n", "\n", " z \n", "count 53940.000000 \n", "mean 3.538734 \n", "std 0.705699 \n", "min 0.000000 \n", "25% 2.910000 \n", "50% 3.530000 \n", "75% 4.040000 \n", "max 31.800000 " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.describe()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cutcolorclarity
count539405394053940
unique578
topIdealGSI1
freq215511129213065
\n", "
" ], "text/plain": [ " cut color clarity\n", "count 53940 53940 53940\n", "unique 5 7 8\n", "top Ideal G SI1\n", "freq 21551 11292 13065" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.describe(include='object')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Ideal', 'Premium', 'Good', 'Very Good', 'Fair']" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.cut.unique().tolist()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['E', 'I', 'J', 'H', 'F', 'G', 'D']" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.color.unique().tolist()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['SI2', 'SI1', 'VS1', 'VS2', 'VVS2', 'VVS1', 'I1', 'IF']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.clarity.unique().tolist()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'carat': 0.23,\n", " 'cut': 'Ideal',\n", " 'color': 'E',\n", " 'clarity': 'SI2',\n", " 'depth': 61.5,\n", " 'table': 55.0,\n", " 'x': 3.95,\n", " 'y': 3.98,\n", " 'z': 2.43}" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.iloc[0].to_dict()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.55, 'Very Good', 'D', 'VS2', 59.8, 57.0, 5.31, 5.35, 3.19],\n", " [0.55, 'Ideal', 'G', 'SI1', 61.3, 56.0, 5.26, 5.31, 3.24],\n", " [0.5, 'Very Good', 'H', 'VS2', 62.3, 56.0, 5.06, 5.11, 3.17],\n", " [1.01, 'Ideal', 'H', 'SI1', 61.7, 57.0, 6.37, 6.44, 3.96],\n", " [1.26, 'Very Good', 'H', 'VS2', 63.8, 52.0, 6.89, 6.84, 4.38]],\n", " dtype=object)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.sample(5).values" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "base", "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.10.11" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }