{
"cells": [
{
"cell_type": "markdown",
"id": "9a9ada08-c9f0-466f-91a0-265fa539f9f5",
"metadata": {},
"source": [
"# [Predict the strength of concrete](https://app.datacamp.com/workspace/w/6062fa1f-85aa-48e2-a156-66a5fba7ff2a)\n",
"\n",
"## 📖 Background\n",
"\n",
"Concrete is the most widely used building material in the world. It is a mix of cement and water with gravel and sand. It can also include other materials like fly ash, blast furnace slag, and additives. \n",
"\n",
"The compressive strength of concrete is a function of components and age, the team is testing different combinations of ingredients at different time intervals. \n",
"\n",
"Find a simple way to estimate strength to predict how a particular sample is expected to perform.\n",
"\n",
"The objective is to answer:\n",
"1. The average strength of the concrete samples at 1, 7, 14, and 28 days of age.\n",
"2. The coefficients of regression model using the formula that provided us:\n",
""
]
},
{
"cell_type": "markdown",
"id": "10dcc269-3659-4851-99cd-f1ffb7f818aa",
"metadata": {},
"source": [
"## 💾 The data\n",
"The team has already tested more than a thousand samples ([source](https://archive.ics.uci.edu/ml/datasets/concrete+compressive+strength)):\n",
"\n",
"### Compressive strength data:\n",
"- \"cement\" - Portland cement in kg/m3\n",
"- \"slag\" - Blast furnace slag in kg/m3\n",
"- \"fly_ash\" - Fly ash in kg/m3\n",
"- \"water\" - Water in liters/m3\n",
"- \"superplasticizer\" - Superplasticizer additive in kg/m3\n",
"- \"coarse_aggregate\" - Coarse aggregate (gravel) in kg/m3\n",
"- \"fine_aggregate\" - Fine aggregate (sand) in kg/m3\n",
"- \"age\" - Age of the sample in days\n",
"- \"strength\" - Concrete compressive strength in megapascals (MPa)\n",
"\n",
"***Acknowledgments**: I-Cheng Yeh, \"Modeling of strength of high-performance concrete using artificial neural networks,\" Cement and Concrete Research, Vol. 28, No. 12, pp. 1797-1808 (1998)*."
]
},
{
"cell_type": "markdown",
"id": "0864ae32-db01-4bad-b6f3-3b506daf0ba4",
"metadata": {},
"source": [
"## Import Libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "7f0964c3-2705-41df-af08-d8a8efe2378c",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn.preprocessing import StandardScaler, OrdinalEncoder\n",
"from sklearn.model_selection import train_test_split, cross_val_score, KFold\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.linear_model import LinearRegression, LogisticRegression\n",
"from sklearn.neighbors import KNeighborsRegressor\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"from sklearn.ensemble import AdaBoostRegressor, RandomForestRegressor, BaggingRegressor, GradientBoostingRegressor\n",
"from sklearn.svm import SVR\n",
"from sklearn.model_selection import GridSearchCV\n",
"import tensorflow as tf\n",
"from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "markdown",
"id": "30988536-8315-4f6c-b131-7bbe2183e440",
"metadata": {},
"source": [
"## Load Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "40251159-3eea-47f8-bfb4-09e38d5ced65",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,6))\n",
"sns.heatmap(df.corr(), annot=True)\n",
"plt.title('Heatmap of correlation with all features')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "3e9f2d12-a822-42a5-87e3-94d391412429",
"metadata": {},
"source": [
"### Age\n",
"\n",
"Age is a very important characteristic that affects concrete strength."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "08fdc396-cfbe-4914-985b-b56c5fc74339",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAGDCAYAAADpkpxbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAh7ElEQVR4nO3de5glVX3u8e8Lo6CiIDAhAoODgCZoBHVEPJCoECMYFeJBDhwvaIgkOWgk3g6oMWok8a6oiU9IUMAbooiiwQtBo4kngAOCclEZFQTkMiIXFSEZ+Z0/arXTjN0zzZrevbuZ7+d59tNVq1bV/vWa3T3vrl67KlWFJEmSpLtvo3EXIEmSJC1UhmlJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROhmlJkiSpk2FaksYkyR8luSrJz5I8atz13F1J9kpyeav/wHHXI0njYJiWtOAl+d9JlrdQd22SzyXZew6et5LsvB6HeBvwoqrarKq+MVt1zaE3AO9t9X9q3MXcXUmuSPL7465D0sJmmJa0oCV5KfAu4G+BbYAdgH8ADhhjWTP1YOCScRexHuZt/UkWjbsGSRsGw7SkBSvJ5gxnR4+sqk9W1c+r6r+r6jNV9YrWZ5Mk70ryo/Z4V5JN2rbnJ/mPNY75q7PNSU5M8vdJ/iXJT5Ocm2Sntu2rbZeL2hnx/zVFfRsleU2SK5PckOTkJJu3mn4GbNz2/940399xbRrIrUnOT/K7k7bdJ8lJSW5KclmSVya5etL2bZOclmRlkh8k+YtJ2/ZoZ/JvTXJ9knesZYxfmGRFkp8kOSPJtq39e8BDgM+073+TKfZdkuSTrYYbk7x3bePSti1t/waHJflhkh8nefWkY26c5FVJvtf+Tc5PsmTSv92RSS4HLm9tT0tyYZKbk/y/JI9s7R9keOM1Uf8rW/uerd/NSS5K8sTpxkaSwDAtaWF7PLApcPpa+rwa2BPYHdgN2AN4zd14jkOA1wMPBFYAxwJU1e+17bu1aQ4fm2Lf57fHkxiC52YM0yLuqKrNJu2/0zTP/fVW95bAR4CPJ9m0bftrYGk77pOB50zslGQj4DPARcB2wL7AUUme0rocBxxXVQ8AdgJOnerJk+wD/B1wMPAg4ErglPb97wT8EHh6+/7vWGPfjYHPtn2WtjpOWdu4rPH0ewMPa7W/Nslvt/aXAocCTwUeAPwxcNuk/Q4EHgfs2uahvx/4U2Ar4B+BM5JsUlXPXaP+tyTZDvgX4I0MY/5y4LQki6caH0kCw7SkhW0r4MdVtWotfZ4NvKGqbqiqlQzB+Ll34zlOr6rz2nN8mCHcztSzgXdU1fer6mfAMcAhM52CUFUfqqobq2pVVb0d2IQhYMIQcP+2qm6qqquBd0/a9bHA4qp6Q1X9V1V9H/gnhjcGAP8N7Jxk66r6WVWds5b6319VF7SwfAzw+CRLZ1D+HsC2wCvaXwxur6qJvwLMZFxeX1W/qKqLGN4U7Nba/wR4TVV9pwYXVdWNk/b7u6r6SVX9AjgC+MeqOreqfllVJwF3MLy5mspzgDOr6syqurOqzgKWMwR3SZqSYVrSQnYjsPU6wum2DGdHJ1zZ2mbquknLtzGcRZ2pqZ57EcPc7nVK8vI2heOWJDcDmwNbTzr2VZO6T15+MLBtm6pwc9v3VZOe93DgocC3k3w9ydNmUn8LvjcynGVelyXAldO80ZnJuEw37kuAKafFNGuOw8vWGIclTP/v/2DgWWv035vhrLwkTckPaEhayP6T4UzjgcAnpunzI+76QbkdWhvAz4H7TnRM8puzXN/Ec0/YAVgFXL+uHdv86FcyTHO4pKruTHITkNblWmB74NK2vmTS7lcBP6iqXaY6dlVdDhzapoM8E/hEkq2q6udrqz/J/Rj+GnDNuupvNeyQZNEUgXpt47L9DI67E3DxNNtrjb7HVtWxM+g70f+DVfXCddQgSb/imWlJC1ZV3QK8Fvj7JAcmuW+SeyXZP8lbWrePAq9JsjjJ1q3/h9q2i4CHJ9m9zUV+3d0s4XqGOb/T+Sjwl0l2TLIZwxVHPraOaSkT7s8QMFcCi5K8lmGO8IRTgWOSPLDN9X3RpG3nAT9N8n/bBxU3TvKIJI8FSPKcJIur6k7g5rbPndPU/4I2Ppu0+s+tqitmUP95DIH/TUnul2TTJHtNOm7vuPwz8DdJdsngkUm2mqbvPwF/luRxre/9kvxhkvu37Wv++30IeHqSp7Qx2zTJE5OsK+BL2oAZpiUtaG0u8UsZPlS4kuHs4ouAT7Uub2SY9/pN4FvABa2Nqvouw9VA/pXh6g93ubLHDLwOOKlNCTh4iu3vBz4IfBX4AXA78OIZHvsLwOeB7zJMg7idu05heANwdTvuvzKcmb8DoKp+CTyNYX73D4AfM4TQzdu++wGXZLiiyHHAIW2O8V1U1b8CfwWcxhCMd2L1vOu1ajU8HdiZ4YN+VwMTVzxZn3F5B8MbiS8CtwInAPeZpoblwAsZPtx4E8MHSJ8/qcvfMbzRujnJy6vqKoZLKr6K1a+lV+D/lZLWIlVr/pVLkrTQJPlzhlD8hHHXIkkbEt9tS9IClORBGW7nvVGShwEvY+2XCJQkjYAfQJSkheneDNdN3pFh3vMpDHd+lCTNoZFO80hyBfBT4JfAqqpalmRL4GMMF/G/Aji4qm5KEoa5e09luAzS86vqgpEVJ0mSJK2nuZjm8aSq2r2qlrX1o4Gz2yWbzm7rAPsDu7THEcD75qA2SZIkqds45kwfAJzUlk9iuD7sRPvJ7Y5W5wBbJPFC+ZIkSZq3Rj1nuoAvJimGW7oeD2xTVde27dex+o5X23HXyz5d3dquZRpbb711LV26dNaLliRJkiY7//zzf1xVi9dsH3WY3ruqrknyG8BZSb49eWNVVQvaM5bkCIZpIOywww4sX7589qqVJEmSppDkyqnaRzrNo6quaV9vYLhk0x7A9RPTN9rXG1r3a7jr7XC3Z4pb1lbV8VW1rKqWLV78a28OJEmSpDkzsjDdbtt6/4ll4A+Ai4EzgMNat8OAT7flM4DntVu+7gncMmk6iCRJkjTvjHKaxzbA6cMV71gEfKSqPp/k68CpSQ5nuEXuxC14z2S4LN4KhkvjvWCEtUmSJEnrbWRhuqq+D+w2RfuNwL5TtBdw5KjqkSRJkmabtxOXJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOo3yduKStCC892WfGXcJs+5Fb3/6uEuQpA2CZ6YlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqdPIw3SSjZN8I8ln2/qOSc5NsiLJx5Lcu7Vv0tZXtO1LR12bJEmStD7m4sz0S4DLJq2/GXhnVe0M3AQc3toPB25q7e9s/SRJkqR5a6RhOsn2wB8C/9zWA+wDfKJ1OQk4sC0f0NZp2/dt/SVJkqR5adRnpt8FvBK4s61vBdxcVava+tXAdm15O+AqgLb9ltZfkiRJmpdGFqaTPA24oarOn+XjHpFkeZLlK1eunM1DS5IkSXfLKM9M7wU8I8kVwCkM0zuOA7ZIsqj12R64pi1fAywBaNs3B25c86BVdXxVLauqZYsXLx5h+ZIkSdLajSxMV9UxVbV9VS0FDgG+VFXPBr4MHNS6HQZ8ui2f0dZp279UVTWq+iRJkqT1NY7rTP9f4KVJVjDMiT6htZ8AbNXaXwocPYbaJEmSpBlbtO4u66+q/g34t7b8fWCPKfrcDjxrLuqRJEmSZoN3QJQkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSeo0sjCdZNMk5yW5KMklSV7f2ndMcm6SFUk+luTerX2Ttr6ibV86qtokSZKk2TDKM9N3APtU1W7A7sB+SfYE3gy8s6p2Bm4CDm/9Dwduau3vbP0kSZKkeWtkYboGP2ur92qPAvYBPtHaTwIObMsHtHXa9n2TZFT1SZIkSetrpHOmk2yc5ELgBuAs4HvAzVW1qnW5GtiuLW8HXAXQtt8CbDXK+iRJkqT1MdIwXVW/rKrdge2BPYDfWt9jJjkiyfIky1euXLm+h5MkSZK6zcnVPKrqZuDLwOOBLZIsapu2B65py9cASwDa9s2BG6c41vFVtayqli1evHjUpUuSJEnTGuXVPBYn2aIt3wd4MnAZQ6g+qHU7DPh0Wz6jrdO2f6mqalT1SZIkSetr0bq7dHsQcFKSjRlC+6lV9dkklwKnJHkj8A3ghNb/BOCDSVYAPwEOGWFtkiRJ0nobWZiuqm8Cj5qi/fsM86fXbL8deNao6pEkSZJmm3dAlCRJkjoZpiVJkqROhmlJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROhmlJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROhmlJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROhmlJkiSp04zCdJKzZ9ImSZIkbUgWrW1jkk2B+wJbJ3kgkLbpAcB2I65NkiRJmtfWGqaBPwWOArYFzmd1mL4VeO/oypIkSZLmv7WG6ao6DjguyYur6j1zVJMkSZK0IKzrzDQAVfWeJP8DWDp5n6o6eUR1SZIkSfPejMJ0kg8COwEXAr9szQUYpiVJkrTBmlGYBpYBu1ZVjbIYSZIkaSGZ6XWmLwZ+c5SFSJIkSQvNTM9Mbw1cmuQ84I6Jxqp6xkiqkiRJkhaAmYbp142yCEmSJGkhmunVPL4y6kIkSZKkhWamV/P4KcPVOwDuDdwL+HlVPWBUhUmSJEnz3UzPTN9/YjlJgAOAPUdVlCRJkrQQzPRqHr9Sg08BT5n9ciRJkqSFY6bTPJ45aXUjhutO3z6SiiRJkqQFYqZX83j6pOVVwBUMUz0kSZKkDdZM50y/YNSFSJIkSQvNjOZMJ9k+yelJbmiP05JsP+riJEmSpPlsph9A/ABwBrBte3ymtUmSJEkbrJmG6cVV9YGqWtUeJwKLR1iXJEmSNO/NNEzfmOQ5STZuj+cAN46yMEmSJGm+m2mY/mPgYOA64FrgIOD5I6pJkiRJWhBmemm8NwCHVdVNAEm2BN7GELIlSZKkDdJMz0w/ciJIA1TVT4BHjaYkSZIkaWGYaZjeKMkDJ1bamemZntWWJEmS7pFmGojfDvxnko+39WcBx46mJEmSJGlhmOkdEE9OshzYpzU9s6ouHV1ZkiRJ0vw346kaLTwboCVJkqRmpnOmJUmSJK3BMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktRpZGE6yZIkX05yaZJLkryktW+Z5Kwkl7evD2ztSfLuJCuSfDPJo0dVmyRJkjQbRnlmehXwsqraFdgTODLJrsDRwNlVtQtwdlsH2B/YpT2OAN43wtokSZKk9TayMF1V11bVBW35p8BlwHbAAcBJrdtJwIFt+QDg5BqcA2yR5EGjqk+SJElaX3MyZzrJUuBRwLnANlV1bdt0HbBNW94OuGrSble3NkmSJGleGnmYTrIZcBpwVFXdOnlbVRVQd/N4RyRZnmT5ypUrZ7FSSZIk6e4ZaZhOci+GIP3hqvpka75+YvpG+3pDa78GWDJp9+1b211U1fFVtayqli1evHh0xUuSJEnrMMqreQQ4Abisqt4xadMZwGFt+TDg05Pan9eu6rEncMuk6SCSJEnSvLNohMfeC3gu8K0kF7a2VwFvAk5NcjhwJXBw23Ym8FRgBXAb8IIR1iZJkiStt5GF6ar6DyDTbN53iv4FHDmqeiRJkqTZ5h0QJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6Lxl2ARu+Hb/idcZcw63Z47bfGXYIkSZJnpiVJkqRehmlJkiSpk2FakiRJ6mSYliRJkjr5AURtUPZ6z17jLmHWfe3FXxt3CZIkbbA8My1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1GlmYTvL+JDckuXhS25ZJzkpyefv6wNaeJO9OsiLJN5M8elR1SZIkSbNllGemTwT2W6PtaODsqtoFOLutA+wP7NIeRwDvG2FdkiRJ0qwYWZiuqq8CP1mj+QDgpLZ8EnDgpPaTa3AOsEWSB42qNkmSJGk2zPWc6W2q6tq2fB2wTVveDrhqUr+rW5skSZI0b43tA4hVVUDd3f2SHJFkeZLlK1euHEFlkiRJ0szMdZi+fmL6Rvt6Q2u/Blgyqd/2re3XVNXxVbWsqpYtXrx4pMVKkiRJazPXYfoM4LC2fBjw6Untz2tX9dgTuGXSdBBJkiRpXlo0qgMn+SjwRGDrJFcDfw28CTg1yeHAlcDBrfuZwFOBFcBtwAtGVZckSZI0W0YWpqvq0Gk27TtF3wKOHFUtkiRJ0ih4B0RJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROI/sAoiRp4Tn2OQeNu4RZ9+oPfWLcJUi6B/PMtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnQzTkiRJUifDtCRJktTJMC1JkiR1MkxLkiRJnRaNuwBJ4/GV33vCuEuYdU/46lfGXYIkaQPjmWlJkiSpk2FakiRJ6mSYliRJkjoZpiVJkqROfgBRkqQpXHbsl8Zdwqz77VfvM+4SpHscw7QkSdIMnPrxPcZdwkgc/Kzzxl3CguY0D0mSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqtGjcBUiSpPnrda973bhLGIl76velueeZaUmSJKmTYVqSJEnqZJiWJEmSOhmmJUmSpE6GaUmSJKmTYVqSJEnqNK/CdJL9knwnyYokR4+7HkmSJGlt5k2YTrIx8PfA/sCuwKFJdh1vVZIkSdL05tNNW/YAVlTV9wGSnAIcAFw61qokSZJ0F7t94gvjLmEkLjroKXd7n/kUprcDrpq0fjXwuN6DPeYVJ693QfPN+W993rhLkCRJ0iSpqnHXAECSg4D9qupP2vpzgcdV1YvW6HcEcERbfRjwnTktdGpbAz8edxHzhGMxcBxWcyxWcyxWcyxWcyxWcyxWcyxWmy9j8eCqWrxm43w6M30NsGTS+vat7S6q6njg+LkqaiaSLK+qZeOuYz5wLAaOw2qOxWqOxWqOxWqOxWqOxWqOxWrzfSzmzQcQga8DuyTZMcm9gUOAM8ZckyRJkjSteXNmuqpWJXkR8AVgY+D9VXXJmMuSJEmSpjVvwjRAVZ0JnDnuOjrMq2knY+ZYDByH1RyL1RyL1RyL1RyL1RyL1RyL1eb1WMybDyBKkiRJC818mjMtSZIkLSiG6U5J3p/khiQXj7uWcUuyaZLzklyU5JIkrx93TeOS5GFJLpz0uDXJUeOua66s7eciycuSVJKtx1HbXEuyJMmXk1zafi5e0tp3T3JOe30sT7LHuGudC0muSPKtie97UvuLk3y7jdFbxlnjXEnykiQXt+/5qNa2ZZKzklzevj5wzGXOiWnG4llt/c4k8/YKDutrqt+X070OMnh3khVJvpnk0eOrfPZNMxZvbb8bvpnk9CRbTNp2TBuL7yS5+3dZmWWG6X4nAvuNu4h54g5gn6raDdgd2C/JnuMtaTyq6jtVtXtV7Q48BrgNOH28Vc2pE5ni5yLJEuAPgB/OdUFjtAp4WVXtCuwJHJlkV+AtwOvba+S1bX1D8aT287EMIMmTGO50u1tVPRx421irmwNJHgG8kOGuv7sBT0uyM3A0cHZV7QKc3dbv0dYyFhcDzwS+Osby5sKJ/Prvy+leB/sDu7THEcD75qjGuXIivz4WZwGPqKpHAt8FjgFov0cPAR7e9vmHJBvPXam/zjDdqaq+Cvxk3HXMBzX4WVu9V3s4GR/2Bb5XVVeOu5C5spafi3cCr2QDel1U1bVVdUFb/ilwGcOdXgt4QOu2OfCj8VQ4L/w58KaqugOgqm4Ycz1z4beBc6vqtqpaBXyFITgeAJzU+pwEHDie8ubUlGNRVZdV1Xy4IdtITfP7crrXwQHAye3/23OALZI8aE4KnQNTjUVVfbG9LgDOYbj/CAxjcUpV3VFVPwBWMLwhGxvDtGZFko2TXAjcAJxVVeeOuaT54BDgo+MuYtySHABcU1UXjbuWcUmyFHgUcC5wFPDWJFcxnIk9ZnyVzakCvpjk/HYnW4CHAr+b5NwkX0ny2DHWN1cuZviet0pyX+CpDDcs26aqrm19rgO2GVeBc2i6sdiQTfc62A64alK/q1vbhuKPgc+15Xk3FvPq0nhauKrql8DubU7T6UkeUVUb7HzyduOhZ7DhBKUptf8gX8UwxWODlGQz4DTgqKq6Nckbgb+sqtOSHAycAPz+WIucG3tX1TVJfgM4K8m3Gf4P2pJhGsxjgVOTPKTuwZeZqqrLkrwZ+CLwc+BC4Jdr9Kkk99gxmDCTsdiQbSivg3VJ8mqGaXMfHnct0/HMtGZVVd0MfBnnk+8PXFBV14+7kDHbCdgRuCjJFQx/prsgyW+Otao5kuReDEH6w1X1ydZ8GDCx/HHG/OfJuVJV17SvNzB8jmAPhjNKn2x/uj4PuBO4x39AtapOqKrHVNXvATcxzAe9fuLP9u3rhjDlZbqx2JBN9zq4hruetd++td2jJXk+8DTg2ZPeZM+7sTBMa70lWTzxKdsk9wGeDHx7rEWN36E4xYOq+lZV/UZVLa2qpQzh6dFVdd2YSxu5JGE463xZVb1j0qYfAU9oy/sAl891bXMtyf2S3H9imeEvFRcDnwKe1NofCtwb+PGYypwz7ew8SXZgmC/9EeAMhjdatK+fHk91c2uasdiQTfc6OAN4Xruqx57ALZOmg9wjJdmP4bM2z6iq2yZtOgM4JMkmSXZk+FDmeeOocYI3bemU5KPAExnOolwP/HVVnTDWosYkySMZPiixMcMbtFOr6g3jrWp8Wlj4IfCQqrpl3PXMpXX9XLSz08uqakMITHsD/w58i+GMKwxTXm4FjmOY4nA78H+q6vyxFDlHkjyE1Ve1WQR8pKqObdOh3s9wFaD/Al5eVV8aT5VzJ8m/A1sB/w28tKrOTrIVcCqwA3AlcHBV3eM/5D7NWPwR8B5gMXAzcGFVjf3yZ7Ntqt+XDG8wf+110N6cv5fhr763AS+oquVTHHZBmmYsjgE2AW5s3c6pqj9r/V/NMI96FcMUus+tecy5ZJiWJEmSOjnNQ5IkSepkmJYkSZI6GaYlSZKkToZpSZIkqZNhWpIkSepkmJakeSLJgUkqyW/N8nGPSvK8tnxikh8kuSjJd5OcnGT7WX6+tyXZZzaPKUnzlWFakuaPQ4H/aF9nRZJFDNdjnXwzjFdU1W7Aw4BvAF9q13yeLe8Bjp7F40nSvGWYlqR5IMlmwN7A4cAhk9o3SvIPSb6d5KwkZyY5qG17TJKvJDk/yRcmbkO8hn0Ybm2/as0N7Tbe7wSuA/Zvx3xfkuVJLkny+ta2T5JPTarpyUlOT7JxO9N9cZJvJfnLdtwrga02lNvGS9qwGaYlaX44APh8VX0XuDHJY1r7M4GlwK7Ac4HHAyS5F8MZ4IOq6jEMdxI8dorj7gWs6w6LFwATU0teXVXLgEcCT2h3OP0y8FtJFrc+L2D1nQu3q6pHVNXvAB9Y45h7zeD7lqQFzTAtSfPDocApbfkUVk/12Bv4eFXdWVXXMQRbGKZoPAI4K8mFwGuAqeY+PwhYuY7nzqTlg5NcwDD94+HArjXcKveDwHOSbMEQ6D8HfB94SJL3JNmP4VbpE24Atl3H80rSgrdo3AVI0oYuyZYM0zF+J0kBGwOV5BVr2w24pKoev47D/wLYdB19HgWcnWRH4OXAY6vqpiQnTtr3A8BngNsZwv0q4KYkuwFPAf4MOJhhfjZtv1+s43klacHzzLQkjd9BwAer6sFVtbSqlgA/AH4X+BrwP9vc6W2AJ7Z9vgMsTvKraR9JHj7FsS8Ddp7qSTP4C4az158HHgD8HLilPdf+E32r6kfAjxjOgH+g7b81sFFVndbaHz3p8A8FLr7bIyFJC4xnpiVp/A4F3rxG22mt/UhgX+BS4CqGuci3VNV/tQ8ivjvJ5gy/z98FXLLGcT7HMEVjsrcm+SvgvsA5wJOq6r+Ai5J8A/h2e66vrbHfh4HFVXVZW98O+ECSiRMzx8Cv5nPvDCyf8QhI0gKVYSqcJGm+SrJZVf0syVbAecBebf70TPc/HXhlVV2+nnW8F/hGVZ2wjn5/BDy6qv5qfZ5PkhYCz0xL0vz32fbBv3sDf3N3gnRzNMNUju4wneR8hikgL5tB90XA23ufS5IWEs9MS5IkSZ38AKIkSZLUyTAtSZIkdTJMS5IkSZ0M05IkSVInw7QkSZLUyTAtSZIkdfr/JOHFVG6qlHgAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,6))\n",
"sns.countplot(x='age', data=df)\n",
"plt.title(label=\"Count of ages of concrete\")\n",
"plt.xlabel(\"Age (Days)\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "0cb1203b-5e5c-4012-afcc-9e8ab70b3ebd",
"metadata": {},
"source": [
"This bar plot shows that age is a categorical variable with a high number of observations at 28 days. \n",
"The 28 days time frame is significant because this is the period for concrete to reach 99% of it's strength. While the concrete continuous to gain strength after that period, the rate of gain is much less compared to that in 28 days."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "f9337430-04ba-4e21-9711-7c7487817a18",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average concrete strength: 35.25027287623584 \n",
"\n"
]
},
{
"data": {
"text/html": [
"\n",
"
\n",
"
Average concrete strength at different ages (Days):
\n",
" \n",
"
\n",
"
\n",
"
age
\n",
"
mean
\n",
"
count
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
9.452716
\n",
"
2
\n",
"
\n",
"
\n",
"
1
\n",
"
3
\n",
"
18.378023
\n",
"
129
\n",
"
\n",
"
\n",
"
2
\n",
"
7
\n",
"
25.181843
\n",
"
122
\n",
"
\n",
"
\n",
"
3
\n",
"
14
\n",
"
28.751038
\n",
"
62
\n",
"
\n",
"
\n",
"
4
\n",
"
28
\n",
"
37.383788
\n",
"
478
\n",
"
\n",
"
\n",
"
5
\n",
"
56
\n",
"
50.715152
\n",
"
86
\n",
"
\n",
"
\n",
"
6
\n",
"
90
\n",
"
40.480809
\n",
"
54
\n",
"
\n",
"
\n",
"
7
\n",
"
91
\n",
"
68.674649
\n",
"
17
\n",
"
\n",
"
\n",
"
8
\n",
"
100
\n",
"
47.668780
\n",
"
52
\n",
"
\n",
"
\n",
"
9
\n",
"
120
\n",
"
39.647168
\n",
"
3
\n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"avg_str_by_day = df.groupby('age').agg(['mean', 'count'])['strength']\n",
"avg_str_by_day.reset_index(inplace=True)\n",
"avg_str_by_day.age = avg_str_by_day.age.astype(int)\n",
"avg_str_by_day = avg_str_by_day.style.set_caption(\"Average concrete strength at different ages (Days):\")\n",
"print(f'Average concrete strength: {df.strength.mean()} \\n')\n",
"avg_str_by_day"
]
},
{
"cell_type": "markdown",
"id": "707706ff-5622-481a-a043-1dd841f59fb1",
"metadata": {},
"source": [
"From the table we can see that average concrete strength at 28 days is similar to the average strength of the entire dataset."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1cf18be3-7283-43af-93c7-13a3866238de",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,6))\n",
"sns.boxplot(x='age', y='strength', data=df);\n",
"plt.title(label=\"Boxplot of concrete strength at different ages\") \n",
"plt.xlabel(\"Age (Days)\")\n",
"plt.ylabel(\"Strength\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "8d15b593-4f66-463b-ac70-425c266650b4",
"metadata": {},
"source": [
"In this boxplot, concrete strength is the highest at 91 days. They have the highest median strenght with a narrow variation. We can also see that strength has the largest variation at 28 days."
]
},
{
"cell_type": "markdown",
"id": "81da4f90-bd9f-4f6b-b876-652c8c8d1970",
"metadata": {
"tags": []
},
"source": [
"## 1. Average strength of the concrete samples at 1, 7, 14, and 28 days of age.\n",
"\n",
"Average strength of concrete is the lowest after 1 day and increases significantly after 7 days. Strength continues to increase in MPa after 14 and 28 days."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "cfc23420-047f-49a4-8456-c26186edab7a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average strength of the concrete sample is 9.45 MPa at 1 day.\n",
"Average strength of the concrete sample is 25.18 MPa at 7 days.\n",
"Average strength of the concrete sample is 28.75 MPa at 14 days.\n",
"Average strength of the concrete sample is 37.38 MPa at 28 days.\n"
]
}
],
"source": [
"ages = [1, 7, 14, 28]\n",
"\n",
"for age in ages:\n",
" cond = df.age == age\n",
" avg_str = df[cond].strength.mean().round(2)\n",
" if age == 1:\n",
" print(f'Average strength of the concrete sample is {avg_str} MPa at {age} day.')\n",
" else:\n",
" print(f'Average strength of the concrete sample is {avg_str} MPa at {age} days.')"
]
},
{
"cell_type": "markdown",
"id": "dc886cef-86b2-4288-b124-c35d2a47f512",
"metadata": {},
"source": [
"## 2. Creating predictive model\n",
"\n",
"Now let's help our colleages in the engineering department find out the coefficients $\\beta_{0}$, $\\beta_{1}$ ... $\\beta_{8}$, to use in the following formula:\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"id": "3dede16c-0c6f-4de4-b653-79adf29002cb",
"metadata": {},
"source": [
"## Train Test Split\n",
"\n",
"Split the data to train (80%) and test (20%) to estimate the performance of machine learning algorithms when they are used to make predictions on data not used to train the model."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "20ac4305-ba34-4a3a-92f2-d6d430b68a09",
"metadata": {},
"outputs": [],
"source": [
"features = ['cement', 'slag', 'fly_ash', 'water', 'superplasticizer', 'coarse_aggregate', 'fine_aggregate', 'age']\n",
"X = df[features] # Features\n",
"y = df['strength'] # Target"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "8df4a9f2-2a5e-4a0c-89bd-a957b6988345",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X train data (804, 8)\n",
"y train data (804,)\n",
"X test data (201, 8)\n",
"y test data (201,)\n"
]
}
],
"source": [
"# Train Test Split\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2022)\n",
"\n",
"print('X train data {}'.format(X_train.shape))\n",
"print('y train data {}'.format(y_train.shape))\n",
"print('X test data {}'.format(X_test.shape))\n",
"print('y test data {}'.format(y_test.shape))"
]
},
{
"cell_type": "markdown",
"id": "779d6366-9986-43f0-9c2c-65bbb934ea8f",
"metadata": {
"tags": []
},
"source": [
"### Encoding age\n",
"\n",
"We observed that `age` is a variabel comprised of a finite set of discrete values with a ranked ordering between values."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "11ada35a-1bbd-4b29-8fec-671437863513",
"metadata": {},
"outputs": [],
"source": [
"def ordinal_encoding_feature(data, feature): \n",
" '''Transform selected column with ordinal encoder\n",
" \n",
" INPUTS:\n",
" data: dataframe\n",
" feature: column name\n",
" \n",
" OUTPUT:\n",
" d: dataframe with feature ordinally encoded\n",
" ''' \n",
" d = data.copy()\n",
" encoder = OrdinalEncoder()\n",
" # Reshape because only one column is transformed\n",
" encoder.fit(data[feature].values.reshape(-1,1))\n",
" d[feature]= encoder.transform(data.age.values.reshape(-1,1))\n",
" return d\n",
"X_train = X_train.pipe(ordinal_encoding_feature, 'age')\n",
"X_test = X_test.pipe(ordinal_encoding_feature, 'age')"
]
},
{
"cell_type": "markdown",
"id": "f4dbd66c-9dfa-48b2-8cb5-49016047e32a",
"metadata": {},
"source": [
"## Model Selection\n",
"\n",
"We will be using a supervised regression model since the target variable `strength` is labeled and continuous. \n",
"Using k-folds cross validation to estimate and compare the performance of models on out-of-sample data using r2 score. This enables us to identify which model is worth improving upon. \n",
"GradientBoostRegressor gives the best results out of models, with the highest r2score of 0.89."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "d5761d7b-94ca-4492-b3ce-335903f65209",
"metadata": {},
"outputs": [],
"source": [
"pipelines = []\n",
"pipelines.append(('Linear Regression', Pipeline([('scaler', StandardScaler()), ('LR', LinearRegression())])))\n",
"pipelines.append(('KNN Regressor', Pipeline([('scaler', StandardScaler()), ('KNNR', KNeighborsRegressor())])))\n",
"pipelines.append(('SupportVectorRegressor', Pipeline([('scaler', StandardScaler()), ('SVR', SVR())])))\n",
"pipelines.append(('DecisionTreeRegressor', Pipeline([('scaler', StandardScaler()), ('DTR', DecisionTreeRegressor())])))\n",
"pipelines.append(('AdaboostRegressor', Pipeline([('scaler', StandardScaler()), ('ABR', AdaBoostRegressor())])))\n",
"pipelines.append(('RandomForestRegressor', Pipeline([('scaler', StandardScaler()), ('RBR', RandomForestRegressor())])))\n",
"pipelines.append(('BaggingRegressor', Pipeline([('scaler', StandardScaler()), ('BGR', BaggingRegressor())])))\n",
"pipelines.append(('GradientBoostRegressor', Pipeline([('scaler', StandardScaler()), ('GBR', GradientBoostingRegressor())])))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "9ccd3c02-eb69-41b2-9c85-56e990b643c0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
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.