{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Fitting with ScikitLearn - Part 2\n", "==========================\n", "
\n", "

Overview

\n", "

Questions

\n", " \n", "

Objectives:

\n", " \n", "

Keypoints:

\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Preparation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "plates = pd.read_csv(\"data/rxnpredict/data_table.csv\")" ] }, { "cell_type": "code", "execution_count": 3, "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", "
platerowcolbasebase_cas_numberbase_smilesligandligand_cas_numberligand_smilesaryl_halide_numberaryl_halidearyl_halide_smilesadditive_numberadditiveadditive_smilesproduct_smilesyield
0111P2Et165535-45-5CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCCXPhos564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...1.01-chloro-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(Cl)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc126.888615
1112P2Et165535-45-5CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCCXPhos564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...2.01-bromo-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(Br)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc124.063224
2113P2Et165535-45-5CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCCXPhos564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...3.01-iodo-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(I)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc147.515821
3114P2Et165535-45-5CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCCXPhos564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...4.01-chloro-4-methoxybenzeneCOc1ccc(Cl)cc1NaNNaNNaNCOc1ccc(Nc2ccc(C)cc2)cc12.126831
4115P2Et165535-45-5CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCCXPhos564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...5.01-bromo-4-methoxybenzeneCOc1ccc(Br)cc1NaNNaNNaNCOc1ccc(Nc2ccc(C)cc2)cc147.586354
\n", "
" ], "text/plain": [ " plate row col base base_cas_number \\\n", "0 1 1 1 P2Et 165535-45-5 \n", "1 1 1 2 P2Et 165535-45-5 \n", "2 1 1 3 P2Et 165535-45-5 \n", "3 1 1 4 P2Et 165535-45-5 \n", "4 1 1 5 P2Et 165535-45-5 \n", "\n", " base_smiles ligand ligand_cas_number \\\n", "0 CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCC XPhos 564483-18-7 \n", "1 CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCC XPhos 564483-18-7 \n", "2 CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCC XPhos 564483-18-7 \n", "3 CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCC XPhos 564483-18-7 \n", "4 CN(C)P(N(C)C)(N(C)C)=NP(N(C)C)(N(C)C)=NCC XPhos 564483-18-7 \n", "\n", " ligand_smiles aryl_halide_number \\\n", "0 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 1.0 \n", "1 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 2.0 \n", "2 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 3.0 \n", "3 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 4.0 \n", "4 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 5.0 \n", "\n", " aryl_halide aryl_halide_smiles additive_number \\\n", "0 1-chloro-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(Cl)cc1 NaN \n", "1 1-bromo-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(Br)cc1 NaN \n", "2 1-iodo-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(I)cc1 NaN \n", "3 1-chloro-4-methoxybenzene COc1ccc(Cl)cc1 NaN \n", "4 1-bromo-4-methoxybenzene COc1ccc(Br)cc1 NaN \n", "\n", " additive additive_smiles product_smiles yield \n", "0 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 26.888615 \n", "1 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 24.063224 \n", "2 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 47.515821 \n", "3 NaN NaN COc1ccc(Nc2ccc(C)cc2)cc1 2.126831 \n", "4 NaN NaN COc1ccc(Nc2ccc(C)cc2)cc1 47.586354 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plates.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "descriptors = pd.read_csv(\"data/rxnpredict/output_table_modified.csv\")" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
additive_*C3_NMR_shiftadditive_*C3_electrostatic_chargeadditive_*C4_NMR_shiftadditive_*C4_electrostatic_chargeadditive_*C5_NMR_shiftadditive_*C5_electrostatic_chargeadditive_*N1_electrostatic_chargeadditive_*O1_electrostatic_chargeadditive_E_HOMOadditive_E_LUMO...ligand_V6_intensityligand_V7_frequencyligand_V7_intensityligand_V8_frequencyligand_V8_intensityligand_V9_frequencyligand_V9_intensityligand_dipole_momentplaterow
0143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...4.4143026.56116.5773043.09718.1453064.34438.211.21292411
1143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...4.4143026.56116.5773043.09718.1453064.34438.211.21292411
2143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...4.4143026.56116.5773043.09718.1453064.34438.211.21292411
3143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...4.4143026.56116.5773043.09718.1453064.34438.211.21292411
4143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...4.4143026.56116.5773043.09718.1453064.34438.211.21292411
\n", "

5 rows × 123 columns

\n", "
" ], "text/plain": [ " additive_*C3_NMR_shift additive_*C3_electrostatic_charge \\\n", "0 143.12 0.223 \n", "1 143.12 0.223 \n", "2 143.12 0.223 \n", "3 143.12 0.223 \n", "4 143.12 0.223 \n", "\n", " additive_*C4_NMR_shift additive_*C4_electrostatic_charge \\\n", "0 93.06 -0.447 \n", "1 93.06 -0.447 \n", "2 93.06 -0.447 \n", "3 93.06 -0.447 \n", "4 93.06 -0.447 \n", "\n", " additive_*C5_NMR_shift additive_*C5_electrostatic_charge \\\n", "0 162.34 0.292 \n", "1 162.34 0.292 \n", "2 162.34 0.292 \n", "3 162.34 0.292 \n", "4 162.34 0.292 \n", "\n", " additive_*N1_electrostatic_charge additive_*O1_electrostatic_charge \\\n", "0 -0.334 -0.057 \n", "1 -0.334 -0.057 \n", "2 -0.334 -0.057 \n", "3 -0.334 -0.057 \n", "4 -0.334 -0.057 \n", "\n", " additive_E_HOMO additive_E_LUMO ... ligand_V6_intensity \\\n", "0 -0.2317 -0.0487 ... 4.414 \n", "1 -0.2317 -0.0487 ... 4.414 \n", "2 -0.2317 -0.0487 ... 4.414 \n", "3 -0.2317 -0.0487 ... 4.414 \n", "4 -0.2317 -0.0487 ... 4.414 \n", "\n", " ligand_V7_frequency ligand_V7_intensity ligand_V8_frequency \\\n", "0 3026.561 16.577 3043.097 \n", "1 3026.561 16.577 3043.097 \n", "2 3026.561 16.577 3043.097 \n", "3 3026.561 16.577 3043.097 \n", "4 3026.561 16.577 3043.097 \n", "\n", " ligand_V8_intensity ligand_V9_frequency ligand_V9_intensity \\\n", "0 18.145 3064.344 38.21 \n", "1 18.145 3064.344 38.21 \n", "2 18.145 3064.344 38.21 \n", "3 18.145 3064.344 38.21 \n", "4 18.145 3064.344 38.21 \n", "\n", " ligand_dipole_moment plate row \n", "0 1.212924 1 1 \n", "1 1.212924 1 1 \n", "2 1.212924 1 1 \n", "3 1.212924 1 1 \n", "4 1.212924 1 1 \n", "\n", "[5 rows x 123 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "descriptors.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Join on common columns\n", "\n", "# Pull out just what we need\n", "plates_join = plates[[\"plate\", \"row\", \"col\", \"yield\"]]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "dataset = pd.merge(descriptors, plates, on=[\"plate\", \"row\", \"col\"])" ] }, { "cell_type": "code", "execution_count": 8, "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", "
additive_*C3_NMR_shiftadditive_*C3_electrostatic_chargeadditive_*C4_NMR_shiftadditive_*C4_electrostatic_chargeadditive_*C5_NMR_shiftadditive_*C5_electrostatic_chargeadditive_*N1_electrostatic_chargeadditive_*O1_electrostatic_chargeadditive_E_HOMOadditive_E_LUMO...ligand_cas_numberligand_smilesaryl_halide_numberaryl_halidearyl_halide_smilesadditive_numberadditiveadditive_smilesproduct_smilesyield
0143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...1.01-chloro-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(Cl)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc126.888615
1143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...2.01-bromo-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(Br)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc124.063224
2143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...3.01-iodo-4-(trifluoromethyl)benzeneFC(F)(F)c1ccc(I)cc1NaNNaNNaNCc1ccc(Nc2ccc(C(F)(F)F)cc2)cc147.515821
3143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...4.01-chloro-4-methoxybenzeneCOc1ccc(Cl)cc1NaNNaNNaNCOc1ccc(Nc2ccc(C)cc2)cc12.126831
4143.120.22393.06-0.447162.340.292-0.334-0.057-0.2317-0.0487...564483-18-7CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)...5.01-bromo-4-methoxybenzeneCOc1ccc(Br)cc1NaNNaNNaNCOc1ccc(Nc2ccc(C)cc2)cc147.586354
\n", "

5 rows × 137 columns

\n", "
" ], "text/plain": [ " additive_*C3_NMR_shift additive_*C3_electrostatic_charge \\\n", "0 143.12 0.223 \n", "1 143.12 0.223 \n", "2 143.12 0.223 \n", "3 143.12 0.223 \n", "4 143.12 0.223 \n", "\n", " additive_*C4_NMR_shift additive_*C4_electrostatic_charge \\\n", "0 93.06 -0.447 \n", "1 93.06 -0.447 \n", "2 93.06 -0.447 \n", "3 93.06 -0.447 \n", "4 93.06 -0.447 \n", "\n", " additive_*C5_NMR_shift additive_*C5_electrostatic_charge \\\n", "0 162.34 0.292 \n", "1 162.34 0.292 \n", "2 162.34 0.292 \n", "3 162.34 0.292 \n", "4 162.34 0.292 \n", "\n", " additive_*N1_electrostatic_charge additive_*O1_electrostatic_charge \\\n", "0 -0.334 -0.057 \n", "1 -0.334 -0.057 \n", "2 -0.334 -0.057 \n", "3 -0.334 -0.057 \n", "4 -0.334 -0.057 \n", "\n", " additive_E_HOMO additive_E_LUMO ... ligand_cas_number \\\n", "0 -0.2317 -0.0487 ... 564483-18-7 \n", "1 -0.2317 -0.0487 ... 564483-18-7 \n", "2 -0.2317 -0.0487 ... 564483-18-7 \n", "3 -0.2317 -0.0487 ... 564483-18-7 \n", "4 -0.2317 -0.0487 ... 564483-18-7 \n", "\n", " ligand_smiles aryl_halide_number \\\n", "0 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 1.0 \n", "1 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 2.0 \n", "2 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 3.0 \n", "3 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 4.0 \n", "4 CC(C)C1=CC(C(C)C)=CC(C(C)C)=C1C2=C(P(C3CCCCC3)... 5.0 \n", "\n", " aryl_halide aryl_halide_smiles additive_number \\\n", "0 1-chloro-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(Cl)cc1 NaN \n", "1 1-bromo-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(Br)cc1 NaN \n", "2 1-iodo-4-(trifluoromethyl)benzene FC(F)(F)c1ccc(I)cc1 NaN \n", "3 1-chloro-4-methoxybenzene COc1ccc(Cl)cc1 NaN \n", "4 1-bromo-4-methoxybenzene COc1ccc(Br)cc1 NaN \n", "\n", " additive additive_smiles product_smiles yield \n", "0 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 26.888615 \n", "1 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 24.063224 \n", "2 NaN NaN Cc1ccc(Nc2ccc(C(F)(F)F)cc2)cc1 47.515821 \n", "3 NaN NaN COc1ccc(Nc2ccc(C)cc2)cc1 2.126831 \n", "4 NaN NaN COc1ccc(Nc2ccc(C)cc2)cc1 47.586354 \n", "\n", "[5 rows x 137 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using SciKitLearn to Fit" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "X = dataset[descriptors.columns].to_numpy()\n", "Y = dataset[\"yield\"].to_numpy()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "sc = StandardScaler()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "X_fit = sc.fit_transform(X)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestRegressor" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on class RandomForestRegressor in module sklearn.ensemble._forest:\n", "\n", "class RandomForestRegressor(ForestRegressor)\n", " | RandomForestRegressor(n_estimators=100, *, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)\n", " | \n", " | A random forest regressor.\n", " | \n", " | A random forest is a meta estimator that fits a number of classifying\n", " | decision trees on various sub-samples of the dataset and uses averaging\n", " | to improve the predictive accuracy and control over-fitting.\n", " | The sub-sample size is controlled with the `max_samples` parameter if\n", " | `bootstrap=True` (default), otherwise the whole dataset is used to build\n", " | each tree.\n", " | \n", " | Read more in the :ref:`User Guide `.\n", " | \n", " | Parameters\n", " | ----------\n", " | n_estimators : int, default=100\n", " | The number of trees in the forest.\n", " | \n", " | .. versionchanged:: 0.22\n", " | The default value of ``n_estimators`` changed from 10 to 100\n", " | in 0.22.\n", " | \n", " | criterion : {\"mse\", \"mae\"}, default=\"mse\"\n", " | The function to measure the quality of a split. Supported criteria\n", " | are \"mse\" for the mean squared error, which is equal to variance\n", " | reduction as feature selection criterion, and \"mae\" for the mean\n", " | absolute error.\n", " | \n", " | .. versionadded:: 0.18\n", " | Mean Absolute Error (MAE) criterion.\n", " | \n", " | max_depth : int, default=None\n", " | The maximum depth of the tree. If None, then nodes are expanded until\n", " | all leaves are pure or until all leaves contain less than\n", " | min_samples_split samples.\n", " | \n", " | min_samples_split : int or float, default=2\n", " | The minimum number of samples required to split an internal node:\n", " | \n", " | - If int, then consider `min_samples_split` as the minimum number.\n", " | - If float, then `min_samples_split` is a fraction and\n", " | `ceil(min_samples_split * n_samples)` are the minimum\n", " | number of samples for each split.\n", " | \n", " | .. versionchanged:: 0.18\n", " | Added float values for fractions.\n", " | \n", " | min_samples_leaf : int or float, default=1\n", " | The minimum number of samples required to be at a leaf node.\n", " | A split point at any depth will only be considered if it leaves at\n", " | least ``min_samples_leaf`` training samples in each of the left and\n", " | right branches. This may have the effect of smoothing the model,\n", " | especially in regression.\n", " | \n", " | - If int, then consider `min_samples_leaf` as the minimum number.\n", " | - If float, then `min_samples_leaf` is a fraction and\n", " | `ceil(min_samples_leaf * n_samples)` are the minimum\n", " | number of samples for each node.\n", " | \n", " | .. versionchanged:: 0.18\n", " | Added float values for fractions.\n", " | \n", " | min_weight_fraction_leaf : float, default=0.0\n", " | The minimum weighted fraction of the sum total of weights (of all\n", " | the input samples) required to be at a leaf node. Samples have\n", " | equal weight when sample_weight is not provided.\n", " | \n", " | max_features : {\"auto\", \"sqrt\", \"log2\"}, int or float, default=\"auto\"\n", " | The number of features to consider when looking for the best split:\n", " | \n", " | - If int, then consider `max_features` features at each split.\n", " | - If float, then `max_features` is a fraction and\n", " | `round(max_features * n_features)` features are considered at each\n", " | split.\n", " | - If \"auto\", then `max_features=n_features`.\n", " | - If \"sqrt\", then `max_features=sqrt(n_features)`.\n", " | - If \"log2\", then `max_features=log2(n_features)`.\n", " | - If None, then `max_features=n_features`.\n", " | \n", " | Note: the search for a split does not stop until at least one\n", " | valid partition of the node samples is found, even if it requires to\n", " | effectively inspect more than ``max_features`` features.\n", " | \n", " | max_leaf_nodes : int, default=None\n", " | Grow trees with ``max_leaf_nodes`` in best-first fashion.\n", " | Best nodes are defined as relative reduction in impurity.\n", " | If None then unlimited number of leaf nodes.\n", " | \n", " | min_impurity_decrease : float, default=0.0\n", " | A node will be split if this split induces a decrease of the impurity\n", " | greater than or equal to this value.\n", " | \n", " | The weighted impurity decrease equation is the following::\n", " | \n", " | N_t / N * (impurity - N_t_R / N_t * right_impurity\n", " | - N_t_L / N_t * left_impurity)\n", " | \n", " | where ``N`` is the total number of samples, ``N_t`` is the number of\n", " | samples at the current node, ``N_t_L`` is the number of samples in the\n", " | left child, and ``N_t_R`` is the number of samples in the right child.\n", " | \n", " | ``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum,\n", " | if ``sample_weight`` is passed.\n", " | \n", " | .. versionadded:: 0.19\n", " | \n", " | min_impurity_split : float, default=None\n", " | Threshold for early stopping in tree growth. A node will split\n", " | if its impurity is above the threshold, otherwise it is a leaf.\n", " | \n", " | .. deprecated:: 0.19\n", " | ``min_impurity_split`` has been deprecated in favor of\n", " | ``min_impurity_decrease`` in 0.19. The default value of\n", " | ``min_impurity_split`` has changed from 1e-7 to 0 in 0.23 and it\n", " | will be removed in 1.0 (renaming of 0.25).\n", " | Use ``min_impurity_decrease`` instead.\n", " | \n", " | bootstrap : bool, default=True\n", " | Whether bootstrap samples are used when building trees. If False, the\n", " | whole dataset is used to build each tree.\n", " | \n", " | oob_score : bool, default=False\n", " | Whether to use out-of-bag samples to estimate the generalization score.\n", " | Only available if bootstrap=True.\n", " | \n", " | n_jobs : int, default=None\n", " | The number of jobs to run in parallel. :meth:`fit`, :meth:`predict`,\n", " | :meth:`decision_path` and :meth:`apply` are all parallelized over the\n", " | trees. ``None`` means 1 unless in a :obj:`joblib.parallel_backend`\n", " | context. ``-1`` means using all processors. See :term:`Glossary\n", " | ` for more details.\n", " | \n", " | random_state : int, RandomState instance or None, default=None\n", " | Controls both the randomness of the bootstrapping of the samples used\n", " | when building trees (if ``bootstrap=True``) and the sampling of the\n", " | features to consider when looking for the best split at each node\n", " | (if ``max_features < n_features``).\n", " | See :term:`Glossary ` for details.\n", " | \n", " | verbose : int, default=0\n", " | Controls the verbosity when fitting and predicting.\n", " | \n", " | warm_start : bool, default=False\n", " | When set to ``True``, reuse the solution of the previous call to fit\n", " | and add more estimators to the ensemble, otherwise, just fit a whole\n", " | new forest. See :term:`the Glossary `.\n", " | \n", " | ccp_alpha : non-negative float, default=0.0\n", " | Complexity parameter used for Minimal Cost-Complexity Pruning. The\n", " | subtree with the largest cost complexity that is smaller than\n", " | ``ccp_alpha`` will be chosen. By default, no pruning is performed. See\n", " | :ref:`minimal_cost_complexity_pruning` for details.\n", " | \n", " | .. versionadded:: 0.22\n", " | \n", " | max_samples : int or float, default=None\n", " | If bootstrap is True, the number of samples to draw from X\n", " | to train each base estimator.\n", " | \n", " | - If None (default), then draw `X.shape[0]` samples.\n", " | - If int, then draw `max_samples` samples.\n", " | - If float, then draw `max_samples * X.shape[0]` samples. Thus,\n", " | `max_samples` should be in the interval `(0, 1)`.\n", " | \n", " | .. versionadded:: 0.22\n", " | \n", " | Attributes\n", " | ----------\n", " | base_estimator_ : DecisionTreeRegressor\n", " | The child estimator template used to create the collection of fitted\n", " | sub-estimators.\n", " | \n", " | estimators_ : list of DecisionTreeRegressor\n", " | The collection of fitted sub-estimators.\n", " | \n", " | feature_importances_ : ndarray of shape (n_features,)\n", " | The impurity-based feature importances.\n", " | The higher, the more important the feature.\n", " | The importance of a feature is computed as the (normalized)\n", " | total reduction of the criterion brought by that feature. It is also\n", " | known as the Gini importance.\n", " | \n", " | Warning: impurity-based feature importances can be misleading for\n", " | high cardinality features (many unique values). See\n", " | :func:`sklearn.inspection.permutation_importance` as an alternative.\n", " | \n", " | n_features_ : int\n", " | The number of features when ``fit`` is performed.\n", " | \n", " | n_outputs_ : int\n", " | The number of outputs when ``fit`` is performed.\n", " | \n", " | oob_score_ : float\n", " | Score of the training dataset obtained using an out-of-bag estimate.\n", " | This attribute exists only when ``oob_score`` is True.\n", " | \n", " | oob_prediction_ : ndarray of shape (n_samples,)\n", " | Prediction computed with out-of-bag estimate on the training set.\n", " | This attribute exists only when ``oob_score`` is True.\n", " | \n", " | See Also\n", " | --------\n", " | DecisionTreeRegressor, ExtraTreesRegressor\n", " | \n", " | Notes\n", " | -----\n", " | The default values for the parameters controlling the size of the trees\n", " | (e.g. ``max_depth``, ``min_samples_leaf``, etc.) lead to fully grown and\n", " | unpruned trees which can potentially be very large on some data sets. To\n", " | reduce memory consumption, the complexity and size of the trees should be\n", " | controlled by setting those parameter values.\n", " | \n", " | The features are always randomly permuted at each split. Therefore,\n", " | the best found split may vary, even with the same training data,\n", " | ``max_features=n_features`` and ``bootstrap=False``, if the improvement\n", " | of the criterion is identical for several splits enumerated during the\n", " | search of the best split. To obtain a deterministic behaviour during\n", " | fitting, ``random_state`` has to be fixed.\n", " | \n", " | The default value ``max_features=\"auto\"`` uses ``n_features``\n", " | rather than ``n_features / 3``. The latter was originally suggested in\n", " | [1], whereas the former was more recently justified empirically in [2].\n", " | \n", " | References\n", " | ----------\n", " | .. [1] L. Breiman, \"Random Forests\", Machine Learning, 45(1), 5-32, 2001.\n", " | \n", " | .. [2] P. Geurts, D. Ernst., and L. Wehenkel, \"Extremely randomized\n", " | trees\", Machine Learning, 63(1), 3-42, 2006.\n", " | \n", " | Examples\n", " | --------\n", " | >>> from sklearn.ensemble import RandomForestRegressor\n", " | >>> from sklearn.datasets import make_regression\n", " | >>> X, y = make_regression(n_features=4, n_informative=2,\n", " | ... random_state=0, shuffle=False)\n", " | >>> regr = RandomForestRegressor(max_depth=2, random_state=0)\n", " | >>> regr.fit(X, y)\n", " | RandomForestRegressor(...)\n", " | >>> print(regr.predict([[0, 0, 0, 0]]))\n", " | [-8.32987858]\n", " | \n", " | Method resolution order:\n", " | RandomForestRegressor\n", " | ForestRegressor\n", " | sklearn.base.RegressorMixin\n", " | BaseForest\n", " | sklearn.base.MultiOutputMixin\n", " | sklearn.ensemble._base.BaseEnsemble\n", " | sklearn.base.MetaEstimatorMixin\n", " | sklearn.base.BaseEstimator\n", " | builtins.object\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, n_estimators=100, *, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)\n", " | Initialize self. See help(type(self)) for accurate signature.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes defined here:\n", " | \n", " | __abstractmethods__ = frozenset()\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from ForestRegressor:\n", " | \n", " | predict(self, X)\n", " | Predict regression target for X.\n", " | \n", " | The predicted regression target of an input sample is computed as the\n", " | mean predicted regression targets of the trees in the forest.\n", " | \n", " | Parameters\n", " | ----------\n", " | X : {array-like, sparse matrix} of shape (n_samples, n_features)\n", " | The input samples. Internally, its dtype will be converted to\n", " | ``dtype=np.float32``. If a sparse matrix is provided, it will be\n", " | converted into a sparse ``csr_matrix``.\n", " | \n", " | Returns\n", " | -------\n", " | y : ndarray of shape (n_samples,) or (n_samples, n_outputs)\n", " | The predicted values.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from sklearn.base.RegressorMixin:\n", " | \n", " | score(self, X, y, sample_weight=None)\n", " | Return the coefficient of determination :math:`R^2` of the\n", " | prediction.\n", " | \n", " | The coefficient :math:`R^2` is defined as :math:`(1 - \\frac{u}{v})`,\n", " | where :math:`u` is the residual sum of squares ``((y_true - y_pred)\n", " | ** 2).sum()`` and :math:`v` is the total sum of squares ``((y_true -\n", " | y_true.mean()) ** 2).sum()``. The best possible score is 1.0 and it\n", " | can be negative (because the model can be arbitrarily worse). A\n", " | constant model that always predicts the expected value of `y`,\n", " | disregarding the input features, would get a :math:`R^2` score of\n", " | 0.0.\n", " | \n", " | Parameters\n", " | ----------\n", " | X : array-like of shape (n_samples, n_features)\n", " | Test samples. For some estimators this may be a precomputed\n", " | kernel matrix or a list of generic objects instead with shape\n", " | ``(n_samples, n_samples_fitted)``, where ``n_samples_fitted``\n", " | is the number of samples used in the fitting for the estimator.\n", " | \n", " | y : array-like of shape (n_samples,) or (n_samples, n_outputs)\n", " | True values for `X`.\n", " | \n", " | sample_weight : array-like of shape (n_samples,), default=None\n", " | Sample weights.\n", " | \n", " | Returns\n", " | -------\n", " | score : float\n", " | :math:`R^2` of ``self.predict(X)`` wrt. `y`.\n", " | \n", " | Notes\n", " | -----\n", " | The :math:`R^2` score used when calling ``score`` on a regressor uses\n", " | ``multioutput='uniform_average'`` from version 0.23 to keep consistent\n", " | with default value of :func:`~sklearn.metrics.r2_score`.\n", " | This influences the ``score`` method of all the multioutput\n", " | regressors (except for\n", " | :class:`~sklearn.multioutput.MultiOutputRegressor`).\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors inherited from sklearn.base.RegressorMixin:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from BaseForest:\n", " | \n", " | apply(self, X)\n", " | Apply trees in the forest to X, return leaf indices.\n", " | \n", " | Parameters\n", " | ----------\n", " | X : {array-like, sparse matrix} of shape (n_samples, n_features)\n", " | The input samples. Internally, its dtype will be converted to\n", " | ``dtype=np.float32``. If a sparse matrix is provided, it will be\n", " | converted into a sparse ``csr_matrix``.\n", " | \n", " | Returns\n", " | -------\n", " | X_leaves : ndarray of shape (n_samples, n_estimators)\n", " | For each datapoint x in X and for each tree in the forest,\n", " | return the index of the leaf x ends up in.\n", " | \n", " | decision_path(self, X)\n", " | Return the decision path in the forest.\n", " | \n", " | .. versionadded:: 0.18\n", " | \n", " | Parameters\n", " | ----------\n", " | X : {array-like, sparse matrix} of shape (n_samples, n_features)\n", " | The input samples. Internally, its dtype will be converted to\n", " | ``dtype=np.float32``. If a sparse matrix is provided, it will be\n", " | converted into a sparse ``csr_matrix``.\n", " | \n", " | Returns\n", " | -------\n", " | indicator : sparse matrix of shape (n_samples, n_nodes)\n", " | Return a node indicator matrix where non zero elements indicates\n", " | that the samples goes through the nodes. The matrix is of CSR\n", " | format.\n", " | \n", " | n_nodes_ptr : ndarray of shape (n_estimators + 1,)\n", " | The columns from indicator[n_nodes_ptr[i]:n_nodes_ptr[i+1]]\n", " | gives the indicator value for the i-th estimator.\n", " | \n", " | fit(self, X, y, sample_weight=None)\n", " | Build a forest of trees from the training set (X, y).\n", " | \n", " | Parameters\n", " | ----------\n", " | X : {array-like, sparse matrix} of shape (n_samples, n_features)\n", " | The training input samples. Internally, its dtype will be converted\n", " | to ``dtype=np.float32``. If a sparse matrix is provided, it will be\n", " | converted into a sparse ``csc_matrix``.\n", " | \n", " | y : array-like of shape (n_samples,) or (n_samples, n_outputs)\n", " | The target values (class labels in classification, real numbers in\n", " | regression).\n", " | \n", " | sample_weight : array-like of shape (n_samples,), default=None\n", " | Sample weights. If None, then samples are equally weighted. Splits\n", " | that would create child nodes with net zero or negative weight are\n", " | ignored while searching for a split in each node. In the case of\n", " | classification, splits are also ignored if they would result in any\n", " | single class carrying a negative weight in either child node.\n", " | \n", " | Returns\n", " | -------\n", " | self : object\n", " | \n", " | ----------------------------------------------------------------------\n", " | Readonly properties inherited from BaseForest:\n", " | \n", " | feature_importances_\n", " | The impurity-based feature importances.\n", " | \n", " | The higher, the more important the feature.\n", " | The importance of a feature is computed as the (normalized)\n", " | total reduction of the criterion brought by that feature. It is also\n", " | known as the Gini importance.\n", " | \n", " | Warning: impurity-based feature importances can be misleading for\n", " | high cardinality features (many unique values). See\n", " | :func:`sklearn.inspection.permutation_importance` as an alternative.\n", " | \n", " | Returns\n", " | -------\n", " | feature_importances_ : ndarray of shape (n_features,)\n", " | The values of this array sum to 1, unless all trees are single node\n", " | trees consisting of only the root node, in which case it will be an\n", " | array of zeros.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from sklearn.ensemble._base.BaseEnsemble:\n", " | \n", " | __getitem__(self, index)\n", " | Return the index'th estimator in the ensemble.\n", " | \n", " | __iter__(self)\n", " | Return iterator over estimators in the ensemble.\n", " | \n", " | __len__(self)\n", " | Return the number of estimators in the ensemble.\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data and other attributes inherited from sklearn.ensemble._base.BaseEnsemble:\n", " | \n", " | __annotations__ = {'_required_parameters': typing.List[str]}\n", " | \n", " | ----------------------------------------------------------------------\n", " | Methods inherited from sklearn.base.BaseEstimator:\n", " | \n", " | __getstate__(self)\n", " | \n", " | __repr__(self, N_CHAR_MAX=700)\n", " | Return repr(self).\n", " | \n", " | __setstate__(self, state)\n", " | \n", " | get_params(self, deep=True)\n", " | Get parameters for this estimator.\n", " | \n", " | Parameters\n", " | ----------\n", " | deep : bool, default=True\n", " | If True, will return the parameters for this estimator and\n", " | contained subobjects that are estimators.\n", " | \n", " | Returns\n", " | -------\n", " | params : dict\n", " | Parameter names mapped to their values.\n", " | \n", " | set_params(self, **params)\n", " | Set the parameters of this estimator.\n", " | \n", " | The method works on simple estimators as well as on nested objects\n", " | (such as :class:`~sklearn.pipeline.Pipeline`). The latter have\n", " | parameters of the form ``__`` so that it's\n", " | possible to update each component of a nested object.\n", " | \n", " | Parameters\n", " | ----------\n", " | **params : dict\n", " | Estimator parameters.\n", " | \n", " | Returns\n", " | -------\n", " | self : estimator instance\n", " | Estimator instance.\n", "\n" ] } ], "source": [ "help(RandomForestRegressor)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor()" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regressor = RandomForestRegressor()\n", "regressor.fit(X_fit, Y)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "y_pred = regressor.predict(X_fit)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAjP0lEQVR4nO3db3Bc5ZXn8e/p1jVuQYLkxLBGYExSFCwegp2oEhhvbQUYQhICaEgIpGCL3aLCm9nNQFJMzMYV7C2yeNezQF7MTBXJZIZdPMQEKGFCKiQFZKeWDczIkYnjYC9JCAbhAc1gMVNIgbZ09kV3y63Wvf3/z723f58ql6z+o36uMKefPs95zmPujoiIpEum1wMQEZH2U3AXEUkhBXcRkRRScBcRSSEFdxGRFBro9QAA3v/+9/u6det6PQwRkUTZs2fPP7r76rD7agZ3M/sO8BngDXf/veJtq4BdwDrgt8Dn3f1I8b7bgBuBeeBL7v5ErddYt24dExMTdV2MiIgUmNnLUffVk5b5a+CTFbdtBp509zOBJ4vfY2bnANcC64vP+XMzyzYxZhERaUHN4O7ufwu8WXHzlcB9xb/fB4yV3f5dd3/H3V8CfgV8tD1DFRGRejW7oHqyux8GKH49qXj7CPBK2eNeLd4mIiJd1O5qGQu5LbS/gZndZGYTZjYxPT3d5mGIiPS3ZoP762a2BqD49Y3i7a8Cp5U97lTgtbAf4O73uvuou4+uXh262CsiIk1qthRyN3ADsL349dGy2//GzO4CTgHOBP6u1UGKiCTVdd/6Kc/8+tiy5aYPrmLnFy/o+OvWnLmb2QPAT4GzzOxVM7uRQlC/xMxeBC4pfo+77wceBH4J/BD4I3ef79TgRUTi7JK7frIksAM88+s3ue5bP+34a1scWv6Ojo666txFJE3GJ6e4edfeyPtHhnK8NjPHKUM5br30LMY2Nl57YmZ73H007L5Y7FAVEUmbHU8crHr/1Mzc4tfbHtkH0FSAj6LeMiIiHfBaMXjXYy4/X/PNoFGauYuI1Gl8coodTxxckk4Blt02tnGEU4Zyi7PzejTy2Hoo5y4iUofxySlue2Qfc/ljNSJB1sAhv3AsjgYZ44SVAxyZzWMs3+iTARZCfr4Bd1+zoaHUTLWcu9IyIiJ12PHEwSWBHSA/70sCOxQC/ZHZPFAI7KWdnSNDOe65ZgN3XbMhcrdnO1MzCu4iInVoNm3iFAL7M5svAgoBPCpf0kievhbl3EVEqtgyvo+dzx1q6We8NjMXmtapdMpQrqXXKafgLiISYcv4Pu5/trXADoWgHZbWKZcLsosLtO2g4C4iUlRZDdOuNMnb7xxlZi4fef9ICxuZoii4i4iwvBqm0Rx7WGVMycxceOUMLM3Ht5OCu4j0pcpZ+tvvHK2aNqklF2SYzReKHM2gssq8VDnjS57T3lRMOQV3Eekr45NTbHts/2K5IrRnA1EpsMPywL54O+3pKVMPBXcR6Rv1VKx0UqdSMGFU5y4ifaNWxUondTIFE0YzdxHpG+3cJFTL8GDA4IqBrqRgwii4i0jfaLSZVytuv3x9V4N5JaVlRKRvrHtf+3aAVnP8imxPAzto5i4iKVVZ6rjufbllR951SpDt/bxZwV1EUidsQ1Lb+6UTvWnprSq7UbtFwV1EEq/dG5KqMQq5+wvPXs3OZw+FBvh2NgBrloK7iCRSKaBPzcwtmUV3csE0rE69MsB3u+QxSu8TQyIiDSqlXUqBvBvnyQVZWxa07xg7l7uv2cDIUA6jEPzvvOrcni+mgmbuIpJAvdiMdPyKgdCgPbZxJBbBvJJm7iKSON2qVS8Xh0XSRii4i4jUIQ6LpI1QWkZEYq2yEubofG96w8RhkbQRCu4iEkvjk1Ns3b1/yQlGvUjHAAzlgljm1atRcBeR2Ol1a95yuSDL1ivW93oYDVNwF5HY6WVrXoCsGQvuPenm2C4K7iISC2EnJPXKgjsvbb+s18NoiYK7iPTclvF93P/soV4PY1HSKmPCKLiLSM8Ucus/Z67s/NFei0v7gFa1VOduZreY2X4z+4WZPWBmK81slZn92MxeLH4dbtdgRSQ9xienuPV7z/c8sA/lgli2D2hV0zN3MxsBvgSc4+5zZvYgcC1wDvCku283s83AZuCrbRmtiCRaec06dKcnDEAuyHB03skvLH3FIGtsvaK3JyZ1Sqs7VAeAnJkNAIPAa8CVwH3F++8Dxlp8DRFJgfJmX073AjsU2vSesHLpXHZ4MGDH585LZWCHFoK7u08BfwocAg4Db7n7j4CT3f1w8TGHgZPCnm9mN5nZhJlNTE9PNzsMEUmIbY/t71l542x+YUkVTi7I9vyM005rOrgXc+lXAmcApwDHm9n19T7f3e9191F3H129enWzwxCRBBifnIpFiWPJXH6eHU8c7PUwOqqVapk/AF5y92kAM3sE+H3gdTNb4+6HzWwN8EYbxikiCVN+mEYcvRbTcbVLK8H9EHC+mQ0Cc8DFwATwNnADsL349dFWBykiybJlfF/kEXTdNDwYAIR+akhDLXs1TQd3d3/OzB4CfgYcBSaBe4ETgAfN7EYKbwBXt2OgItI5lZ0XG9lyX/ncC89eHZsNSTOzeU7MBQRZIz9/7K0mLbXs1Zh7r99bYXR01CcmJno9DJG+FNakKxdk66r3jlODr2qCjHHCygFmZvOJ7hdTycz2uPto2H3aoSrS58KadJUWHCsDYOUsffbdo7EP7AD5BWdwxQCTX/9Er4fSNQruIn0uamGx8vbKWXpcF0qjpH0BtZKO2RPpc1ELi5W3b93duzr1dkj7AmolBXeRPnfrpWeRC7JLbqtccByfnFpyIlLS9MMCaiWlZUT6XCmvXq1aZuvu/b0aXtOMQouDkRQtoDZCwV0k5eopcxzbOBIZ/LaM74vNrL1UxQMsq9JJa0VMsxTcRVIsbBH0tkf2AYQGvvI3gqHBgN/l53vekhcKs/CwgN1sbX4/UHAXSbFGyxzL3wji0gvmuIEMB+/41LLbq33aEAV3kVSrt8wRen8odZSMwabtT2mG3iAFd5EUO2UoF1qPnjHjjM2PLwZLiG/d+lx+YXFstdJKcoyCu0iCVVssHZ+cYvbdo6HPmy+2HZmamePLu/aSzVrXxtyqqLSSLKXgLpJQ1RZLYXk1SZQFYGG+9z2mGjE1M8em7U8pRVOFgrtIQlVbLC39PUlyQZbPfmSEpw9M89rMHBmzxU8YYRqp/OnHXL2Cu0hCRS2WxjV3Xkr8lOf5qwXfMzY/XvNn1lv504+5egV3kYSKWiwt7cyMm+vOX8vo6avY8cRBbtm1t+ZsOur6KtVb+dNvuXr1lhFJqLCeMHEN7ADff/4wtz2yj6mZOZxjs+nxyanQx4ddX5iwhmCNlICmlYK7SEKNbRzhzqvOZWQoh1HooRLXwA4wM5evukZQqfL6hgcDgszSqh4DLjx79bLn1tvpMs0U3EUSbGzjCBeevZqMWWxz7bVUG/fYxhGe2XwRL22/jMmvf4JrPnoa5eHdgYf3TC2b/dfT6TLtFNxFEmzL+D7uf/ZQ1aqSJIhKzVR6+sD0sk8nYbP/sE819RwbmCZaUBVJqPHJqdgcRN2qm3ftZdtj+7n98vVVA3AjufR+7z2j4C6SQKVSvzgaygWYNd547Mhsfsk1hZVJRlXQ9FMuvV4K7iIJFNcmX1BYOB0eDMgYLDSYLZrLz7N1937eOboQWqN+66VnLdt522+59HopuIskRPmOy7hn2I/M5gmyxsqMMVvsBz+UC/jMeWt44LlXqq4RhB0MUsqrP7P5IkB93Ouh4C4SQ5Vb5y88ezUP75mK7Ww9TH7eOek9K/llMSCXjJ6+qu6+N+VKefV+z6XXS8FdpIfC+p8Ay7bO73z2UOxn62GiFjqhcC5r5Sw9F2RZGWRC8/XKqzdGwV2kR7aM71sStEu55ZVBZtmsNq6BfUXWOP64gcjF06iAXJp91/PmBsqrN0PBXaRLxienQmer5eby84lKvWQzGW6/fD3QXECulmJRXr01Cu4iXTA+OcWt33uefKPlIzHXqYVO5dVbp+Au0gU7njhYd2AfygX881yehQ6PqV2mtNAZS2o/INIFjXQjnElQYIdC86562wdI9yi4i3RBmis9HCI7O0rvKC0j0mHVDqpOi9Ink34/2i5OWpq5m9mQmT1kZgfM7AUzu8DMVpnZj83sxeLX4XYNViRpSj1gGu2zEkdBxhgeDELvOzEXLF5r+WEct+zay5bxePbASbtWZ+7fBH7o7p8zsxXAIPCfgSfdfbuZbQY2A19t8XVEeq7eWWnpcUntrx5lx9XnAYRW/bz97lG2PbY/tD5/57OHGD19VV0zeM3828e8yT7QZvZe4HngA172Q8zsIPBxdz9sZmuAn7h71WLX0dFRn5iYaGocIt1QeeAyFGayJ6wcYGY2X3UDTlIMDwYMrhgIfVMaGcotljtu/C8/aviTSPnzo4T9jnNBtu/6sDfCzPa4+2jYfa2kZT4ATAN/ZWaTZvZtMzseONndDwMUv54UMaibzGzCzCamp6dbGIZI54V1YcwvOEdm80vOA/3qwz9PZGAPssbtl68PPbIOlh5lN9NEiqmeaqFqh1pL41oJ7gPAh4G/cPeNwNsUUjB1cfd73X3U3UdXrw7/ByUSF/UEp7n8PO8cTVIRY8HIUI4dnzuPsY0jPH0gfKJVfnszlT/1PEeHWrdXK8H9VeBVd3+u+P1DFIL968V0DMWvb7Q2RJHeS2spY9aMZzZftJj2qCfAhp1PWk29fWF0qHV7NR3c3f0fgFfMrPRf7WLgl8Bu4IbibTcAj7Y0QpEYaDSgJUVlX/V6AuzYxhE++5HqOfBmzi7Vodbt1Wq1zH8CdhYrZX4D/AcKbxgPmtmNwCHg6hZfQ6TnxjaOMPHym4lpvVvvwRgjFcG83pOOotI3pZ9Za/E0TOkNQNUy7dFScHf3vUDYSu3FrfxckbgZn5zigedeSURgzwVZtl5R6NT49IHpyJLMIGtcePZqNm1/akkwvfOqc2sG2Gp58FZm2upP0z7aoSpSQ6lEr9oMOE5KKZNaJZkDGVtyulOp4ufOq86tOfOOOqh6KBcoOMeEestIXxqfnGLT9qc4Y/PjbNr+VNXGV3E+jDrMw3sKfeNrjXkuv9B06WFUfrz0iUF6TzN36TuVm2VKM1YgdNaZtJ2mrR74UU/pofLj8afgLn2n2maZ8uBUOjkpTjZ9cBU/O/RWy58k2nFWqfLj8aa0jPSdemq5S7P7akfidVsG2PnFC7jzqnOXVbnUw4pfS+WJt1++niBrSx4TZE2lhymhmbv0najFwPIZaz05627LZo3xyaklh0tve2x/XX1eRkLSJuOTU8tP3m5wzViNvuJLM3fpO7U2y4xPTsVqxl6Sn/fFxc5GWgmX6s4rg27Y0X/5Ba+7l0tYi9/bHtmnU5liQjN36Rvls8wTc8Fizjlrxlx+nm2P7Wfr7v2xDOwlpU8c9VbwBJnoNEurvVzqXbuQ3lBwl75QWSEzM5cnyBpBxhZnr0k4UKN0Xmm9AfiEldH/i9eTnqpGjb7iTWkZ6QuhLXvnfVlaIu5K55VGBeChXLAk5XRkNh+ZKmm1l4safcWbgrvERiMbi+p9fOkxSatVr+a1mbnIwGxGzY1Jpd/JLbv2ctxAhuHBoOEmX6BGX3GntIzEQqMbi+p5fNjJPmlwylAuchPRLbv2hj6n/ADryvRULshy9zUbGs6TayNTvDV9zF476Zg9iZpdZ81YcF8WOKIeX96RMG0zdqh97Fyt30s9vzdJjmrH7GnmLrEQtQhXatZVmplPvPxm1U6H5T8nbQt7lbXqlTXmF569mrffObrseeWpEi2C9g/l3CUWhgaDmo+Zy89z/7OHqs7GyxfzkrawN1zld2CwLLBX1pjf/+yhZWWcw4PBkpm+FkH7h4K7xEI7soOVi3lJOj1pKBcU2gFkLPT+UpVMSb117oMrBpakcLQI2j+UlpFYeKvFjUNh2+tLf785YpExLkqtcmuNt5mUU+XjtAjaPxTcJRaiNtTUI8mLgZVvSmMbR9jxxMGam4vq/X2FpVvUzbE/KLhLLISd3VmPXJBddlTchWev5ukD07w2M0fGwtMccRD1plTPOab1/L6UbulvCu4SC5XpgnpS8MODAeesec+SQ6tLC4slcT4aLyq1Uk/qJOwx5W9qSreI6twlltZtfjzyPgOuO38to6ev4pZdexNxaHWYJKeTJB5U5y6xUKv3d/n9GYOoti8OPH1gmqcPTCc2sANKmUhHKbhLV4S1C7hl114mXn6TO8bOXXZ/rQ+USd95OpQLlDKRjlJwl64Iq8t2WMyPP31gOnU9YKKUSh9FOknBXbqiWl12+YJo2oXV44t0goK7tHwOZj3Pr1aX7RQahMW5sqVVBry0/bJeD0P6iNoP9LlWz8Gs9/m3XnoW1SrO592r3p90rfZuabTXvYiCe5+rdg5mO55ffjDEQI1/bWmYt2/64Kq2927RQdTSDAX3PheVC5+amatrllithWxlUMovtGPE8XX9+WvZ+cULuPOqcxkZyjV1ulGYVt+ApT8p597nauXCa52IFPX8jFnsG3Y1Ixdk+fDaE/m/v3lzsVxzMMjwX6/60JL+MO1cMFUPdmmGZu59rp62uNVmiVHPT+Pi6FCu0Bv96tG1rBw4ds2z+YWOpknUg12a0XJwN7OsmU2a2feL368ysx+b2YvFr8OtD1M6ZWzjyJI0QpRqfVDKn5+NcaOuVr1ztJBX6naaRD3YpRkt95Yxsy8Do8B73f0zZvbfgTfdfbuZbQaG3f2r1X6GesvER6tnbJ6x+fFULIxGGR4MmJnNh15jJ8sdWy1XlXTqWG8ZMzsVuAz4BvDl4s1XAh8v/v0+4CdA1eAu8VFPu9lqWunLngRHZvMMDwYcmV1+uEgn0yTqwS6NanVB9R7gT4D3lN12srsfBnD3w2Z2UouvIV1UCiBbd+9fPI/TcLY9tp9bdu1d1lp2aDDAHWbm8osbkYxklzXWGr974Q2v2TdAkW5oOuduZp8B3nD3PU0+/yYzmzCzienp6WaHIR1Syi9DYcHwSDEVUeqXXipvPDKbX3wTKC2iOizm75OYga/1xvTWXL7t5Y4i7dbKzH0TcIWZfRpYCbzXzO4HXjezNcVZ+xrgjbAnu/u9wL1QyLm3MA5pQrUcbr2HL1fjFV/T5JShnNIkEntNz9zd/TZ3P9Xd1wHXAk+5+/XAbuCG4sNuAB5teZTSVrV2PKp+OprSL5IUndjEtB140MxuBA4BV3fgNaQFUaV8N+/ay44nDnJiLlhMtUihvHPBXVUqkihtCe7u/hMKVTG4+z8BF7fj50pnVJuZT83MEWSNIGPko45CSrHKxdRckFU+XRJJO1T7UK2Svfy8c8LKgcUFw6FcwPBgsLh4GKT4X83d12zQQqmkgnrLxFinNq6E1bJXOjKb5/bL1y97vS3j+xZPT0orHVotaaDgHlNhZ45Wa+DViNLztz22P3QzTsmt33ueiZffXKxpT3IufigX8NZcnlOGcrz59jvMRbSobNfvWKTXWm4/0A5qP7Bcq20AWnmNcknfkFRSnjsfn5zi1u89H7mmMDwYMLhiQFv9JfaqtR9IcfY02brR5rWen5WGwA5LG3uNbRxhx9XnRT72yGxeB2NI4im4x1Q32ryemAva9rOSYKp4gAgUAvxInb9LHYwhSaTgHlPdaPOa1u681a6rfBZeTy/7Em3skqRRcI+pyj7pzZTl1TpUeabKYmpSjQzluPvzGyKDdmV6pvJ3PBTxaUYHY0jSqFomxqL6l9RTIlmr2mZ8cgoziMF6elu9NjO3+LuIOuavfBZe+Tuu/L2BWg5IMmnmnjC1+sKUVDstaHxyilsfep40bkAtzbDHNo40NQtvxycmkTjQzD1hqgXt8gAUlSOemplL5cHVAEHGFmfY45NTvP3u0aqPiaKOj5IGCu490MrO02olkqWfm+aTkMqVn4g0lAvYesX6JW2L8/PLP5qcsHJAgVv6goJ7l5QH3vKNQfXuPN0yvo8Hnnslsu58aDCo2VIgTWpt5op6E0zjIrJIGOXcu6A8Tw7LNwbVqqMu9XOZj1j9zAVZ3OmbwF7PAmc39gmIxJlm7l1Qz8lG5TPNyrRNtRrrkeKZpmlv5lX6tDNSZxqr1YO+RZJOwT1Eu7sx1rMBpjSjDCthrKYUxNKm1f4u5bl39YiRfqTgXqET3RhPGcpVDdLlM8pGzi/NmrXlvNO4yQXZ0HbDjVLVi/Qz5dwrVCs1bFbYNvfSDvnKOupGtrmf/4HhVFTGmLHkMBDVlYu0TjP3Cp3oxthIiiBqln/8iiy/yy8w707WjA+sHuSZX7/Z9JjixB1+l1/g7ms2KKiLtImCe4Wo4NpqlUW9KYKohcBv/OGx2ez45FTqNiKFbcQSkeYpuFfoRZVF5QLuZz8ysnj6Ufksf8v4PnY+eyg1PdYrqfOiSPsouFfoVJVF+SamrBnz7otljA/vmVqygLvz2UNcd/5a7hg7d/H5133rp6lJw0RRDbpI+yi4h2h3lUVlBU5pM1IpkFfOxB3Y+ewhRk9ftdjBMe2BXTXoIu2l4N4F1coVo1IsTqFl7bbH9ifqUOrSp5JadE6pSGcpuHdBK7nkIwnrhVJPYG9XHbuIRFOdexf0Uy45W+PsvqyZ6thFuiB1wb3W0XK9kKZccoZCSgWObcQqyQVZvvCx0yKPuMsFWf7H589TYBfpglSlZTrROqAdxjaOsO2x/YlLsVQKMrDj6g1L6u3DqopGT18VWhmkvLpI95jH4BDN0dFRn5iYaPnnbNr+VOgGpFq9vzulPPidmAt4+92joQdIJEWvfo8iEs7M9rj7aNh9qZq5N9s6oHQQRmlr/xc+dtqSGvMo1bpHVn6KmJnLE2Sq56PjTpuMRJIjVcG9mdYBpYMwSubdF7+vFuDHJ6e49XvPk184VrN+86693LxrL4NBhrmjC1R+KMon/ETqfloYFkm6VC2ohnVfrLU55oHnXmno9pKtu/dHBuvZ/PLAniTZjC37lKFNRiLJ0vTM3cxOA/4n8K+ABeBed/+mma0CdgHrgN8Cn3f3I60PtbZmWgdE1WWH3V6ehklw7K5pfsF5rzYZiSRaK2mZo8BX3P1nZvYeYI+Z/Rj498CT7r7dzDYDm4Gvtj7U+jTaOiBqR2VlvXbam3ZVmpnNM/n1T/R6GCLSpKbTMu5+2N1/Vvz7vwAvACPAlcB9xYfdB4y1OMaO+sLHTqt5+/jkVF8FdlB+XSTp2rKgambrgI3Ac8DJ7n4YCm8AZnZSxHNuAm4CWLt2bVOv246zTkuLplHVMuOTU3zlwef7KrArvy6SfC3XuZvZCcD/Br7h7o+Y2Yy7D5Xdf8Tdh6v9jGbq3CtLDaEQlNq1tX18cioVG48aZbCs3bCIxFO1OveWqmXMLAAeBna6+yPFm183szXF+9cAb7TyGlFqnXXaShuC0htHmgN7VMW9A08fmO7mUESkA1qpljHgL4EX3P2usrt2AzcA24tfH21phBGiNtRMzcyxbvPjGMfa6TbahqBai940uKd4VukZmx8PTTdps5JI8rUyc98E/DvgIjPbW/zzaQpB/RIzexG4pPh929Va8KsMWuWz+lrSHNyMY29wUb9DLaaKJF8r1TL/x93N3T/k7huKf37g7v/k7he7+5nFrx05Qihsw1It9QbtNAe38mtrZtOXiCRDYneojm0c4c6rzmVkKBeZP640NBjUlYdPa3CrDNyVv8ORoZx6rYukRGq6Qq7b/HjNx2QobKUtKVXXAMta1KbBUC7ArLAhSbtMRdKnL7pCDuWCmmeNLlR8P5efZ+vu/bz9ztHFPjFJC+y5IMNcvvLK1J5XpN8lNi1TaesV65tqqTszl09kt8YMhaqXO6/6kPLmIrJMambulU3Dkheu65cLMtx51YeWpFha3akrIumS6OAedshGKRURdSpTUh03kOG/ffZDoUG70WZpIpJ+iU3LlA7ZKOXIS4dsbBkvbFZKU1rinms2cPCOTymAi0jdEhvcax2yMbZxhMEgsZe3aHgwUFAXkYYlNvrVc8jGioHGNjnF0e2Xr+/1EEQkgRIb3KsZn5xiw7Yf1SyNTALN2kWkGYleUI1SfnB1kg0PBr0egogkVGJn7iMR/V+yZqkI7EHWlJIRkaYlNrjfeulZBNmlm5aymWS3Diid2zoylGPH585TSkZEmpbstExFHJ9P8Iz9t9sv6/UQRCRFEjtz3/HEwVSkX6DQY72Rk6JERGpJbHBP04EaDnUfJCIiUo/EBve0HaiRpjcrEem9xAb3C89e3eshtFXa3qxEpLcSu6D6+M8P93oIdRnKBWy9Yv1i5cv45BS3PbJvyQHcatErIu2W2OB+ZDa+u09LJzxFdXAEtegVkc5KbHCPm+HBoO7j7NSiV0Q6TcG9DQyY/Ponej0MEZFFiV1QjRMthopI3Ci4t0iLoSISR0rLNCFrhR42I1oMFZGYUnBvQJAxdlythl4iEn8K7nXSLF1EkkTBvYaMwV2f36CgLiKJouBexfBgwO2Xr1dgF5HEUXAvc/35a7lj7NxeD0NEpGUK7kCQgR1XK/UiIunR18F90wdXsfOLF/R6GCIibdexTUxm9kkzO2hmvzKzzZ16nWYEGbjnmg0K7CKSWh2ZuZtZFvgz4BLgVeDvzWy3u/+yE6/XCM3WRaQfdCot81HgV+7+GwAz+y5wJdCz4F7ZV11EJM06FdxHgFfKvn8V+Fj5A8zsJuAmgLVr13ZoGHDye1bw3Ncu6djPFxGJo04Fdwu5zZd8434vcC/A6Oiohzy+ZfdcowoYEelPnQrurwKnlX1/KvBah15rmZVZ48A3Pt2tlxMRiZ1OVcv8PXCmmZ1hZiuAa4Hd7XyB326/LPJ2BXYR6Xcdmbm7+1Ez+4/AE0AW+I6772/360QFeBGRftexTUzu/gPgB536+SIiEk0nMYmIpJCCu4hICim4i4ikkIK7iEgKmXtH9g81NgizaeDlFn7E+4F/bNNwkqDfrhd0zf1C19yY0919ddgdsQjurTKzCXcf7fU4uqXfrhd0zf1C19w+SsuIiKSQgruISAqlJbjf2+sBdFm/XS/omvuFrrlNUpFzFxGRpdIycxcRkTIK7iIiKZTo4B7nQ7jbxcxOM7OnzewFM9tvZn9cvH2Vmf3YzF4sfh3u9VjbycyyZjZpZt8vfp/q6wUwsyEze8jMDhT/e1+Q5us2s1uK/6Z/YWYPmNnKtF2vmX3HzN4ws1+U3RZ5jWZ2WzGeHTSzS1t57cQG97JDuD8FnAN8wczO6e2oOuIo8BV3/9fA+cAfFa9zM/Cku58JPFn8Pk3+GHih7Pu0Xy/AN4EfuvvZwHkUrj+V121mI8CXgFF3/z0KrcGvJX3X+9fAJytuC73G4v/X1wLri8/582Kca0pigztlh3C7+7tA6RDuVHH3w+7+s+Lf/4XC//AjFK71vuLD7gPGejLADjCzU4HLgG+X3Zza6wUws/cC/xb4SwB3f9fdZ0j3dQ8AOTMbAAYpnNaWqut1978F3qy4OeoarwS+6+7vuPtLwK8oxLmmJDm4hx3CneoDU81sHbAReA442d0PQ+ENADiph0Nrt3uAPwEWym5L8/UCfACYBv6qmI76tpkdT0qv292ngD8FDgGHgbfc/Uek9HorRF1jW2NakoN7zUO408TMTgAeBm5293/u9Xg6xcw+A7zh7nt6PZYuGwA+DPyFu28E3ib5KYlIxTzzlcAZwCnA8WZ2fW9H1XNtjWlJDu49PYS7m8wsoBDYd7r7I8WbXzezNcX71wBv9Gp8bbYJuMLMfksh1XaRmd1Peq+35FXgVXd/rvj9QxSCfVqv+w+Al9x92t3zwCPA75Pe6y0XdY1tjWlJDu4dP4Q7DszMKORhX3D3u8ru2g3cUPz7DcCj3R5bJ7j7be5+qruvo/Df9Cl3v56UXm+Ju/8D8IqZnVW86WLgl6T3ug8B55vZYPHf+MUU1pPSer3loq5xN3CtmR1nZmcAZwJ/1/SruHti/wCfBv4f8Gvga70eT4eu8d9Q+Gj2c2Bv8c+ngfdRWGl/sfh1Va/H2oFr/zjw/eLf++F6NwATxf/W48Bwmq8b2AYcAH4B/C/guLRdL/AAhTWFPIWZ+Y3VrhH4WjGeHQQ+1cprq/2AiEgKJTktIyIiERTcRURSSMFdRCSFFNxFRFJIwV1EJIUU3EVEUkjBXUQkhf4/L33Y+JkmRpAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "ax.scatter(Y, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training Testing Split" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "from sklearn.linear_model import LinearRegression" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, Y_train, Y_test = train_test_split(X_fit, Y, test_size=0.30)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor()" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regressor = RandomForestRegressor()\n", "regressor.fit(X_train, Y_train)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "y_pred = regressor.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(Y_test, y_pred)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "from sklearn import metrics\n", "import math" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8545731030213027" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.r2_score(Y_test, y_pred)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9.966163336163948" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.sqrt(metrics.mean_squared_error(Y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }