{ "cells": [ { "cell_type": "code", "execution_count": 3, "id": "0438347e", "metadata": {}, "outputs": [], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 7, "id": "a98a7f08", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['anagrams',\n", " 'anscombe',\n", " 'attention',\n", " 'brain_networks',\n", " 'car_crashes',\n", " 'diamonds',\n", " 'dots',\n", " 'dowjones',\n", " 'exercise',\n", " 'flights',\n", " 'fmri',\n", " 'geyser',\n", " 'glue',\n", " 'healthexp',\n", " 'iris',\n", " 'mpg',\n", " 'penguins',\n", " 'planets',\n", " 'seaice',\n", " 'taxis',\n", " 'tips',\n", " 'titanic']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sns.get_dataset_names()" ] }, { "cell_type": "code", "execution_count": 10, "id": "14e88fe3", "metadata": {}, "outputs": [], "source": [ "dataset_config = {\n", " \"classification\": {\n", " \"anagrams\": {\n", " \"inputs\": [\"cond\", \"time\"],\n", " \"output\": \"score\" # or specific score column like 'score_3'\n", " },\n", " \"attention\": {\n", " \"inputs\": [\"attention\", \"solutions\"],\n", " \"output\": \"score\"\n", " },\n", " \"brain_networks\": {\n", " \"inputs\": [\"degree\", \"ave_path_length\", \"modularity_class\"],\n", " \"output\": \"network\"\n", " },\n", " \"dots\": {\n", " \"inputs\": [\"coherence\", \"time\"],\n", " \"output\": \"choice\"\n", " },\n", " \"iris\": {\n", " \"inputs\": [\"sepal_length\", \"sepal_width\",\n", " \"petal_length\", \"petal_width\"],\n", " \"output\": \"species\"\n", " },\n", " \"penguins\": {\n", " \"inputs\": [\"bill_length_mm\", \"bill_depth_mm\",\n", " \"flipper_length_mm\", \"body_mass_g\",\n", " \"sex\", \"island\"],\n", " \"output\": \"species\"\n", " },\n", " \"titanic\": {\n", " \"inputs\": [\"pclass\", \"sex\", \"age\",\n", " \"sibsp\", \"parch\", \"fare\", \"embarked\"],\n", " \"output\": \"survived\"\n", " }\n", " },\n", "\n", " \"regression\": {\n", " \"anscombe\": {\n", " \"inputs\": [\"x\"], # optionally add 'dataset'\n", " \"output\": \"y\"\n", " },\n", " \"car_crashes\": {\n", " \"inputs\": [\"alcohol\", \"speeding\", \"not_distracted\",\n", " \"no_previous\", \"ins_premium\", \"ins_losses\"],\n", " \"output\": \"total\"\n", " },\n", " \"diamonds\": {\n", " \"inputs\": [\"carat\", \"cut\", \"color\", \"clarity\",\n", " \"depth\", \"table\", \"x\", \"y\", \"z\"],\n", " \"output\": \"price\"\n", " },\n", " \"dowjones\": {\n", " \"inputs\": [\"date\"], # usually expanded into time features / lags\n", " \"output\": \"price\"\n", " },\n", " \"exercise\": {\n", " \"inputs\": [\"diet\", \"kind\", \"time\", \"rep\"],\n", " \"output\": \"pulse\"\n", " },\n", " \"flights\": {\n", " \"inputs\": [\"year\", \"month\"],\n", " \"output\": \"passengers\"\n", " },\n", " \"fmri\": {\n", " \"inputs\": [\"timepoint\", \"event\", \"region\"],\n", " \"output\": \"signal\"\n", " },\n", " \"geyser\": {\n", " \"inputs\": [\"waiting\"],\n", " \"output\": \"duration\"\n", " },\n", " \"glue\": {\n", " \"inputs\": [\"task\", \"model\"], # schema is benchmark-dependent\n", " \"output\": \"score\"\n", " },\n", " \"healthexp\": {\n", " \"inputs\": [\"Country\", \"Year\", \"Health_expenditure\"],\n", " \"output\": \"Life_expectancy\"\n", " },\n", " \"mpg\": {\n", " \"inputs\": [\"cylinders\", \"displacement\", \"horsepower\",\n", " \"weight\", \"acceleration\", \"model_year\", \"origin\"],\n", " \"output\": \"mpg\"\n", " },\n", " \"planets\": {\n", " \"inputs\": [\"method\", \"number\", \"mass\", \"distance\", \"year\"],\n", " \"output\": \"orbital_period\"\n", " },\n", " \"seaice\": {\n", " \"inputs\": [\"year\", \"month\"],\n", " \"output\": \"extent\"\n", " },\n", " \"taxis\": {\n", " \"inputs\": [\"passengers\", \"distance\", \"color\",\n", " \"payment\"], # plus engineered time features from pickup\n", " \"output\": \"total\"\n", " },\n", " \"tips\": {\n", " \"inputs\": [\"total_bill\", \"sex\", \"smoker\", \"day\", \"time\", \"size\"],\n", " \"output\": \"tip\"\n", " },\n", " # can also use some classification-style targets on regression datasets:\n", " \"titanic\": {\n", " \"inputs\": [\"pclass\", \"sex\", \"age\",\n", " \"sibsp\", \"parch\", \"fare\", \"embarked\"],\n", " \"output\": \"survived\"\n", " },\n", " \"penguins\": {\n", " \"inputs\": [\"bill_length_mm\", \"bill_depth_mm\",\n", " \"flipper_length_mm\", \"body_mass_g\",\n", " \"sex\", \"island\"],\n", " \"output\": \"body_mass_g\" # e.g., predict mass from morphology\n", " },\n", " \"tips_reg_as_cls_example\": {\n", " \"inputs\": [\"total_bill\", \"sex\", \"smoker\", \"day\", \"time\", \"size\"],\n", " \"output\": \"tip\" # you can bin tip% into classes if needed\n", " }\n", " }\n", "}\n" ] }, { "cell_type": "code", "execution_count": null, "id": "338f883f", "metadata": {}, "outputs": [], "source": [ "from sklearn.\n", "def data_cleaner(data:pd.DataFrame)->pd.DataFrame:\n", " columns=data.columns\n", " en={}\n", " for col in columns:\n", " if data[col]=='object' or 'categorical':\n", " en[col]=\n", "\n", " pass" ] }, { "cell_type": "code", "execution_count": 12, "id": "2b18e2ab", "metadata": {}, "outputs": [], "source": [ "data=sns.load_dataset('anagrams')" ] }, { "cell_type": "code", "execution_count": 13, "id": "fbd68c9d", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
subidrattnrnum1num2num3
01divided24.07
12divided34.05
23divided35.06
34divided57.05
45divided45.08
56divided55.06
67divided54.56
78divided57.08
89divided23.07
910divided65.06
1011focused65.06
1112focused89.08
1213focused65.09
1314focused88.07
1415focused88.07
1516focused68.07
1617focused77.06
1718focused78.06
1819focused56.06
1920focused66.05
\n", "
" ], "text/plain": [ " subidr attnr num1 num2 num3\n", "0 1 divided 2 4.0 7\n", "1 2 divided 3 4.0 5\n", "2 3 divided 3 5.0 6\n", "3 4 divided 5 7.0 5\n", "4 5 divided 4 5.0 8\n", "5 6 divided 5 5.0 6\n", "6 7 divided 5 4.5 6\n", "7 8 divided 5 7.0 8\n", "8 9 divided 2 3.0 7\n", "9 10 divided 6 5.0 6\n", "10 11 focused 6 5.0 6\n", "11 12 focused 8 9.0 8\n", "12 13 focused 6 5.0 9\n", "13 14 focused 8 8.0 7\n", "14 15 focused 8 8.0 7\n", "15 16 focused 6 8.0 7\n", "16 17 focused 7 7.0 6\n", "17 18 focused 7 8.0 6\n", "18 19 focused 5 6.0 6\n", "19 20 focused 6 6.0 5" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": 16, "id": "223776f7", "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import make_classification\n", "from sklearn.datasets import make_regression" ] }, { "cell_type": "code", "execution_count": 17, "id": "452f2ebc", "metadata": {}, "outputs": [], "source": [ "X_c, y_c = make_classification(\n", " n_samples=1000, # rows\n", " n_features=10, # total features\n", " n_informative=5, # actually useful features\n", " n_redundant=2, # linear combos of informative ones\n", " n_classes=3, # number of target classes\n", " random_state=42\n", ")\n", "\n", "\n", "X_r, y_r = make_regression(\n", " n_samples=1000,\n", " n_features=5,\n", " n_informative=3,\n", " noise=10.0, # adds Gaussian noise\n", " random_state=42\n", ")" ] }, { "cell_type": "code", "execution_count": 18, "id": "83cdd9d8", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X_c, y_c, test_size=0.2, random_state=0\n", ")" ] }, { "cell_type": "code", "execution_count": 19, "id": "f6f2765e", "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression, SGDClassifier, Perceptron, PassiveAggressiveClassifier, RidgeClassifier\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.svm import SVC, LinearSVC, NuSVC\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier, ExtraTreesClassifier\n", "from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "classification_models = {\n", " \"LogisticRegression\": {\n", " \"class\": LogisticRegression,\n", " \"default_params\": {\n", " \"penalty\": \"l2\",\n", " \"C\": 1.0,\n", " \"solver\": \"lbfgs\",\n", " \"max_iter\": 100,\n", " \"multi_class\": \"auto\",\n", " \"random_state\": None\n", " }\n", " },\n", " \"KNeighborsClassifier\": {\n", " \"class\": KNeighborsClassifier,\n", " \"default_params\": {\n", " \"n_neighbors\": 5,\n", " \"weights\": \"uniform\",\n", " \"algorithm\": \"auto\",\n", " \"p\": 2,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"SVC\": {\n", " \"class\": SVC,\n", " \"default_params\": {\n", " \"C\": 1.0,\n", " \"kernel\": \"rbf\",\n", " \"gamma\": \"scale\",\n", " \"degree\": 3,\n", " \"probability\": False,\n", " \"random_state\": None\n", " }\n", " },\n", " \"LinearSVC\": {\n", " \"class\": LinearSVC,\n", " \"default_params\": {\n", " \"C\": 1.0,\n", " \"loss\": \"squared_hinge\",\n", " \"penalty\": \"l2\",\n", " \"dual\": True,\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"DecisionTreeClassifier\": {\n", " \"class\": DecisionTreeClassifier,\n", " \"default_params\": {\n", " \"criterion\": \"gini\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"random_state\": None\n", " }\n", " },\n", " \"RandomForestClassifier\": {\n", " \"class\": RandomForestClassifier,\n", " \"default_params\": {\n", " \"n_estimators\": 100,\n", " \"criterion\": \"gini\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"bootstrap\": True,\n", " \"random_state\": None,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"GradientBoostingClassifier\": {\n", " \"class\": GradientBoostingClassifier,\n", " \"default_params\": {\n", " \"loss\": \"log_loss\", # or 'deviance' in older versions\n", " \"learning_rate\": 0.1,\n", " \"n_estimators\": 100,\n", " \"subsample\": 1.0,\n", " \"max_depth\": 3,\n", " \"random_state\": None\n", " }\n", " },\n", " \"AdaBoostClassifier\": {\n", " \"class\": AdaBoostClassifier,\n", " \"default_params\": {\n", " \"n_estimators\": 50,\n", " \"learning_rate\": 1.0,\n", " \"algorithm\": \"SAMME.R\",\n", " \"random_state\": None\n", " }\n", " },\n", " \"ExtraTreesClassifier\": {\n", " \"class\": ExtraTreesClassifier,\n", " \"default_params\": {\n", " \"n_estimators\": 100,\n", " \"criterion\": \"gini\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"bootstrap\": False,\n", " \"random_state\": None,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"GaussianNB\": {\n", " \"class\": GaussianNB,\n", " \"default_params\": {}\n", " },\n", " \"MultinomialNB\": {\n", " \"class\": MultinomialNB,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"fit_prior\": True\n", " }\n", " },\n", " \"BernoulliNB\": {\n", " \"class\": BernoulliNB,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"fit_prior\": True\n", " }\n", " },\n", " \"MLPClassifier\": {\n", " \"class\": MLPClassifier,\n", " \"default_params\": {\n", " \"hidden_layer_sizes\": (100,),\n", " \"activation\": \"relu\",\n", " \"solver\": \"adam\",\n", " \"alpha\": 0.0001,\n", " \"learning_rate\": \"constant\",\n", " \"max_iter\": 200,\n", " \"random_state\": None\n", " }\n", " },\n", " \"SGDClassifier\": {\n", " \"class\": SGDClassifier,\n", " \"default_params\": {\n", " \"loss\": \"hinge\", # linear SVM by default\n", " \"penalty\": \"l2\",\n", " \"alpha\": 0.0001,\n", " \"learning_rate\": \"optimal\",\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"Perceptron\": {\n", " \"class\": Perceptron,\n", " \"default_params\": {\n", " \"penalty\": None,\n", " \"alpha\": 0.0001,\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"PassiveAggressiveClassifier\": {\n", " \"class\": PassiveAggressiveClassifier,\n", " \"default_params\": {\n", " \"C\": 1.0,\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"RidgeClassifier\": {\n", " \"class\": RidgeClassifier,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"fit_intercept\": True,\n", " \"solver\": \"auto\",\n", " \"random_state\": None\n", " }\n", " }\n", "}\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "481d3964", "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, SGDRegressor\n", "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.svm import SVR, LinearSVR\n", "from sklearn.tree import DecisionTreeRegressor\n", "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, AdaBoostRegressor, ExtraTreesRegressor\n", "from sklearn.neural_network import MLPRegressor\n", "\n", "regression_models = {\n", " \"LinearRegression\": {\n", " \"class\": LinearRegression,\n", " \"default_params\": {\n", " \"fit_intercept\": True,\n", " \"copy_X\": True,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"Ridge\": {\n", " \"class\": Ridge,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"fit_intercept\": True,\n", " \"solver\": \"auto\",\n", " \"random_state\": None\n", " }\n", " },\n", " \"Lasso\": {\n", " \"class\": Lasso,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"fit_intercept\": True,\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"ElasticNet\": {\n", " \"class\": ElasticNet,\n", " \"default_params\": {\n", " \"alpha\": 1.0,\n", " \"l1_ratio\": 0.5,\n", " \"fit_intercept\": True,\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"KNeighborsRegressor\": {\n", " \"class\": KNeighborsRegressor,\n", " \"default_params\": {\n", " \"n_neighbors\": 5,\n", " \"weights\": \"uniform\",\n", " \"algorithm\": \"auto\",\n", " \"p\": 2,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"SVR\": {\n", " \"class\": SVR,\n", " \"default_params\": {\n", " \"kernel\": \"rbf\",\n", " \"C\": 1.0,\n", " \"epsilon\": 0.1,\n", " \"gamma\": \"scale\",\n", " \"degree\": 3\n", " }\n", " },\n", " \"LinearSVR\": {\n", " \"class\": LinearSVR,\n", " \"default_params\": {\n", " \"epsilon\": 0.0,\n", " \"C\": 1.0,\n", " \"loss\": \"epsilon_insensitive\",\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " },\n", " \"DecisionTreeRegressor\": {\n", " \"class\": DecisionTreeRegressor,\n", " \"default_params\": {\n", " \"criterion\": \"squared_error\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"random_state\": None\n", " }\n", " },\n", " \"RandomForestRegressor\": {\n", " \"class\": RandomForestRegressor,\n", " \"default_params\": {\n", " \"n_estimators\": 100,\n", " \"criterion\": \"squared_error\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"bootstrap\": True,\n", " \"random_state\": None,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"ExtraTreesRegressor\": {\n", " \"class\": ExtraTreesRegressor,\n", " \"default_params\": {\n", " \"n_estimators\": 100,\n", " \"criterion\": \"squared_error\",\n", " \"max_depth\": None,\n", " \"min_samples_split\": 2,\n", " \"min_samples_leaf\": 1,\n", " \"bootstrap\": False,\n", " \"random_state\": None,\n", " \"n_jobs\": None\n", " }\n", " },\n", " \"GradientBoostingRegressor\": {\n", " \"class\": GradientBoostingRegressor,\n", " \"default_params\": {\n", " \"loss\": \"squared_error\",\n", " \"learning_rate\": 0.1,\n", " \"n_estimators\": 100,\n", " \"subsample\": 1.0,\n", " \"max_depth\": 3,\n", " \"random_state\": None\n", " }\n", " },\n", " \"AdaBoostRegressor\": {\n", " \"class\": AdaBoostRegressor,\n", " \"default_params\": {\n", " \"n_estimators\": 50,\n", " \"learning_rate\": 1.0,\n", " \"loss\": \"linear\",\n", " \"random_state\": None\n", " }\n", " },\n", " \"MLPRegressor\": {\n", " \"class\": MLPRegressor,\n", " \"default_params\": {\n", " \"hidden_layer_sizes\": (100,),\n", " \"activation\": \"relu\",\n", " \"solver\": \"adam\",\n", " \"alpha\": 0.0001,\n", " \"learning_rate\": \"constant\",\n", " \"max_iter\": 200,\n", " \"random_state\": None\n", " }\n", " },\n", " \"SGDRegressor\": {\n", " \"class\": SGDRegressor,\n", " \"default_params\": {\n", " \"loss\": \"squared_error\",\n", " \"penalty\": \"l2\",\n", " \"alpha\": 0.0001,\n", " \"learning_rate\": \"invscaling\",\n", " \"max_iter\": 1000,\n", " \"random_state\": None\n", " }\n", " }\n", "}\n" ] }, { "cell_type": "code", "execution_count": 21, "id": "eaa14d79", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # [web:57][web:59]\n", "\n", "def eval_regression(y_true, y_pred, title=\"Regression performance\"):\n", " mae = mean_absolute_error(y_true, y_pred)\n", " mse = mean_squared_error(y_true, y_pred)\n", " rmse = mean_squared_error(y_true, y_pred, squared=False)\n", " r2 = r2_score(y_true, y_pred)\n", "\n", " print(f\"MAE: {mae:.4f}\")\n", " print(f\"MSE: {mse:.4f}\")\n", " print(f\"RMSE: {rmse:.4f}\")\n", " print(f\"R2: {r2:.4f}\")\n", "\n", " # scatter + y=x line to check fit\n", " plt.figure(figsize=(6, 6))\n", " plt.scatter(y_true, y_pred, alpha=0.6, edgecolor=\"k\")\n", " min_val = min(y_true.min(), y_pred.min())\n", " max_val = max(y_true.max(), y_pred.max())\n", " plt.plot([min_val, max_val], [min_val, max_val],\n", " \"r--\", label=\"Perfect fit\")\n", " plt.xlabel(\"True values\")\n", " plt.ylabel(\"Predicted values\")\n", " plt.title(title)\n", " plt.legend()\n", " plt.grid(alpha=0.3)\n", " plt.tight_layout()\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "5af3f9fc", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from sklearn.metrics import (\n", " accuracy_score, precision_score, recall_score,\n", " f1_score, confusion_matrix, classification_report\n", ") # [web:62][web:65]\n", "\n", "def eval_classification(y_true, y_pred, labels=None, title=\"Classification performance\"):\n", " acc = accuracy_score(y_true, y_pred)\n", " prec = precision_score(y_true, y_pred, average=\"weighted\", zero_division=0)\n", " rec = recall_score(y_true, y_pred, average=\"weighted\", zero_division=0)\n", " f1 = f1_score(y_true, y_pred, average=\"weighted\", zero_division=0)\n", "\n", " print(f\"Accuracy: {acc:.4f}\")\n", " print(f\"Precision: {prec:.4f}\")\n", " print(f\"Recall: {rec:.4f}\")\n", " print(f\"F1-score: {f1:.4f}\")\n", " print(\"\\nClassification report:\\n\")\n", " print(classification_report(y_true, y_pred, zero_division=0))\n", "\n", " cm = confusion_matrix(y_true, y_pred, labels=labels)\n", " plt.figure(figsize=(6, 5))\n", " sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\",\n", " xticklabels=labels, yticklabels=labels)\n", " plt.xlabel(\"Predicted\")\n", " plt.ylabel(\"True\")\n", " plt.title(f\"{title} - Confusion Matrix\")\n", " plt.tight_layout()\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "4e0cf5c8", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA # [web:63][web:66]\n", "\n", "def plot_decision_regions_pca(model, X, y, title=\"Decision regions (PCA)\", cmap=\"viridis\"):\n", " # X: original features (test or full); y: labels; model: already fitted on same feature space\n", " pca = PCA(n_components=2)\n", " X_pca = pca.fit_transform(X)\n", "\n", " x_min, x_max = X_pca[:, 0].min() - 1.0, X_pca[:, 0].max() + 1.0\n", " y_min, y_max = X_pca[:, 1].min() - 1.0, X_pca[:, 1].max() + 1.0\n", " xx, yy = np.meshgrid(\n", " np.linspace(x_min, x_max, 300),\n", " np.linspace(y_min, y_max, 300)\n", " )\n", "\n", " # Inverse-transform grid to original feature space for prediction\n", " grid_pca = np.c_[xx.ravel(), yy.ravel()]\n", " grid_original = pca.inverse_transform(grid_pca)\n", " Z = model.predict(grid_original)\n", " Z = Z.reshape(xx.shape)\n", "\n", " plt.figure(figsize=(7, 6))\n", " plt.contourf(xx, yy, Z, alpha=0.3, cmap=cmap)\n", " scatter = plt.scatter(\n", " X_pca[:, 0], X_pca[:, 1],\n", " c=y, cmap=cmap, edgecolor=\"k\", s=40\n", " )\n", " plt.xlabel(\"PC1\")\n", " plt.ylabel(\"PC2\")\n", " plt.title(title)\n", " plt.grid(alpha=0.2)\n", " plt.tight_layout()\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": 27, "id": "06c0bcb6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomForestClassifier()
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": [ "RandomForestClassifier()" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model=RandomForestClassifier()\n", "model.fit(X_train,y_train)" ] }, { "cell_type": "code", "execution_count": 31, "id": "5514ab3b", "metadata": {}, "outputs": [], "source": [ "y_pred=model.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 34, "id": "1efaa094", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.8750\n", "Precision: 0.8757\n", "Recall: 0.8750\n", "F1-score: 0.8751\n", "\n", "Classification report:\n", "\n", " precision recall f1-score support\n", "\n", " 0 0.85 0.89 0.87 63\n", " 1 0.91 0.88 0.90 78\n", " 2 0.86 0.85 0.85 59\n", "\n", " accuracy 0.88 200\n", " macro avg 0.87 0.87 0.87 200\n", "weighted avg 0.88 0.88 0.88 200\n", "\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAHqCAYAAAAj28XgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQ/xJREFUeJzt3Qd8FNX2wPEzoYSWhJ6AEECkVykC0hQRLA9BsD5URNSnAtLRqFgQRbGgSFMegvjAggqKBUVQEAUUEJ+AIigakN4SigmB7P9z7vvvuhsCZGFhd+7+vn5WkpnNzp3Zmdkz59w763g8Ho8AAAC4QEy4GwAAAJBXBC4AAMA1CFwAAIBrELgAAADXIHABAACuQeACAABcg8AFAAC4BoELAABwDQIXAADgGgQuZ1jlypXl1ltvlXDRZWsb/B04cEBuv/12SUpKEsdxpH///vL777+bn6dOnXrW23jRRReZRzR4/fXXpWbNmlKgQAEpXrx4uJuDs2j9+vXSoUMHSUhIMMfa7NmzQ/r64TyGI1U0nVuiCYHLKfr111/lX//6l5x77rlSqFAhiY+Pl5YtW8qLL74of/31l0SyJ5980pzc7r77bvNBevPNN5/xZa5du1YeffRRc3KNVj///LMJJKtWrSqTJk2SV155JdxNijrhPG579OghP/74ozzxxBPmuGvSpInYQvdrDZp0e+a2HTVo0/n6ePbZZ4N+/S1btpjzx6pVq0LUYrhZ/nA3wI0++ugjufbaayU2NlZuueUWqVu3rhw+fFgWL14sQ4YMkTVr1kTMh5J+QGZnZwdMW7BggTRv3lweeeQR3zT9yio94Wgm4EwFLo899pi5+smZAfrss88kGnz55ZfmvdAPyfPOOy/czYk64Txu9dhasmSJPPjgg9KnT58zsoxKlSqd0WP4ZPLnzy+HDh2SOXPmyHXXXRcwb/r06SZQzMjIOKXX1sBFzx967mjYsGGe/y5azi3RhsAlSBs3bpQbbrjBnCQ0AChXrpxvXu/evWXDhg3mBBkpcjuJ7dixQ2rXrh0wTa+E9MQSDgULFhSbHTx4UIoWLWq2uwpliUg/KIoUKRKy17NVuI/bnTt3mn/PZHkwnMew0oBQs1dvvPHGMYHLjBkz5Morr5R33333rLTFe1zYfm6JWvrt0Mi7u+66S79N2/P111/n6fmVKlXy9OjRw/f77t27PYMGDfLUrVvXU7RoUU9cXJznsssu86xateqYvx0zZoyndu3ansKFC3uKFy/uady4sWf69Om++enp6Z5+/fqZZRQsWNBTpkwZT/v27T0rVqzwPUeXrfPVF198Ydqe87Fx40bz0J+nTJkS0IaffvrJc+2113pKly7tKVSokKd69eqeBx54wDf/999/99x9991mus4vWbKk55prrjGv56WvmdtytT2qbdu25uFv+/btnttuu81TtmxZT2xsrKd+/fqeqVOnBjzH2+ZnnnnG8/LLL3vOPfdcsx2aNGni+fbbb0/63njbtXDhQs+dd95p2q7vx8033+zZs2fPMc//+OOPPa1atfIUKVLEU6xYMc8VV1zhWb16dcBzdHvr+7phwwbP5Zdfbp7XuXNn8x7kXP9HHnnE93fjxo0z77W2v1y5cp577rnHs3fv3oDX1m1Up04dz/Llyz2tW7c2+4W+//7bYezYsZ4qVaqYeZdeeqknNTXVk52d7Rk+fLjnnHPOMe/RVVddZfZDf7Nnzzbro8vWNui21L85cuRIrm1Ys2aN56KLLjLLKV++vOfpp58+Znv99ddfZh2rVatm3sOkpCTP1VdfbbaN19GjRz2jR482667P0fdb34vctv/ZPG6zsrLM+nv3KX3/UlJSPBkZGQHP0+lXXnml56uvvvI0bdrUrINu/9dee833HN0GOd977zHpf3z68/6Nv88++8zTsmVLT0JCgtnH9JjTNnkd7xieP3++b7/Vv9X3f+3atbkub/369aZN+rz4+HjPrbfe6jl48OBJt5d3v9djVLeB/76rx6K+9rvvvuvbT4M5Hx7vvOVdz+MdF7mdW2655RbTvpzr36FDB3OO/fPPP0+6rgg/Mi5B0jSo1scvvPDCUwoUf/vtN9MpT1PWVapUke3bt8vLL78sbdu2NeWU8uXL+0o89957r1xzzTXSr18/k2L973//K8uWLZN//vOf5jl33XWXvPPOOyb1rBmU3bt3m7T3Tz/9JI0aNTpm2bVq1TK19QEDBkiFChVk0KBBZnqZMmV8V4T+dHmtW7c2WZs777zTpGm1j4BuA63Tq++++06++eYbczWrr6l9WCZMmGBKQro+etXTpk0bsy5jxoyRBx54wLTD257caLpb/16vgnXddDvNnDnT1NH37dtntkfOq7n9+/ebvgt61Tlq1Cjp2rWr2dZ5SZvrMvRKWGvo69atM+3/448/TGlHX0/pdtM+Ch07dpSnn37aXNHp81q1aiXff/99QPnryJEj5nk6T+v5ug207dOmTZNZs2aZvytWrJjUr1/fPF+Xq2nw9u3bm35H3jbotv36668D1kHf48svv9xs75tuukkSExMD0vFa+ujbt6/s2bPHbAe98m3Xrp1Zl/vuu89s05deekkGDx4sr776qu9vtc+TtmngwIHmX81KPPzww5Keni7PPPNMwPbau3evXHbZZWYb6+vrPqivXa9ePdM2dfToUfnHP/4h8+fPN23V90zfo3nz5snq1atNPx+l75kuu2fPnmYf0czI2LFjzTbNue5n87jVzuuvvfaaOf70ONHjbuTIkebY0vfQn25TfV6vXr3MPqLbVd/vxo0bS506dcx20v1Lj7sbb7xRrrjiCrONg6FlLN2eus8MHz7cZDd0ubqNTuTzzz8374muu+5nemzp+6+ZkZUrVx5TttX3U483XVed/+9//1vKli1r9vm80HXV89J7770nt912m+/41A7puZ2T8nI+1POErrPuj3oe0nOS8n8vT3Rc+NMyre7b+j5p6S5fvnxmeVpS0mPce/5FhAt35OQmaWlpJtLXK+i8yplx0Ss2vcr0p1dKehWgV3heugy9ijgRvSrq3bv3CZ+T2xWd9yoxZxtyXq21adPGXAH98ccfAc/VK3ivQ4cOHbPMJUuWmNeaNm2ab9rMmTMDsiz+cl4VvfDCC+a5//nPf3zTDh8+7GnRooXJYGimyb/NpUqVCrhCf//99830OXPm5CnjopksfX2vUaNGmen6Omr//v3mauyOO+4I+Ptt27aZ98B/um5v/dv777//mOV5r2p37tzpm7Zjxw5zRa9XfP77hWZO9LmvvvpqwHbSaRMnTgx4Xe920Izbvn37fNP1alynN2jQwGQQvG688UazTP/sQW7v47/+9S9zle7/PG8b/N/bzMxMk03p1q2bb5q2W5/3/PPPH/O63v1HsxT6HP8sopo7d26u08/WcatX+/r822+/PWD64MGDzfQFCxb4pnkzaYsWLQp4T/V41kyCl39WzF9eMy6alcq57+SU2zHcsGFDk8Xyz7D98MMPnpiYGJN9yLk8zXL60wyZHl95zbgozbhecskl5mfdp3XfeOyxx3LdBnk9H3733Xe5ZpNOdFwcL5v76aefmuePGDHC89tv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+OJjpmvwO3XqVDYYjhkyn5spU6bIrbfeytZCyBG4AAAA16CPCwAAcA0CFwAA4BoELgAAwDUIXAAAgGsQuAAAANcgcAEAAK5B4AIAAFyDwAUAALgGgQsAQ+9y2qVLF9/WuOiii6R///5huXOv3o113759vDMAjkHgArggoNAPcn3ol2aed955Mnz4cDly5MgZXe57770njz/+eJ6eS7AB4GzhSxYBF7jsssvMd79kZmbKxx9/bL7YrkCBApKSkhLwvMOHD5vgJhT0SxUBINKQcQFcIDY2VpKSkqRSpUpy9913S/v27eWDDz7wlXeeeOIJKV++vNSoUcM8f9OmTXLddddJ8eLFTQDSuXNn+f33332vd/ToUfOt4Tq/VKlSMnToUPF4PAHLzFkq0qDpvvvuk4oVK5r2aOZn8uTJ5nW9X8pYokQJkxnyfrledna2jBw5UqpUqWK+KbhBgwbyzjvvBCxHA7Hq1aub+fo6/u0EgJwIXAAX0g95za6o+fPny7p162TevHny4YcfSlZWlnTs2FHi4uLkq6++kq+//lqKFStmsjbev3nuuefMNz2/+uqrsnjxYtmzZ4/MmjXrhMu85ZZb5I033jDfLP7TTz/Jyy+/bF5XA5l3333XPEfbsXXrVnnxxRfN7xq0TJs2TSZOnChr1qyRAQMGyE033SQLFy70BVhdu3aVTp06yapVq+T222+X+++//wxvPQCu5gEQ0Xr06OHp3Lmz+Tk7O9szb948T2xsrGfw4MFmXmJioiczM9P3/Ndff91To0YN81wvnV+4cGHPp59+an4vV66cZ9SoUb75WVlZngoVKviWo9q2bevp16+f+XndunWajjHLzs0XX3xh5u/du9c3LSMjw1OkSBHPN998E/DcXr16eW688Ubzc0pKiqd27doB8++7775jXgsAvOjjAriAZlI0u6HZFC2//POf/5RHH33U9HWpV69eQL+WH374QTZs2GAyLv4yMjLk119/lbS0NJMVadasmW9e/vz5pUmTJseUi7w0G5IvXz5p27ZtntusbTh06JBceumlAdM163P++eebnzVz498O1aJFizwvA0D0IXABXED7fkyYMMEEKNqXRQMNr6JFiwY898CBA9K4cWOZPn36Ma9TpkyZUy5NBUvboT766CM555xzAuZpHxkAOBUELoALaHCinWHzolGjRvLWW29J2bJlJT4+PtfnlCtXTpYtWyZt2rQxv+vQ6hUrVpi/zY1mdTTTo31TtGNwTt6Mj3b69apdu7YJUFJTU4+bqalVq5bpZOxv6dKleVpPANGJzrmAZbp37y6lS5c2I4m0c+7GjRvNfVbuvfde2bx5s3lOv3795KmnnpLZs2fLzz//LPfcc88Jb/hWuXJl6dGjh9x2223mb7yv+fbbb5v5OtpJRxNpSWvnzp0m26KlqsGDB5sOua+99popU61cuVJeeukl87u66667ZP369TJkyBDTsXfGjBmm0zAAHA+BC2CZIkWKyKJFiyQ5OdmM2NGsRq9evUwfF28GZtCgQXLzzTebYET7lGiQcfXVV5/wdbVUdc0115ggp2bNmnLHHXfIwYMHzTwtBT322GNmRFBiYqL06dPHTNcb2A0bNsyMLtJ26MgmLR3p8GilbdQRSRoM6VBpHX305JNPnvFtBMC9HO2hG+5GAAAA5AUZFwAA4BoELgAAwDUIXAAAgGsQuAAAANcgcAEAAK5B4AIAAFyDwAUAALgGgQsAAHANAhcAAOAaBC4AAMA1CFwAAIBrELgAAABxi/8D8dhCAQkL3T0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "TypeError", "evalue": "plot_decision_regions_pca() got an unexpected keyword argument 'clf'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[34], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# after training classifier `clf` on X_train, y_train\u001b[39;00m\n\u001b[0;32m 2\u001b[0m eval_classification(y_test, y_pred, labels\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39munique(y_test))\n\u001b[1;32m----> 3\u001b[0m \u001b[43mplot_decision_regions_pca\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[43mX_test\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_test\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mtitle\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mDecision regions (PCA) - Test set\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43mclf\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[1;31mTypeError\u001b[0m: plot_decision_regions_pca() got an unexpected keyword argument 'clf'" ] } ], "source": [ "# after training classifier `clf` on X_train, y_train\n", "eval_classification(y_test, y_pred, labels=np.unique(y_test))\n", "plot_decision_regions_pca( X_test, y_test,\n", " title=\"Decision regions (PCA) - Test set\",clf=model)\n" ] }, { "cell_type": "code", "execution_count": 25, "id": "8c9ff0f0", "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'reg_model' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[25], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Regression\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m y_pred_reg \u001b[38;5;241m=\u001b[39m \u001b[43mreg_model\u001b[49m\u001b[38;5;241m.\u001b[39mpredict(X_test_reg)\n\u001b[0;32m 3\u001b[0m eval_regression(y_test_reg, y_pred_reg, title\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMy Regressor\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# Classification\u001b[39;00m\n", "\u001b[1;31mNameError\u001b[0m: name 'reg_model' is not defined" ] } ], "source": [ "# Regression\n", "y_pred_reg = reg_model.predict(X_test_reg)\n", "eval_regression(y_test_reg, y_pred_reg, title=\"My Regressor\")\n", "\n", "# Classification\n", "y_pred_clf = clf_model.predict(X_test_clf)\n", "eval_classification(y_test_clf, y_pred_clf,\n", " labels=np.unique(y_test_clf),\n", " title=\"My Classifier\")\n", "plot_decision_regions_pca(clf_model, X_test_clf, y_test_clf,\n", " title=\"My Classifier decision regions (PCA)\")\n" ] }, { "cell_type": "code", "execution_count": null, "id": "bab086ae", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "python_backend (3.10.19)", "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.19" } }, "nbformat": 4, "nbformat_minor": 5 }