diff --git a/Cheatsheats/plotting.md b/Cheatsheats/plotting.md
new file mode 100644
index 00000000..96b6cd07
--- /dev/null
+++ b/Cheatsheats/plotting.md
@@ -0,0 +1,12 @@
+| Feature Type | Target Type | What you want to see | Plot to use | What it tells you (in simple words) | Python example |
+| ------------ | ------------------- | -------------------------------------- | ------------------- | ------------------------------------ | ----------------------------------------------- |
+| Number | Number | Does feature increase/decrease target? | Scatter | Shows upward/downward pattern | `sns.scatterplot(x='age', y='salary', data=df)` |
+| Number | Number | Are there extreme values? | Scatter | Dots far away = outliers | `sns.scatterplot(x='age', y='salary', data=df)` |
+| Number | Number | Is data spread normal or skewed? | Histogram | Shows shape of data | `sns.histplot(df['age'], kde=True)` |
+| Number | Number | Compare many numeric features at once | Heatmap | Which feature relates most to target | `sns.heatmap(df.corr(), annot=True)` |
+| Number | Class (0/1, Yes/No) | Do classes look different? | Box plot | If boxes separate → feature useful | `sns.boxplot(x='class', y='age', data=df)` |
+| Number | Class | How dense values are per class | Violin plot | Shows distribution per class | `sns.violinplot(x='class', y='age', data=df)` |
+| Category | Number | Which category has higher target? | Bar plot (mean) | Shows average target per category | `sns.barplot(x='city', y='sales', data=df)` |
+| Category | Number | Which category appears most? | Count plot | Shows frequency | `sns.countplot(x='city', data=df)` |
+| Category | Class | Relation between two categories | Count plot with hue | Shows class split per category | `sns.countplot(x='gender', hue='buy', data=df)` |
+| Many Numbers | Number/Class | Overall relationship view | Pairplot | Quick scan of all relations | `sns.pairplot(df, hue='class')` |
\ No newline at end of file
diff --git a/Cheatsheats/testing.md b/Cheatsheats/testing.md
new file mode 100644
index 00000000..fa4c50e5
--- /dev/null
+++ b/Cheatsheats/testing.md
@@ -0,0 +1,21 @@
+| Test | Purpose (What it checks) | Data Type | Key Assumptions | Python (scipy/statsmodels) |
+| ------------------------ | ------------------------------------------------- | ----------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------ |
+| **One-sample t-test** | Compare sample mean to a known value | Numeric | Normal data | `stats.ttest_1samp(x, μ)` |
+| **Independent t-test** | Compare means of 2 independent groups | Numeric (2 groups) | Normal, equal variance | `stats.ttest_ind(a, b)` |
+| **Paired t-test** | Compare same group before vs after | Numeric (paired) | Normal differences | `stats.ttest_rel(a, b)` |
+| **One-way ANOVA** | Compare means of 3+ groups | Numeric (3+ groups) | Normal, equal variance | `stats.f_oneway(g1, g2, g3)` |
+| **One-way ANOVA (OLS)** | Check if **mean age differs across classes** | Numeric (age) + categorical (class) | Normal residuals, equal variance, independent samples | `ols('age ~ class', data=df).fit()` + `sm.stats.anova_lm(model)` |
+| **Two-way ANOVA** | Effect of 2 factors on mean | Numeric + categorical | Normal, equal variance | `statsmodels.formula.api.ols()` |
+| **Mann–Whitney U** | 2 groups, non-normal | Ordinal/Numeric | Independent | `stats.mannwhitneyu(a, b)` |
+| **Wilcoxon test** | Paired, non-normal | Ordinal/Numeric | Paired | `stats.wilcoxon(a, b)` |
+| **Kruskal–Wallis** | 3+ groups, non-normal | Ordinal/Numeric | Independent | `stats.kruskal(g1, g2, g3)` |
+| **Chi-square test** | Relationship between categories | Categorical | Expected freq > 5 | `stats.chi2_contingency(table)` |
+| **Fisher’s Exact** | Small categorical samples | Categorical | 2×2 table | `stats.fisher_exact(table)` |
+| **Pearson correlation** | Linear relation between 2 vars | Numeric | Normal, linear | `stats.pearsonr(x, y)` |
+| **Spearman correlation** | Rank-based relation | Ordinal/Numeric | Monotonic | `stats.spearmanr(x, y)` |
+| **Linear regression** | Predict Y from X | Numeric | Linearity, normal errors | `stats.linregress(x, y)` |
+| **Logistic regression** | Predict binary outcome | Numeric + categorical | Independent | `sklearn.linear_model.LogisticRegression()` |
+| **Shapiro-Wilk** | Test for normality | Numeric | Random sample | `stats.shapiro(x)` |
+| **Kolmogorov–Smirnov** | Compare to a distribution | Numeric | Continuous | `stats.kstest(x, 'norm')` |
+| **Levene’s test** | Test equal variance | Numeric | Independent | `stats.levene(a, b)` |
+| **Tukey’s HSD** | Find **which specific groups differ** after ANOVA | Numeric + categorical (3+ groups) | Normal data, equal variance, independent groups | `statsmodels.stats.multicomp.pairwise_tukeyhsd(endog=y, groups=g)` |
\ No newline at end of file
diff --git a/ML/10_svm/Exercise/solution_for_understanding.ipynb b/ML/10_svm/Exercise/solution_for_understanding.ipynb
new file mode 100644
index 00000000..af95bcea
--- /dev/null
+++ b/ML/10_svm/Exercise/solution_for_understanding.ipynb
@@ -0,0 +1,1692 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "75076c8d",
+ "metadata": {},
+ "source": [
+ "# SVM with Hyperparameter Tuning"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57037e1e",
+ "metadata": {},
+ "source": [
+ "## Imports and Data Load"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "d737904f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sklearn.datasets import load_digits\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.svm import SVC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "d30e15d4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR', 'data', 'feature_names', 'frame', 'images', 'target', 'target_names']"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits = load_digits()\n",
+ "dir(digits)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3a429a95",
+ "metadata": {},
+ "source": [
+ "### Data Exploration"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "647c530e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 0., 0., 5., ..., 0., 0., 0.],\n",
+ " [ 0., 0., 0., ..., 10., 0., 0.],\n",
+ " [ 0., 0., 0., ..., 16., 9., 0.],\n",
+ " ...,\n",
+ " [ 0., 0., 1., ..., 6., 0., 0.],\n",
+ " [ 0., 0., 2., ..., 12., 0., 0.],\n",
+ " [ 0., 0., 10., ..., 12., 1., 0.]], shape=(1797, 64))"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits.data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "35c0e99e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['pixel_0_0',\n",
+ " 'pixel_0_1',\n",
+ " 'pixel_0_2',\n",
+ " 'pixel_0_3',\n",
+ " 'pixel_0_4',\n",
+ " 'pixel_0_5',\n",
+ " 'pixel_0_6',\n",
+ " 'pixel_0_7',\n",
+ " 'pixel_1_0',\n",
+ " 'pixel_1_1',\n",
+ " 'pixel_1_2',\n",
+ " 'pixel_1_3',\n",
+ " 'pixel_1_4',\n",
+ " 'pixel_1_5',\n",
+ " 'pixel_1_6',\n",
+ " 'pixel_1_7',\n",
+ " 'pixel_2_0',\n",
+ " 'pixel_2_1',\n",
+ " 'pixel_2_2',\n",
+ " 'pixel_2_3',\n",
+ " 'pixel_2_4',\n",
+ " 'pixel_2_5',\n",
+ " 'pixel_2_6',\n",
+ " 'pixel_2_7',\n",
+ " 'pixel_3_0',\n",
+ " 'pixel_3_1',\n",
+ " 'pixel_3_2',\n",
+ " 'pixel_3_3',\n",
+ " 'pixel_3_4',\n",
+ " 'pixel_3_5',\n",
+ " 'pixel_3_6',\n",
+ " 'pixel_3_7',\n",
+ " 'pixel_4_0',\n",
+ " 'pixel_4_1',\n",
+ " 'pixel_4_2',\n",
+ " 'pixel_4_3',\n",
+ " 'pixel_4_4',\n",
+ " 'pixel_4_5',\n",
+ " 'pixel_4_6',\n",
+ " 'pixel_4_7',\n",
+ " 'pixel_5_0',\n",
+ " 'pixel_5_1',\n",
+ " 'pixel_5_2',\n",
+ " 'pixel_5_3',\n",
+ " 'pixel_5_4',\n",
+ " 'pixel_5_5',\n",
+ " 'pixel_5_6',\n",
+ " 'pixel_5_7',\n",
+ " 'pixel_6_0',\n",
+ " 'pixel_6_1',\n",
+ " 'pixel_6_2',\n",
+ " 'pixel_6_3',\n",
+ " 'pixel_6_4',\n",
+ " 'pixel_6_5',\n",
+ " 'pixel_6_6',\n",
+ " 'pixel_6_7',\n",
+ " 'pixel_7_0',\n",
+ " 'pixel_7_1',\n",
+ " 'pixel_7_2',\n",
+ " 'pixel_7_3',\n",
+ " 'pixel_7_4',\n",
+ " 'pixel_7_5',\n",
+ " 'pixel_7_6',\n",
+ " 'pixel_7_7']"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits.feature_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "a548c600",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 1, 2, ..., 8, 9, 8], shape=(1797,))"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits.target"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "968d0907",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits.target_names"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "06121aac",
+ "metadata": {},
+ "source": [
+ "### Making Data Frames"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "1825b11b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " pixel_0_0 \n",
+ " pixel_0_1 \n",
+ " pixel_0_2 \n",
+ " pixel_0_3 \n",
+ " pixel_0_4 \n",
+ " pixel_0_5 \n",
+ " pixel_0_6 \n",
+ " pixel_0_7 \n",
+ " pixel_1_0 \n",
+ " pixel_1_1 \n",
+ " ... \n",
+ " pixel_6_6 \n",
+ " pixel_6_7 \n",
+ " pixel_7_0 \n",
+ " pixel_7_1 \n",
+ " pixel_7_2 \n",
+ " pixel_7_3 \n",
+ " pixel_7_4 \n",
+ " pixel_7_5 \n",
+ " pixel_7_6 \n",
+ " pixel_7_7 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 13.0 \n",
+ " 9.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 6.0 \n",
+ " 13.0 \n",
+ " 10.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 12.0 \n",
+ " 13.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 16.0 \n",
+ " 10.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 15.0 \n",
+ " 12.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 11.0 \n",
+ " 16.0 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 7.0 \n",
+ " 15.0 \n",
+ " 13.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 8.0 \n",
+ " ... \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 7.0 \n",
+ " 13.0 \n",
+ " 13.0 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 11.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 16.0 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows × 64 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " pixel_0_0 pixel_0_1 pixel_0_2 pixel_0_3 pixel_0_4 pixel_0_5 \\\n",
+ "0 0.0 0.0 5.0 13.0 9.0 1.0 \n",
+ "1 0.0 0.0 0.0 12.0 13.0 5.0 \n",
+ "2 0.0 0.0 0.0 4.0 15.0 12.0 \n",
+ "3 0.0 0.0 7.0 15.0 13.0 1.0 \n",
+ "4 0.0 0.0 0.0 1.0 11.0 0.0 \n",
+ "\n",
+ " pixel_0_6 pixel_0_7 pixel_1_0 pixel_1_1 ... pixel_6_6 pixel_6_7 \\\n",
+ "0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
+ "1 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
+ "2 0.0 0.0 0.0 0.0 ... 5.0 0.0 \n",
+ "3 0.0 0.0 0.0 8.0 ... 9.0 0.0 \n",
+ "4 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
+ "\n",
+ " pixel_7_0 pixel_7_1 pixel_7_2 pixel_7_3 pixel_7_4 pixel_7_5 \\\n",
+ "0 0.0 0.0 6.0 13.0 10.0 0.0 \n",
+ "1 0.0 0.0 0.0 11.0 16.0 10.0 \n",
+ "2 0.0 0.0 0.0 3.0 11.0 16.0 \n",
+ "3 0.0 0.0 7.0 13.0 13.0 9.0 \n",
+ "4 0.0 0.0 0.0 2.0 16.0 4.0 \n",
+ "\n",
+ " pixel_7_6 pixel_7_7 \n",
+ "0 0.0 0.0 \n",
+ "1 0.0 0.0 \n",
+ "2 9.0 0.0 \n",
+ "3 0.0 0.0 \n",
+ "4 0.0 0.0 \n",
+ "\n",
+ "[5 rows x 64 columns]"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.DataFrame(digits.data, columns=digits.feature_names)\n",
+ "\n",
+ "x = df\n",
+ "\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "d6f44e1d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(1797, 65)"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"target\"] = digits.target\n",
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "d95c7b34",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 0\n",
+ "1 1\n",
+ "2 2\n",
+ "3 3\n",
+ "4 4\n",
+ "Name: target, dtype: int64"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = df.target\n",
+ "y.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fac154c9",
+ "metadata": {},
+ "source": [
+ "## Model Fitting"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "5a102519",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "SVC() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " C\n",
+ " C: float, default=1.0 Regularization parameter. The strength of the regularization is inversely proportional to C. Must be strictly positive. The penalty is a squared l2 penalty. For an intuitive visualization of the effects of scaling the regularization parameter C, see :ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`. \n",
+ " \n",
+ " \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " kernel\n",
+ " kernel: {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'} or callable, default='rbf' Specifies the kernel type to be used in the algorithm. If none is given, 'rbf' will be used. If a callable is given it is used to pre-compute the kernel matrix from data matrices; that matrix should be an array of shape ``(n_samples, n_samples)``. For an intuitive visualization of different kernel types see :ref:`sphx_glr_auto_examples_svm_plot_svm_kernels.py`. \n",
+ " \n",
+ " \n",
+ " 'rbf' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " degree\n",
+ " degree: int, default=3 Degree of the polynomial kernel function ('poly'). Must be non-negative. Ignored by all other kernels. \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " gamma\n",
+ " gamma: {'scale', 'auto'} or float, default='scale' Kernel coefficient for 'rbf', 'poly' and 'sigmoid'. - if ``gamma='scale'`` (default) is passed then it uses 1 / (n_features * X.var()) as value of gamma, - if 'auto', uses 1 / n_features - if float, must be non-negative. .. versionchanged:: 0.22 The default value of ``gamma`` changed from 'auto' to 'scale'. \n",
+ " \n",
+ " \n",
+ " 'scale' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " coef0\n",
+ " coef0: float, default=0.0 Independent term in kernel function. It is only significant in 'poly' and 'sigmoid'. \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " shrinking\n",
+ " shrinking: bool, default=True Whether to use the shrinking heuristic. See the :ref:`User Guide `. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " probability\n",
+ " probability: bool, default=False Whether to enable probability estimates. This must be enabled prior to calling `fit`, will slow down that method as it internally uses 5-fold cross-validation, and `predict_proba` may be inconsistent with `predict`. Read more in the :ref:`User Guide `. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-3 Tolerance for stopping criterion. \n",
+ " \n",
+ " \n",
+ " 0.001 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " cache_size\n",
+ " cache_size: float, default=200 Specify the size of the kernel cache (in MB). \n",
+ " \n",
+ " \n",
+ " 200 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " class_weight\n",
+ " class_weight: dict or 'balanced', default=None Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The \"balanced\" mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as ``n_samples / (n_classes * np.bincount(y))``. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " verbose\n",
+ " verbose: bool, default=False Enable verbose output. Note that this setting takes advantage of a per-process runtime setting in libsvm that, if enabled, may not work properly in a multithreaded context. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_iter\n",
+ " max_iter: int, default=-1 Hard limit on iterations within solver, or -1 for no limit. \n",
+ " \n",
+ " \n",
+ " -1 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " decision_function_shape\n",
+ " decision_function_shape: {'ovo', 'ovr'}, default='ovr' Whether to return a one-vs-rest ('ovr') decision function of shape (n_samples, n_classes) as all other classifiers, or the original one-vs-one ('ovo') decision function of libsvm which has shape (n_samples, n_classes * (n_classes - 1) / 2). However, note that internally, one-vs-one ('ovo') is always used as a multi-class strategy to train models; an ovr matrix is only constructed from the ovo matrix. The parameter is ignored for binary classification. .. versionchanged:: 0.19 decision_function_shape is 'ovr' by default. .. versionadded:: 0.17 *decision_function_shape='ovr'* is recommended. .. versionchanged:: 0.17 Deprecated *decision_function_shape='ovo' and None*. \n",
+ " \n",
+ " \n",
+ " 'ovr' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " break_ties\n",
+ " break_ties: bool, default=False If true, ``decision_function_shape='ovr'``, and number of classes > 2, :term:`predict` will break ties according to the confidence values of :term:`decision_function`; otherwise the first class among the tied classes is returned. Please note that breaking ties comes at a relatively high computational cost compared to a simple predict. See :ref:`sphx_glr_auto_examples_svm_plot_svm_tie_breaking.py` for an example of its usage with ``decision_function_shape='ovr'``. .. versionadded:: 0.22 \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " random_state\n",
+ " random_state: int, RandomState instance or None, default=None Controls the pseudo random number generation for shuffling the data for probability estimates. Ignored when `probability` is False. Pass an int for reproducible output across multiple function calls. See :term:`Glossary `. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "SVC()"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x_train, x_test, y_train, y_test = train_test_split(x, y , train_size=0.8)\n",
+ "\n",
+ "model = SVC()\n",
+ "model.fit(x_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2d5022de",
+ "metadata": {},
+ "source": [
+ "### Calculating Score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "cc4faeb5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9916666666666667"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f490bb56",
+ "metadata": {},
+ "source": [
+ "LOL, Do I have to tune it😂"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "da52b92b",
+ "metadata": {},
+ "source": [
+ "## Hyper Parameter Tuning"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "20323446",
+ "metadata": {},
+ "source": [
+ "### Regularization (C)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "1f3e1001",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.0"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = SVC( C = 10 )\n",
+ "model.fit(x_train, y_train)\n",
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "bdbed8e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9972222222222222"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = SVC( C = 2 )\n",
+ "model.fit(x_train, y_train)\n",
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "70a2d421",
+ "metadata": {},
+ "source": [
+ "### Kernel"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "f765f825",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9972222222222222"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_kernel = SVC( kernel=\"poly\" )\n",
+ "model_kernel.fit(x_train, y_train)\n",
+ "model_kernel.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "75690032",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.875"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_kernel = SVC( kernel=\"sigmoid\" )\n",
+ "model_kernel.fit(x_train, y_train)\n",
+ "model_kernel.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0cdadc79",
+ "metadata": {},
+ "source": [
+ "### Gamma"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "a567ce08",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.07222222222222222"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_gamma = SVC( gamma=100000 )\n",
+ "model_gamma.fit(x_train, y_train)\n",
+ "model_gamma.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b0f83f09",
+ "metadata": {},
+ "source": [
+ "### Optimized Parameters\n",
+ "\n",
+ "1. **C** = 10\n",
+ "2. **kernel** = poly\n",
+ "3. **gamma** is making it worst at any value"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1765c1f6",
+ "metadata": {},
+ "source": [
+ "## Final Model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "5938f026",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9972222222222222"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_final = SVC( kernel=\"poly\", C=10 )\n",
+ "model_final.fit(x_train, y_train)\n",
+ "model_final.score(x_test, y_test)"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/11_random_forest/Exercise/solution_for_understanding.ipynb b/ML/11_random_forest/Exercise/solution_for_understanding.ipynb
new file mode 100644
index 00000000..10402bba
--- /dev/null
+++ b/ML/11_random_forest/Exercise/solution_for_understanding.ipynb
@@ -0,0 +1,1522 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e75365b4",
+ "metadata": {},
+ "source": [
+ "# Iris Classification using Random Forest"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "71da0be6",
+ "metadata": {},
+ "source": [
+ "## Imports and Data Loading"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "6166ae9f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.datasets import load_iris\n",
+ "from sklearn.ensemble import RandomForestClassifier"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "54275439",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR',\n",
+ " 'data',\n",
+ " 'data_module',\n",
+ " 'feature_names',\n",
+ " 'filename',\n",
+ " 'frame',\n",
+ " 'target',\n",
+ " 'target_names']"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris = load_iris()\n",
+ "dir(iris)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "f9f9074f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['setosa', 'versicolor', 'virginica'], dtype='\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " sepal length (cm) \n",
+ " sepal width (cm) \n",
+ " petal length (cm) \n",
+ " petal width (cm) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 5.1 \n",
+ " 3.5 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 4.9 \n",
+ " 3.0 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4.7 \n",
+ " 3.2 \n",
+ " 1.3 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4.6 \n",
+ " 3.1 \n",
+ " 1.5 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5.0 \n",
+ " 3.6 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 145 \n",
+ " 6.7 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 6.3 \n",
+ " 2.5 \n",
+ " 5.0 \n",
+ " 1.9 \n",
+ " \n",
+ " \n",
+ " 147 \n",
+ " 6.5 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.0 \n",
+ " \n",
+ " \n",
+ " 148 \n",
+ " 6.2 \n",
+ " 3.4 \n",
+ " 5.4 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 5.9 \n",
+ " 3.0 \n",
+ " 5.1 \n",
+ " 1.8 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "150 rows × 4 columns
\n",
+ ""
+ ],
+ "text/plain": [
+ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
+ "0 5.1 3.5 1.4 0.2\n",
+ "1 4.9 3.0 1.4 0.2\n",
+ "2 4.7 3.2 1.3 0.2\n",
+ "3 4.6 3.1 1.5 0.2\n",
+ "4 5.0 3.6 1.4 0.2\n",
+ ".. ... ... ... ...\n",
+ "145 6.7 3.0 5.2 2.3\n",
+ "146 6.3 2.5 5.0 1.9\n",
+ "147 6.5 3.0 5.2 2.0\n",
+ "148 6.2 3.4 5.4 2.3\n",
+ "149 5.9 3.0 5.1 1.8\n",
+ "\n",
+ "[150 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
+ "x = df\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "074f7c65",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " sepal length (cm) \n",
+ " sepal width (cm) \n",
+ " petal length (cm) \n",
+ " petal width (cm) \n",
+ " target \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 5.1 \n",
+ " 3.5 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 4.9 \n",
+ " 3.0 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4.7 \n",
+ " 3.2 \n",
+ " 1.3 \n",
+ " 0.2 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4.6 \n",
+ " 3.1 \n",
+ " 1.5 \n",
+ " 0.2 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5.0 \n",
+ " 3.6 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 145 \n",
+ " 6.7 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.3 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 6.3 \n",
+ " 2.5 \n",
+ " 5.0 \n",
+ " 1.9 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 147 \n",
+ " 6.5 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.0 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 148 \n",
+ " 6.2 \n",
+ " 3.4 \n",
+ " 5.4 \n",
+ " 2.3 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 5.9 \n",
+ " 3.0 \n",
+ " 5.1 \n",
+ " 1.8 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
150 rows × 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
+ "0 5.1 3.5 1.4 0.2 \n",
+ "1 4.9 3.0 1.4 0.2 \n",
+ "2 4.7 3.2 1.3 0.2 \n",
+ "3 4.6 3.1 1.5 0.2 \n",
+ "4 5.0 3.6 1.4 0.2 \n",
+ ".. ... ... ... ... \n",
+ "145 6.7 3.0 5.2 2.3 \n",
+ "146 6.3 2.5 5.0 1.9 \n",
+ "147 6.5 3.0 5.2 2.0 \n",
+ "148 6.2 3.4 5.4 2.3 \n",
+ "149 5.9 3.0 5.1 1.8 \n",
+ "\n",
+ " target \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 0 \n",
+ "3 0 \n",
+ "4 0 \n",
+ ".. ... \n",
+ "145 2 \n",
+ "146 2 \n",
+ "147 2 \n",
+ "148 2 \n",
+ "149 2 \n",
+ "\n",
+ "[150 rows x 5 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"target\"] = iris.target\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "735e480a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 0\n",
+ "1 0\n",
+ "2 0\n",
+ "3 0\n",
+ "4 0\n",
+ " ..\n",
+ "145 2\n",
+ "146 2\n",
+ "147 2\n",
+ "148 2\n",
+ "149 2\n",
+ "Name: target, Length: 150, dtype: int64"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = df.target\n",
+ "y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b77e1757",
+ "metadata": {},
+ "source": [
+ "## Model Building"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "cb353203",
+ "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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_estimators\n",
+ " n_estimators: int, default=100 The number of trees in the forest. .. versionchanged:: 0.22 The default value of ``n_estimators`` changed from 10 to 100 in 0.22. \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " criterion\n",
+ " criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\" The function to measure the quality of a split. Supported criteria are \"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the Shannon information gain, see :ref:`tree_mathematical_formulation`. Note: This parameter is tree-specific. \n",
+ " \n",
+ " \n",
+ " 'gini' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_depth\n",
+ " max_depth: int, default=None The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_samples_split\n",
+ " min_samples_split: int or float, default=2 The minimum number of samples required to split an internal node: - If int, then consider `min_samples_split` as the minimum number. - If float, then `min_samples_split` is a fraction and `ceil(min_samples_split * n_samples)` are the minimum number of samples for each split. .. versionchanged:: 0.18 Added float values for fractions. \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_samples_leaf\n",
+ " min_samples_leaf: int or float, default=1 The minimum number of samples required to be at a leaf node. A split point at any depth will only be considered if it leaves at least ``min_samples_leaf`` training samples in each of the left and right branches. This may have the effect of smoothing the model, especially in regression. - If int, then consider `min_samples_leaf` as the minimum number. - If float, then `min_samples_leaf` is a fraction and `ceil(min_samples_leaf * n_samples)` are the minimum number of samples for each node. .. versionchanged:: 0.18 Added float values for fractions. \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_weight_fraction_leaf\n",
+ " min_weight_fraction_leaf: float, default=0.0 The minimum weighted fraction of the sum total of weights (of all the input samples) required to be at a leaf node. Samples have equal weight when sample_weight is not provided. \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_features\n",
+ " max_features: {\"sqrt\", \"log2\", None}, int or float, default=\"sqrt\" The number of features to consider when looking for the best split: - If int, then consider `max_features` features at each split. - If float, then `max_features` is a fraction and `max(1, int(max_features * n_features_in_))` features are considered at each split. - If \"sqrt\", then `max_features=sqrt(n_features)`. - If \"log2\", then `max_features=log2(n_features)`. - If None, then `max_features=n_features`. .. versionchanged:: 1.1 The default of `max_features` changed from `\"auto\"` to `\"sqrt\"`. Note: the search for a split does not stop until at least one valid partition of the node samples is found, even if it requires to effectively inspect more than ``max_features`` features. \n",
+ " \n",
+ " \n",
+ " 'sqrt' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_leaf_nodes\n",
+ " max_leaf_nodes: int, default=None Grow trees with ``max_leaf_nodes`` in best-first fashion. Best nodes are defined as relative reduction in impurity. If None then unlimited number of leaf nodes. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_impurity_decrease\n",
+ " min_impurity_decrease: float, default=0.0 A node will be split if this split induces a decrease of the impurity greater than or equal to this value. The weighted impurity decrease equation is the following:: N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity) where ``N`` is the total number of samples, ``N_t`` is the number of samples at the current node, ``N_t_L`` is the number of samples in the left child, and ``N_t_R`` is the number of samples in the right child. ``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum, if ``sample_weight`` is passed. .. versionadded:: 0.19 \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " bootstrap\n",
+ " bootstrap: bool, default=True Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " oob_score\n",
+ " oob_score: bool or callable, default=False Whether to use out-of-bag samples to estimate the generalization score. By default, :func:`~sklearn.metrics.accuracy_score` is used. Provide a callable with signature `metric(y_true, y_pred)` to use a custom metric. Only available if `bootstrap=True`. For an illustration of out-of-bag (OOB) error estimation, see the example :ref:`sphx_glr_auto_examples_ensemble_plot_ensemble_oob.py`. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None The number of jobs to run in parallel. :meth:`fit`, :meth:`predict`, :meth:`decision_path` and :meth:`apply` are all parallelized over the trees. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary` for more details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " random_state\n",
+ " random_state: int, RandomState instance or None, default=None Controls both the randomness of the bootstrapping of the samples used when building trees (if ``bootstrap=True``) and the sampling of the features to consider when looking for the best split at each node (if ``max_features < n_features``). See :term:`Glossary ` for details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " verbose\n",
+ " verbose: int, default=0 Controls the verbosity when fitting and predicting. \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " warm_start\n",
+ " warm_start: bool, default=False When set to ``True``, reuse the solution of the previous call to fit and add more estimators to the ensemble, otherwise, just fit a whole new forest. See :term:`Glossary ` and :ref:`tree_ensemble_warm_start` for details. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " class_weight\n",
+ " class_weight: {\"balanced\", \"balanced_subsample\"}, dict or list of dicts, default=None Weights associated with classes in the form ``{class_label: weight}``. If not given, all classes are supposed to have weight one. For multi-output problems, a list of dicts can be provided in the same order as the columns of y. Note that for multioutput (including multilabel) weights should be defined for each class of every column in its own dict. For example, for four-class multilabel classification weights should be [{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of [{1:1}, {2:5}, {3:1}, {4:1}]. The \"balanced\" mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as ``n_samples / (n_classes * np.bincount(y))`` The \"balanced_subsample\" mode is the same as \"balanced\" except that weights are computed based on the bootstrap sample for every tree grown. For multi-output, the weights of each column of y will be multiplied. Note that these weights will be multiplied with sample_weight (passed through the fit method) if sample_weight is specified. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " ccp_alpha\n",
+ " ccp_alpha: non-negative float, default=0.0 Complexity parameter used for Minimal Cost-Complexity Pruning. The subtree with the largest cost complexity that is smaller than ``ccp_alpha`` will be chosen. By default, no pruning is performed. See :ref:`minimal_cost_complexity_pruning` for details. See :ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py` for an example of such pruning. .. versionadded:: 0.22 \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_samples\n",
+ " max_samples: int or float, default=None If bootstrap is True, the number of samples to draw from X to train each base estimator. - If None (default), then draw `X.shape[0]` samples. - If int, then draw `max_samples` samples. - If float, then draw `max(round(n_samples * max_samples), 1)` samples. Thus, `max_samples` should be in the interval `(0.0, 1.0]`. .. versionadded:: 0.22 \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " monotonic_cst\n",
+ " monotonic_cst: array-like of int of shape (n_features), default=None Indicates the monotonicity constraint to enforce on each feature. - 1: monotonic increase - 0: no constraint - -1: monotonic decrease If monotonic_cst is None, no constraints are applied. Monotonicity constraints are not supported for: - multiclass classifications (i.e. when `n_classes > 2`), - multioutput classifications (i.e. when `n_outputs_ > 1`), - classifications trained on data with missing values. The constraints hold over the probability of the positive class. Read more in the :ref:`User Guide `. .. versionadded:: 1.4 \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "RandomForestClassifier()"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = RandomForestClassifier()\n",
+ "x_train, x_test, y_train, y_test = train_test_split(x, y , train_size=0.8)\n",
+ "model.fit(x_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "8a31ea7f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.0"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5b1c6a02",
+ "metadata": {},
+ "source": [
+ "## Hyperparameter tuning, Though not needed here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "e40ec0a2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.0"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = RandomForestClassifier(n_estimators=50)\n",
+ "model.fit(x_train, y_train)\n",
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e77b16e3",
+ "metadata": {},
+ "source": [
+ "It has already reached the maximum."
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/13_kmeans/Exercise/solution_for_understanding.ipynb b/ML/13_kmeans/Exercise/solution_for_understanding.ipynb
new file mode 100644
index 00000000..b5a5f789
--- /dev/null
+++ b/ML/13_kmeans/Exercise/solution_for_understanding.ipynb
@@ -0,0 +1,610 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1b744bc9",
+ "metadata": {},
+ "source": [
+ "# K_Means Clustering And Elbow method"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07d4d403",
+ "metadata": {},
+ "source": [
+ "## IMports and Data Load"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "182cfb80",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sklearn.datasets import load_iris\n",
+ "from sklearn.cluster import KMeans"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "5b189a77",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR',\n",
+ " 'data',\n",
+ " 'data_module',\n",
+ " 'feature_names',\n",
+ " 'filename',\n",
+ " 'frame',\n",
+ " 'target',\n",
+ " 'target_names']"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris = load_iris()\n",
+ "dir(iris)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "54a5bfe7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " sepal length (cm) \n",
+ " sepal width (cm) \n",
+ " petal length (cm) \n",
+ " petal width (cm) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 5.1 \n",
+ " 3.5 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 4.9 \n",
+ " 3.0 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4.7 \n",
+ " 3.2 \n",
+ " 1.3 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4.6 \n",
+ " 3.1 \n",
+ " 1.5 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5.0 \n",
+ " 3.6 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 145 \n",
+ " 6.7 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 6.3 \n",
+ " 2.5 \n",
+ " 5.0 \n",
+ " 1.9 \n",
+ " \n",
+ " \n",
+ " 147 \n",
+ " 6.5 \n",
+ " 3.0 \n",
+ " 5.2 \n",
+ " 2.0 \n",
+ " \n",
+ " \n",
+ " 148 \n",
+ " 6.2 \n",
+ " 3.4 \n",
+ " 5.4 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 5.9 \n",
+ " 3.0 \n",
+ " 5.1 \n",
+ " 1.8 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
150 rows × 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
+ "0 5.1 3.5 1.4 0.2\n",
+ "1 4.9 3.0 1.4 0.2\n",
+ "2 4.7 3.2 1.3 0.2\n",
+ "3 4.6 3.1 1.5 0.2\n",
+ "4 5.0 3.6 1.4 0.2\n",
+ ".. ... ... ... ...\n",
+ "145 6.7 3.0 5.2 2.3\n",
+ "146 6.3 2.5 5.0 1.9\n",
+ "147 6.5 3.0 5.2 2.0\n",
+ "148 6.2 3.4 5.4 2.3\n",
+ "149 5.9 3.0 5.1 1.8\n",
+ "\n",
+ "[150 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "38f00279",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " petal length (cm) \n",
+ " petal width (cm) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1.3 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 1.5 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1.4 \n",
+ " 0.2 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 145 \n",
+ " 5.2 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 5.0 \n",
+ " 1.9 \n",
+ " \n",
+ " \n",
+ " 147 \n",
+ " 5.2 \n",
+ " 2.0 \n",
+ " \n",
+ " \n",
+ " 148 \n",
+ " 5.4 \n",
+ " 2.3 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 5.1 \n",
+ " 1.8 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
150 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " petal length (cm) petal width (cm)\n",
+ "0 1.4 0.2\n",
+ "1 1.4 0.2\n",
+ "2 1.3 0.2\n",
+ "3 1.5 0.2\n",
+ "4 1.4 0.2\n",
+ ".. ... ...\n",
+ "145 5.2 2.3\n",
+ "146 5.0 1.9\n",
+ "147 5.2 2.0\n",
+ "148 5.4 2.3\n",
+ "149 5.1 1.8\n",
+ "\n",
+ "[150 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#dropping the sepal column because we do not need them for this exercise\n",
+ "df.drop([\"sepal length (cm)\", \"sepal width (cm)\"], axis=\"columns\", inplace=True)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e283c46a",
+ "metadata": {},
+ "source": [
+ "## Checking Data Scattering"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "3712422f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(df[\"petal length (cm)\"], df[\"petal width (cm)\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc103165",
+ "metadata": {},
+ "source": [
+ "*Scale is comparable on x and y, we do not need to scale features*"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "455f087c",
+ "metadata": {},
+ "source": [
+ "## Predicting same type of flower through clustering"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "9591f9e3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "km = KMeans(n_clusters=3)\n",
+ "y_predicted = km.fit_predict(df)\n",
+ "y_predicted"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "8ad393f3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1.462 , 0.246 ],\n",
+ " [5.59583333, 2.0375 ],\n",
+ " [4.26923077, 1.34230769]])"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "km.cluster_centers_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e072e9a9",
+ "metadata": {},
+ "source": [
+ "## Visualizing Prediction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "ee052114",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAALiZJREFUeJzt3QtwFeXdx/F/iBBuGrVyTyAWLdaioIgKvghUKlMdG15fWqpVQKUzVbBBBlA6Vlunr7RoqXYKRZwKnTq+XkiAFq1KUcQqDq2UGfBC5aIgAuKMBBMtOMl55785J+SEc/bsObt7nr18PzNrcvZ2dteE88/u8zy/kkQikRAAAABDOph6YwAAAEUxAgAAjKIYAQAARlGMAAAAoyhGAACAURQjAADAKIoRAABgFMUIAAAw6iQJgebmZvnoo4/k5JNPlpKSEtOHAwAAHNBxVT/77DPp27evdOjQIdzFiBYilZWVpg8DAAAUYO/evVJRURHuYkTviKRO5pRTTjF9OAAAwIEjR45YNxNSn+OhLkZSj2a0EKEYAQAgXHI1saABKwAAMIpiBAAAGEUxAgAAjKIYAQAARlGMAAAAoyhGAACAURQjAADAKIoRAABgVCgGPQMAxERTk8irr4rs3y/Sp4/IqFEipaXF2bef7w3v7ozMnz9fhg8fbg3r2rNnT5kwYYJs377ddpvly5dbI6+1nTp37pzP2wIA4qCuTqSqSmTsWJHrr2/5qq91vt/79vO94W0x8sorr8j06dPljTfekLVr18qXX34pV155pTQ2Ntpup0O479+/v3X64IMP8nlbAEDU6Yf+xIkiH36YPn/fvpb5boqCXPueO9e/94YjJQnN9y3QoUOHrDskWqRcfvnlWe+MzJw5Uw4fPuwqaKe8vFzq6+vJpgGAqNHHI3oXon0xkKK5Jpr4unt3/o9Ncu1b6T51Pa/fG+L089tVA1bduTr99NNt12toaJABAwZYyX3V1dXy1ltv2a5/9OhR6wTaTgCAiNJ2GnbFgv7NvHdvy3pe71tlK0TcvjccK7gYaW5utu54XHbZZTJ48OCs6w0aNEgee+wxWb16tTz++OPWdiNHjpQPbX44tG2KVlKpSYsYAEBEaYNRL9dzu42f+4G3xYi2Hdm2bZs8+eSTtuuNGDFCJk+eLEOHDpXRo0dLXV2d9OjRQx555JGs28ybN8+665Ka9mpVCgCIJu254uV6brfxcz/wrmvvjBkzZM2aNbJhwwap0GdpeejYsaNccMEFsmPHjqzrlJWVWRMAIAa0C61+lmiD0UzNGFPtNnQ9r/ettC1Ic7P37w1/7oxoW1ctRFauXCkvvfSSnHnmmZKvpqYm2bp1q/ShygQApIqBhx8+/uHfVur1Qw8V1oA01751mjXLn/eGP8WIPprRdh9PPPGENdbIgQMHrOmLL75oXUcfyehjlpT77rtPXnzxRdm1a5ds3rxZbrjhBqtr77Rp0/J5awBAlF17rciKFSL9+qXP17sSOl+X+7XvBQv8e29437VXByzLZNmyZTJ16lTr+zFjxkhVVZXVpVfdcccdVjsRLVpOO+00GTZsmPziF7+wHtU4RddeAIgJRmCNFKef367GGSkWihEAAMKnKOOMAAAAuEUxAgAAjCK1FwCiKqgptMeOiSxeLLJzp8jAgSK33SbSqZPpo4JBFCMAEEUa7lZTkz4UuvYO0W6uJnuHaCjdwoXpQ7DPnt3SvVZ7tSCWeEwDAFHjZwKu20LkgQdOzILR1zpflyOW6E0DAFHiZwKu20czXbvah9Lp8Xz+OY9sIoTeNAAQR34m4LqhbUTsChGly3U9xA6PaQAgSvxMwHVDG6t6uR4ihWIEAKLEzwRcN7TXjJfrIVJoMwIAUWwzkisBlzYjKALajABAHPmZgOuGjiOSSsfNRpcz3kgs8ZgGAKLGzwRcN3QckTlzTiyE9LXOZ5yR2OIxDQBEFSOwwjBSewEAgFG0GQEAAKFAmxEAAGAUQXkAEMc2I7nak7hd7scx+719UNvY+Cko55wIgfr6eu0sb30FADhQW5tIVFToSCPHJ32t8+2W5drWyfJCud2vm+39Oqcgq/X/nJ1+flOMAEDU6IdJSUn6h4xOmea1XabTnDnZt3WyvNAPMrtjdrJfN9u7fe8wqi3OOTstRujaCwBxSu21o4OideiQO1k32/JCR3d1mzTsZvugphz7qYjnTG8aAIijXKm9dvRvYyfJul4nArtNGnazfVBTjv0UwHOmNw0AREmx03i9OAa3ScNutg9qyrGfAnjOFCMAECXFTuP14hjcJg272T6oKcd+CuA502YEAOKU2utFm5HmZm8Tgd0mDbvZPqgpx34q4jnTZgQA4shJaq/dMk3O1e8zLdcplbzrZSKw26RhN9sHNeXYTwE8Zx7TAECcUntra1umbIm+mpxrl/iba3mhicBuk4bdbB/UlGM/BeyceUwDAFHFCKyMwGp4BFZSewEAgFG0GQEAAKFAmxEAAGAUqb0AgOIiWTc41zMgKEYAAMVTVydSU5M+HLn24NCuprl6cLjZNqrqonFNeEwDACjeB+fEiSfmoujgWzpfl/uxbVTVReea0LUXAOA/knWDcz2LiN40AIDgIFk3ONczgHhMAwDwH8m6wbmeAUQxAgDwH8m6wbmeAUQxAgDwn3Y31TYM7YPZUnR+ZWXLel5uG1WjonVNKEYAAP4jWTc41zOAKEYAAMVBsm5wrmfA0LUXAFBcjMAanOvpM1J7AQCAUYwzAgAAQoE2IwAAwCiC8gAA3rZTyNWGwc22bo4rrJoieE7tUIwAALxLilV2KbJutnVzXCHqWRL5c8qA3jQAgPyTYjX7JO3TpOTEeW2XqdmzRR58sLBtc3VVtTsuJ9sHUV34z4neNACA4ibF5qKPFnQf+cqVQBuSBNu8NEXjnOhNAwAoblJsLoUUIk4SaCOWYBvZc7JBbxoAQDgSYLO9f8QSbCN7TjYoRgAA4UiAzfb+EUuwjew52aAYAQB4kxSbi7ZtKGTbXAm0EUuwjew52aAYAQB4lxSbbZlOs2YVtm2uBNqIJdhG9pxsUIwAALxJiq2tbZmypcguWFD4trm6sEYowTbS55QF44wAAPLnYhTVxiNHpHt5ufV9w3PPSbcrr2QE1oiOwMo4IwCAQGpsbJTu3btb3zc0NEi3bt1MHxIMFyMMBw8AKFoR0vZr++8pSuKLYgQAUBSpuyFt9erVq/X7RLYh4RF5FCMAEFRu0m9zLQ9xO4RQ8vN6N0Xg/2UiD/fff3/ioosuSnTv3j3Ro0ePRHV1deLdd9/Nud3TTz+dGDRoUKKsrCwxePDgxLPPPpvP2ybq6+u1XLa+AkAs1NYmEhUVeq/g+KSvdb7b5bm29UlDQ4M1HTx40Po3XSf9PjU/svy83rVm/l96/fmdVzEyfvz4xLJlyxLbtm1LbNmyJXHVVVcl+vfvb/tD9NprryVKS0sTCxYsSLz99tuJu+++O9GxY8fE1q1bPT8ZAIgE/SApKUn/gNFJ5+k0Z07hy9vPa79tET7E9DMjVYxEughx8v/SzfWu9XHfHnH6+e2qa++hQ4ekZ8+e8sorr8jll1+ecZ1JkyZZDZTWrFnTOu/SSy+VoUOHypIlSzxtjQsAoeckrbVDh+yhc7mW2ylSEmxsetP4mbzbFI5U36Kk9urO1emnn551nY0bN8q4cePS5o0fP96an83Ro0etE2g7AUAsOElrtSs0ci23U6QkWC0+knfmo1uI+J28+2q0Un0LLkaam5tl5syZctlll8ngwYOzrnfgwIG01tJKX+v8bObPn29VUqmpUsffB4A4CEIKaxCOIQr8TN7dH61U34KLkenTp8u2bdvkySef9PaIRGTevHnWXZfUtFerOwCIgyCksAbhGKLAz+TdPtFK9S2oGJkxY4bVBuTll1+WCn0mZaN3795y8ODBtHn6WudnU1ZWZj1bajsBQCw4SWu1awOQa7mdiCXBRjp5d1S0Un3zKkb0+Z4WIitXrpSXXnpJzjzzzJzbjBgxQtatW5c2b+3atdZ8AEABaa2afptKwi1keUySYCOdvFsasVTffLro3HrrrYny8vLE+vXrE/v372+dPv/889Z1brzxxsRdd92V1rX3pJNOSjz44IOJd955J3HvvffStRcAChk/orLSfhwRp8tzbQtv+Xm9a4P9/9KXrr0lWW4HLVu2TKZOnWp9P2bMGKmqqpLly5e3Ln/mmWfk7rvvlvfff1/OPvtsWbBggVx11VWOCya69gKIJUZgjY6YjsB6xGHXXlfjjBQLxQgAAOFTlHFGAAAA3KIYAQAARpHaCwBhlautwLFjIosXi+zcKTJwoMhtt4l06uTNvqMojuccEBQjABBGdXUiNTXpQ4LruBPa3fPaa0XmzhVZuDB9aPjZs1u6/S5Y4G7fURTHcw4QGrACQBg/OCdObOnI2Vaqx+N3viOyenX27efMyV6Q5Nr3ihXR+3CO4zkXCb1pACCKnKS15uokqY8ePv/8xEc2IUmC9VQcz7mI6E0DAFHkJK3VyQewtiWJeBKsI3E85wCiNw0AhIlXKazaqDXiSbCOxPGcA4hiBADCxKsUVu1dE/EkWEfieM4BRANWAAhjG4d9+zI/kvGizYjdvqPWfiKO51xEtBkBgChyktZaXW2/D+3em2m8kaglwToRx3MOIB7TAEDYaDdT7W7ar1/6fP0LXuevWtXSfbf9B6i+tuvW62TfUeziGsdzDhge0wBAWDECa3GvJ/LGOCMAAMAo2owAAIBQoM0IAAAwiqA8ADDqCw2LEZH3RORsEXlARLq4T9012QYi13G7OS5T25rcdxwkQqC+vl47f1tfASA6qhOJhGSYqhOJOXMSidJSHfni+KSvdb4TtbWJREVF+vb6Wuf7KddxuzkuU9ua3HfIOf38phgBgEAVIpJINEsiUdfmg639lKsg0Q/BkpITt9N5Ovn1IanHle2YdaquLvy43JyTn9fD1LWOWDFC114AMPJopmv2xamBQDvrI488RlA1mUKrj2a6dm15/0LYHZebc/LzepD4mxO9aQAgsLSNiI2S5PTrPFN3TabQ6vEUWojkOi435+Tn9SDx1zP0pgGAotPGqg6clWfqrskU2mzHk69Mx+XmnPy8HiT+eoZiBACKTnvNOLAjz9Rdkym02Y4nX5mOy805+Xk9SPz1DG1GACCKbUaKnUJbjDYjhZyTn9eDxN+caDMCAIGl44jkSNZdlaUQsUvdNZlCq8ejx2VH04T1GPI9Ljfn5Of1IPHXMzymAQAjVmUvSEqqRTYWmLprMoVWj8suLVjThAs9Ljfn5Of1IPHXEzymAQCjGIGVEViji9ReAABgFG1GAABAKNBmBAAAGEVqLwDkpN1VdYROHRhLx6MYpa0yzV83kmIRERQjAGCrTkRqRKTtkOIVIqLdRX3qleJEXZ1ITU36UOfaO0S7sfrVWwbwCY9pAMC2EJnYrhBR+5LzdbmhQmTixBMzV3RgL52vy4EQoRgBgKyPZvSOSIZRO1vnzUyuV+RHM3pHJNNooql5M2e6C60DioxiBAAy0jYiNmmvVkGyN7leEZEUiwiiGAGAjJymuHqcfpvz7Qyl8gI+ohgBgIycprh6nH6b8+0MpfICPqIYAYCMRiV7zbQLV2ul8yuT6xXRqFEtvWbah761HlaJSGVly3pASFCMAEBGOo5IMu31hIIk9fqh4o83QlIsIohiBACy0vE6VohIu7RX646Jzjc0ngdJsYgYUnsBICdGYAX8DMpjBFYAyEkfxYwJ3nXSRzZjAnhcQJ54TAMAAIyiGAEAAEbxmAYAfG0zYrC9SRRTfaN4TqAYAQD/UnsNJv5GMdU3iucEC49pAMCX1F6Dib9RTPWN4jmhFV17ASDr45Uqm7C8kuRdjt0ZHru42daDxxhVVSd+aLe+dUnL3YTdu8PzeCOK5xQTRxx27eXOCAB4ntprMPE3iqm+UTwnpKEYAQDPU3sNJv5GMdU3iueENBQjAOB5aq/BxN8opvpG8ZyQhmIEADxP7TWY+BvFVN8onhPSUIwAgOepvQYTf6OY6hvFc0IaihEA8CW112DibxRTfaN4TmhF114AyIkRWAODEVgj2bWXYgQAAPiCcUYAAEAo0GYEAAAYRWovgIjwMx23XkSuFpE9ItJfRJ4VkXKH7+vmuI6JyGIR2SkiA0XkNhHp5HzftK9AVO+MbNiwQa655hrp27evlJSUyKpVq2zXX79+vbVe++nAgQNujhsA2qhLZsGMFZHrk1/1tRfhaWeJyKki8lpyCPfXkq/PcvC+bo5rroh0FZE7ROR3ya9dk/Md7FuD4zTPZexYkeuvb/mqrwmUQxSKkcbGRhkyZIgsWrQor+22b98u+/fvb5169uyZ71sDQJHTcc9K3pXIROf/j837znVxXLrtA8k7H201JedPsN/3G3NJuEWouOpNo3c4Vq5cKRMm6C9G9jsjY8eOlU8//VROPVX/mvCvNS6AuPEzHVcfzRT2b1aL0gzFhJPjOpa8A5Jt2xwSJSIfdRDp3yTSnOmtSbhFjHvTDB06VPr06SPf+ta35LXX9DZndkePHrVOoO0EAMVNx9U2Im40FXhciwsvRFRJQqRfU/aR5km4RQD5XoxoAbJkyRKpra21psrKShkzZoxs3rw56zbz58+3KqnUpNsAQHHTcbWxqt8yHVe2x0J5ypUZR8It4tSbZtCgQdaUMnLkSNm5c6f85je/kT/96U8Zt5k3b57MmjWr9bXeGaEgAVDcdNz+ybsXfsp0XNprxgO56i8SbhH3cUYuvvhi2bFjR9blZWVl1rOlthMAFDcdV7vvulFa4HHd5rB9S0n2NiP7SkX+nm0zEm4RPEaKkS1btliPbwDAHT/Tccsd3qXI9L46zSrwuHQckeN3hjOrzr5vnbV3lkizfk/CLSJajDQ0NFjFhE5q9+7d1vd79uxpfcQyefLk1vUfeughWb16tXUnZNu2bTJz5kx56aWXZPr06V6eB4DY8jMdd4dNQaLza23ed4GL49Jt52QoVkqT81fZ7/vSBSTcItpde1NdddubMmWKLF++XKZOnSrvv/++tZ5asGCBLF26VPbt2yddu3aV888/X+65556M+8iGrr0AcmMEVkZgRdCQ2gsAAIwK3DgjAAAAmVCMAAAAo0jtBRCRdh1u5ErHdXNOLpN3o4g0YbRDMQKgSDQYrqbd8O0Vya65bnq8uKWhdAvbDcE+O9m9Vnu1uDmnXPsO6jXxkaYG19SIfNjmnCsqRB5+WOTaiJ4z/A3KKxZ60wBRSdZt/89NahwMt11wC5VKx81mjk1BkuucviMiq3OMFfLnAF4TnwuRiRNb8nHaSo2HsmIFBUnE0JsGQAySdd1wko6rx/N5hkc2Ts7Jzd95pq6Jz49mqqrS74i0RZpwJNGbBkBA+Jms64aTdNym5HqFnJMbpq6Jj159NXshokgTjjV60wAIcbKuGztdrFesYy32NfGR05Rg0oRjiWIEQIiTdd0Y6GK9Yh1rhDK8nOaRkVsWSzRgBeCzVPuKfVkeX4S5zYjdOTl5VJNtvQi3Gdm378QGrIo2I5FEmxEAMUjWdcNJOu6sLOONODmnVLJuAcm7xq6Jj0pLW7rvKtKE0Q6PaQCEPFnXjVzpuAtcnNMqd8m7UevWq3QcEe2+26/dOes4I3TrjTUe0wAoouKONtrY2Cjdu3e3vm9oaJBu3bplWZMRWIuKEVhj44jDoDyKEQCR5bwYAWCyGGE4eACRLELafm3/PUUJECwUIwAiJ3U3pK1evXq1fh+CFAwgVihGALRjMkX2i2TjzvdE5OxkbkwXh+062i7P5Vieybl2y2OYugt4jGIEQBsmU2QntAuWe1FEFiW7wH4tR/ptejpuQ4P+t4M0Nv5IevVqGc794EF9PJPatmseybl2yyV+qbuAD2jACiAAybrtC5F8DBeRf2Rcos1EUk9stEA5sf1qruRcLXgezLI826OeCKfuAnmiNw2AkCTrfpG8U+G93MWInZLkUEy5wvQkHiOoAgVgBFYAIUnW1TYi/tDiQ9uq6pR/r95EgYVIRFN3AR8xAisAw8m62lg1qiKUugv4iGIEgOFkXe01E1URSt0FfEQxAiDZHbUiQ2hbis6vTK7nNe2+G0QlLtp7+Hm9gOihGAFgOFm3i4OE21y9aQpVnTy/bOc8K8fy9t9HOHUX8BHFCIAAJOuusilIqnOk327KsdxNcu4Cm+W1ySlGqbuATxhnBEAER2BtvzzXtozACviBcUYAAIBRjDMCAABCgTYjAADAKILyABSRm7YZbvft17Ym9w1EA8UIgCJxk46bq2eKqW2DnIIMhAePaQAUMRG4ff7NvuT8uTmW17nYt1/b5uLnvoFooWsvAMOJwJJ8bNFUQAKum7RhP5OKTaYgA8FBbxoAIUkElhzpuHYJuG7Shv1MKjaZggyED49pAIQkuXa/x2nDfiYVm0xBBsKHYgRASJJr+3icNuxnUrHJFGQgfChGABhOBJZku4lCEoPdpA37mVRsMgUZCB+KEQCGE4FLkum42ZbbJeC6SRv2M6nYZAoyED4UIwACkAhsl46bKwHXTdqwn0nFJlOQgXChay+AImIEVkZgRZwcOXJEysvLpb6+Xk455ZSs6zECK4Ai0scSY1wslwBua3LfQDTwmAYAABhFMQIAAIziMQ3gmzimtfrZJgRAVFGMAL6IY1qrn6m8AKKMxzSA5+KY1upnKi+AqKMYATzVlPzrX4PQ2kvNm5kjGC6K57wwZtcEQD4oRgBPxTGt1ck5F5rKCyAOKEYAT8UxrdXPVF4AcUAxAngqjmmtfqbyAogDihHAU3FMa3Vyznbdd6N4TQDkg2IE8FQc01qdnPOsNgm9cbgmAPJBMQJ4Lo5prX6m8gKIOlJ7Ad/EcbRRRmAFcBypvYBxcUxr9TOVF0BU8ZgGAAAYRTECAACMIigPCKVjIrJYRHaKyEARuU1EOhVhW7/bwtjtO45tcIB4yPvOyIYNG+Saa66Rvn37SklJiaxatSrnNuvXr5cLL7xQysrK5KyzzpLly5cXerwArNC5riJyh4j8Lvm1a3K+n9tKMtCuSkTGisj1ya9VHgXd2e3bz/cFELpipLGxUYYMGSKLFi1ytP7u3bvl6quvlrFjx8qWLVtk5syZMm3aNHnhhRcKOV4g5rRoeCBD1ktTcv5cn7b1O43Ybt//k5xI/AWiylXXXr0zsnLlSpkwYULWde6880559tlnZdu2ba3zvv/978vhw4fl+eef97RrEBBtx5J3MexC5/SxxecZHru42VaS21XZBOKVJMcM2V3Ao5Nc+7bj5n0B+M3p57fvDVg3btwo48aNS5s3fvx4a342R48etU6g7QRgcY5iQpLLdT0vt/U7jTjXvu2Q+AtEge/FyIEDB6RXr15p8/S1FhhffPFFxm3mz59vVVKpqbJScyuAuNvpYj032/qdRuxFWi+Jv0CYBbJr77x586xbOqlp7179iwuIu4Eu1nOzrd9pxF6k9ZL4C4SZ78VI79695eDBg2nz9LU+O+rSpUvGbbTXjS5vOwG4zUG7iNLkel5u63caca592yHxF4gC34uRESNGyLp169LmrV271poPIB+dkum3dmZlaYDqZlu/04id7NuP9wUQ2mKkoaHB6qKrU6rrrn6/Z8+e1kcskydPbl3/Rz/6kezatUvmzp0r7777rixevFiefvppueMOHd8AQH40/XZOhg/f0uT8BT5t63casd2+a5MTib9AVOXdtVcHMNMxQ9qbMmWKNZjZ1KlT5f3337fWa7uNFh9vv/22VFRUyE9/+lNrPafo2gu0xwisjMAKBJ/Tz29X44wUC8UIAADhE5hxRgAAAOxQjAAAAKMoRgAAgFEUIwAAwCiKEQAAYBTFCAAAMIpiBAAAGEUxAgAAjKIYAQAARlGMAAAAoyhGAACAURQjAADAKIoRAABgFMUIAAAwimIEAAAYRTECAACMohgBAABGUYwAAACjKEYAAIBRFCMAAMAoihEAAGAUxQgAADCKYgQAABhFMQIAAIyiGAEAAEZRjAAAAKMoRgAAgFEUIwAAwCiKEQAAYBTFCAAAMIpiBAAAGEUxAgAAjKIYAQAARlGMAAAAoyhGAACAURQjAADAKIoRAABgFMUIAAAwimIEAAAYRTECAACMohgBAABGUYwAAACjKEYAAIBRFCMAAMCok8y+PfLV1CTy6qsi+/eL9OkjMmqUSGkp1xEAEF4UIyFSVydSUyPy4YfH51VUiDz8sMi115o8MgAACsdjmhAVIhMnphciat++lvm6HACAMKIYCcmjGb0jkkicuCw1b+bMlvUAAAgbipEQ0DYi7e+ItC9I9u5tWQ8AgLChGAkBbazq5XoAAAQJxUgIaK8ZL9cDACBIKEZCQLvvaq+ZkpLMy3V+ZWXLegAAhA3FSAjoOCLafVe1L0hSrx96iPFGAADhRDESEjqOyIoVIv36pc/XOyY6n3FGAABhxaBnIaIFR3U1I7ACAKKFYiSEj2zGjDF9FAAAeIfHNAAAwCiKEQAAYBSPaSKGVF8AQCzujCxatEiqqqqkc+fOcskll8imTZuyrrt8+XIpKSlJm3Q7eE/D8qqqRMaOFbn++pav+poQPQBApIqRp556SmbNmiX33nuvbN68WYYMGSLjx4+Xjz/+OOs2p5xyiuzfv791+uCDD9weN9oh1RcAEJtiZOHChfLDH/5QbrrpJjn33HNlyZIl0rVrV3nssceybqN3Q3r37t069erVy+1xow1SfQEAsSlGjh07Jm+++aaMGzfu+A46dLBeb9y4Met2DQ0NMmDAAKmsrJTq6mp56623bN/n6NGjcuTIkbQJ2ZHqCwCITTHyySefSFNT0wl3NvT1gQMHMm4zaNAg667J6tWr5fHHH5fm5mYZOXKkfPjhh1nfZ/78+VJeXt46aRGD7Ej1BQCEme9de0eMGCGTJ0+WoUOHyujRo6Wurk569OghjzzySNZt5s2bJ/X19a3T3r17/T7MUCPVFwAQm669Z5xxhpSWlsrBgwfT5utrbQviRMeOHeWCCy6QHTt2ZF2nrKzMmpBfqu++fSKJxInLNUxPl5PqCwAI/Z2RTp06ybBhw2TdunWt8/Sxi77WOyBO6GOerVu3Sh+nf84jJ1J9AQCxekyj3XofffRR+eMf/yjvvPOO3HrrrdLY2Gj1rlH6SEYfs6Tcd9998uKLL8quXbusrsA33HCD1bV32rRp3p5JzJHqCwCIzQiskyZNkkOHDsk999xjNVrVtiDPP/98a6PWPXv2WD1sUj799FOrK7Cue9ppp1l3Vl5//XWrWzC8RaovACCMShKJTK0MgkW79mqvGm3MqgOoAQCA4HP6+U1QHgAAMIpiBAAAGEVqb8CSc7/4QmTOHJH33hM5+2yRBx4Q6dLF+b7dvDeJvwAAIxIhUF9fr+1arK9BV1ubSFRUaDuc45O+1vm5VFenb5eadL6Tfbt5bzfbAgDg5vObBqw+JOe2bxKsg46pFStaerxkMmGCyOrV2fc9fLjIP/+Zfd+zZ4s8+GBh7+3muAEAcNuAlWLEI/qIo6pKJFvkTmoU1N27T3xsoo9munYt/L1139qbWo8h3/d2c9wAANihN02IknO1jYgbuu9shUiu9ybxFwBgGr1pApCcq41ViyHTe5P4CwAwjWIkAMm52mumGDK9N4m/AADTaDPikVTbi1zJuUFtM1LIcQMAYIc2IyFKztVxRKqr7fevvWl0P9n2PWuW/fJs703iLwDANB7TBCQ5d9Wq7AWJzt+0yX7fCxYU/t4k/gIATOIxjQ8YgRUAAGGcEQAAYBZtRgAAQCjQZgQAABhFaq8Pjh0TWbxYZOdOkYEDRW67TaRTJ2fJvG6Tc0neBQCEDQ1YPTZ3rsjCheljfmgxoV1vtcdLtkA87TEzebJITU36sPLaG0a7DDsJqtPAOzfbAwDgJYLyDBUiepcjG71LondL8uE0OZfkXQBA0FCMGHg0o6Oo2gXWFSrXKKgk7wIAgojeNEWmbUT8KERype4qkncBAGFGbxqP5Pv4pRDZEnZJ3gUAhBnFiEe0PYjfsiXskrwLAAgzihGPaPddv1Jttc1IZWVLN99MdL62KWkfkud0ewAATKIY8YiOI6Ldd93ePck3dVeRvAsACDOKEQ/pOCI6mFn7okFf6/wdO7In8159daOWHpJIaPWh3ztP3VUk7wIAwopBzwIyAmtzc6N0797dWv7ccw1y+HA3RmAFAIQa44yERGNjY+vXXr16Wd8fPHhQunXrZn2f+goAQFSLEbJpDEvdDWkrVZSohA4yAgBAhNFmBAAAGBXbYkRHS12/XuT//q/la76jp2q7EO3hcvvtLV/1dUpDg8h//7fI+ee3fNXXbR04INK7t0jnziI9ezbIzp0N1qOZlMrKg9K1a4P0798ghw6lb1tfL/Jf/yXSv3/LV33t1Xm5vSYAABQkEQL19fX6rML66oXa2kSiokKffxyf9LXOd2LOnESitDR9e32t84cPT5+fmnS+6to18/IuXRqsc2yZGtKWlZe3bDtwYOZtdb7b83J7TQAAKPTzO3a9adym2+ZK5rWj75H9amtD1lT7Eb2V0i2PbbWdicjHHxd2XiT+AgD8QG8a8T7d1s9kXj/ZnReJvwAAv5Da60O6rZ/JvH6yOy8SfwEApsWqAavbdNtiJPP6KdN5kfgLADAtVsWI23TbYiTz+inTeZH4CwAwLVYNWFPtI/bty9wYNM5tRgq9JgAAZEObER/SbZ0k89pp/55ebqu9aXSdfM+LxF8AgGmxekzjRbptrmTe4cMzb6fzm5tb7qxkovPLyzMv0/m6bbbHRDpfB1Ir9LxI/AUAmBSrxzTtH09oTxJtwKntJkaNyu8xhF0yr464euONx5f96U+aQXN8Wy0chg4VOXxY5NRTRbZsaRmRVemIqxdf3PK1Rw+RTZtavqboiKtXXy2yZ0/LKKzPPptexLg5L7fXBACAthhnBAAAGEWbEQAAEAqxazMCAACC5STTBxBUfrafsGtvYrcMAIAoim0DVjsaHFdTkz50vPZK0W7BuXrb5KJBewsXpo9VokVOqstwtmXaiwcAgDChAWuB/EywdZP4q92GKUgAAGFCMVIAPxNs3Y7equ/3+ec8sgEAhAe9aQrgZ4Kt28Rf3Vb3AQBA1NCbpkgJtl4k/oY9NRgAgEwoRoqUYOtF4m/YU4MBAMiE3jRFSrClzQgAIG6OOOwNy52RIiXYuk381W0ZbwQAEEUUI0VMsM2V+Gu3jG69AICo4jFNFozACgCAO4wzAgAAjKLNCAAACAXajAAAAKMoRgAAQPiKkUWLFklVVZV07txZLrnkEtm0aZPt+s8884ycc8451vrnnXeePPfcc4UeLwAAiHsx8tRTT8msWbPk3nvvlc2bN8uQIUNk/Pjx8vHHH2dc//XXX5frrrtObrnlFvnXv/4lEyZMsKZt27Z5cfwAACBuXXv1Tsjw4cPld7/7nfW6ublZKisr5fbbb5e77rrrhPUnTZokjY2NsmbNmtZ5l156qQwdOlSWLFniaWtcAAAQ8d40x44dkzfffFPGjRt3fAcdOlivN27cmHEbnd92faV3UrKtr44ePWqdQNsJAABEU17FyCeffCJNTU3Sq1evtPn6+sCBAxm30fn5rK/mz59vVVKpSe+8AACAaApkb5p58+ZZt3RS0969e00fEgAA8MlJ+ax8xhlnSGlpqRw8eDBtvr7u3bt3xm10fj7rq7KyMmtKSTVr4XENAADhkfrcztU8Na9ipFOnTjJs2DBZt26d1SMm1YBVX8+YMSPjNiNGjLCWz5w5s3Xe2rVrrflOffbZZ9ZXHtcAABA++jmuzS48KUaUduudMmWKXHTRRXLxxRfLQw89ZPWWuemmm6zlkydPln79+lntPlRNTY2MHj1afv3rX8vVV18tTz75pPzzn/+UpUuXOn7Pvn37Wo9qTj75ZCkpKREvKzYtcHTf9NLhmvmBnzGumd/4GeN6BflnTO+IaCGin+N28i5GtKvuoUOH5J577rEaoWoX3eeff761keqePXusHjYpI0eOlCeeeELuvvtu+clPfiJnn322rFq1SgYPHuz4PXV/FRUV4he9uBQjXDM/8TPGNfMbP2Ncr6D+jNndESl4nJEoYfwSrhk/Y8HD7yXXi5+v+P1OBrI3DQAAiI9YFyPaY0eHtW/bcwdcM37GzOL3kuvFz1f8fidj/ZgGAACYF+s7IwAAwDyKEQAAYBTFCAAAMIpiBAAAGBXLYmTDhg1yzTXXWCPC6YiuOggbstPRdIcPH26NgNuzZ08rCmD79u1cMhu///3v5fzzz28dJEjjD/76179yzRz65S9/af1uto2RQLqf/exn1jVqO51zzjlcJhv79u2TG264Qb7yla9Ily5d5LzzzrNGBEdmVVVVJ/yM6TR9+nTxWiyLER2+fsiQIbJo0SLThxIKr7zyivXD98Ybb1i5Ql9++aVceeWV1nVEZjpisH6gvvnmm9Y/dt/85jelurpa3nrrLS5ZDv/4xz/kkUcesYo52PvGN74h+/fvb53+/ve/c8my+PTTT+Wyyy6Tjh07Wn8YvP3221ZMyWmnncY1s/ldbPvzpf/+q+9+97vitbyHg4+Cb3/729YEZ3S4/7aWL19u3SHRD9rLL7+cy5iB3nlr63//93+tuyVa0OkHCDJraGiQH/zgB/Loo4/KL37xCy5TDieddJJtAjqO+9WvfmXlqyxbtqx13plnnsklstGjR4+01/oH1sCBA628Oa/F8s4I3NEhgdXpp5/OpXSgqanJCojUO0n5pFXHkd6B00DNcePGmT6UUHjvvfesx81f/epXrSJOs8GQ2Z///Gcr4FX/qtc/pi644AKr6IUzx44dk8cff1xuvvlmTwNrY31nBIVrbm62nuPr7c58wg7jaOvWrVbx8Z///Ee6d+8uK1eulHPPPdf0YQWWFmybN2+2bg0jt0suucS6Szlo0CDrFvrPf/5zGTVqlGzbts1q34V0u3btsu5OavK8hrbqz9mPf/xj6dSpk5VED3vatvLw4cMydepU8QPFCPL+y1X/sePZdG76IbFlyxbrTtKKFSusf/C0/Q0FyYk0mrympsZ6Jt25c2d+Kx1o+6hZ29docTJgwAB5+umn5ZZbbuEaZvhDSu+M3H///dZrvTOi/5YtWbKEYsSBP/zhD9bPnN6J8wOPaeDYjBkzZM2aNfLyyy9bDTRhT//iOuuss2TYsGFWjyRtNP3www9z2TLQ9kcff/yxXHjhhVY7CJ20cPvtb39rfa+PumDv1FNPla997WuyY8cOLlUGffr0OeEPga9//es82nLggw8+kL/97W8ybdo08Qt3RpCTxhfdfvvt1mOG9evX0+jLxV9mR48e5ScugyuuuMJ6rNXWTTfdZHVVvfPOO6W0tJTr5qDx786dO+XGG2/kWmWgj5bbD0nw73//27qbBHva6Ffb2Wh7Lr+cFNdf2rZ/Pezevdu6na4NMvv372/02IL6aOaJJ56Q1atXW8+iDxw4YM0vLy+3+urjRPPmzbNuaerP02effWZdPy3kXnjhBS5XBvpz1b4NUrdu3azxIGiblNns2bOtXlv6YfrRRx9ZqapatF133XX8jGVwxx13yMiRI63HNN/73vdk06ZNsnTpUmuC/R9RWozoY2a9S+mbRAy9/PLLmlR8wjRlyhTThxZIma6VTsuWLTN9aIF18803JwYMGJDo1KlTokePHokrrrgi8eKLL5o+rFAZPXp0oqamxvRhBNakSZMSffr0sX7G+vXrZ73esWOH6cMKtL/85S+JwYMHJ8rKyhLnnHNOYunSpaYPKfBeeOEF69/77du3+/o+Jfof/0odAAAAezRgBQAARlGMAAAAoyhGAACAURQjAADAKIoRAABgFMUIAAAwimIEAAAYRTECAACMohgBAABGUYwAAACjKEYAAIBRFCMAAEBM+n8ErnKWAX8DbAAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#appending prediction colulmn\n",
+ "df[\"clusters\"] = y_predicted\n",
+ "\n",
+ "#plotting different clusters\n",
+ "plt.scatter(df[\"petal length (cm)\"][df.clusters==0], df[\"petal width (cm)\"][df.clusters==0], color=\"blue\")\n",
+ "plt.scatter(df[\"petal length (cm)\"][df.clusters==1], df[\"petal width (cm)\"][df.clusters==1], color=\"red\")\n",
+ "plt.scatter(df[\"petal length (cm)\"][df.clusters==2], df[\"petal width (cm)\"][df.clusters==2], color=\"yellow\")\n",
+ "\n",
+ "#plotting centroids\n",
+ "plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:,1], color=\"black\", marker=\"+\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "50275a8d",
+ "metadata": {},
+ "source": [
+ "😘"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5fdcd33f",
+ "metadata": {},
+ "source": [
+ "## Elbow Method"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "192ffea5",
+ "metadata": {},
+ "source": [
+ "### Calculating SSE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "5fba887a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[550.8953333333334,\n",
+ " 86.39021984551397,\n",
+ " 31.37135897435897,\n",
+ " 19.48300089968511,\n",
+ " 13.983213141025638,\n",
+ " 11.147086299967423,\n",
+ " 10.99333075619227,\n",
+ " 8.099060606060608,\n",
+ " 7.800877025394053,\n",
+ " 6.0986768476621425]"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "k_rng = range(1,11)\n",
+ "sse = []\n",
+ "\n",
+ "for k in k_rng:\n",
+ " km = KMeans(n_clusters=k)\n",
+ " km.fit(df.drop([\"clusters\"], axis=\"columns\"))\n",
+ " sse.append(km.inertia_) #inertia_ stores the sum of squared error for km, which we try to find using elbow method\n",
+ "\n",
+ "sse"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f22d0911",
+ "metadata": {},
+ "source": [
+ "### Plotting"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "2ac77490",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(k_rng, sse)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38e82828",
+ "metadata": {},
+ "source": [
+ "On elbow is 3, as we guessed"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/14_naive_bayes/Exercise/Solution_for_understanding.ipynb b/ML/14_naive_bayes/Exercise/Solution_for_understanding.ipynb
new file mode 100644
index 00000000..573d9625
--- /dev/null
+++ b/ML/14_naive_bayes/Exercise/Solution_for_understanding.ipynb
@@ -0,0 +1,337 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "ef96190f",
+ "metadata": {},
+ "source": [
+ "# Wine Classification"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9deba4e1",
+ "metadata": {},
+ "source": [
+ "## Imports and Data Preparation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "2118753b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sklearn.datasets import load_wine\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.naive_bayes import MultinomialNB\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "import seaborn as sns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "fc2dd7d0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR', 'data', 'feature_names', 'frame', 'target', 'target_names']"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wine = load_wine()\n",
+ "dir(wine)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "501b19a3",
+ "metadata": {},
+ "source": [
+ "### Data Exploration"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "d30b802c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1.423e+01, 1.710e+00, 2.430e+00, ..., 1.040e+00, 3.920e+00,\n",
+ " 1.065e+03],\n",
+ " [1.320e+01, 1.780e+00, 2.140e+00, ..., 1.050e+00, 3.400e+00,\n",
+ " 1.050e+03],\n",
+ " [1.316e+01, 2.360e+00, 2.670e+00, ..., 1.030e+00, 3.170e+00,\n",
+ " 1.185e+03],\n",
+ " ...,\n",
+ " [1.327e+01, 4.280e+00, 2.260e+00, ..., 5.900e-01, 1.560e+00,\n",
+ " 8.350e+02],\n",
+ " [1.317e+01, 2.590e+00, 2.370e+00, ..., 6.000e-01, 1.620e+00,\n",
+ " 8.400e+02],\n",
+ " [1.413e+01, 4.100e+00, 2.740e+00, ..., 6.100e-01, 1.600e+00,\n",
+ " 5.600e+02]], shape=(178, 13))"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wine.data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "1968878c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['alcohol',\n",
+ " 'malic_acid',\n",
+ " 'ash',\n",
+ " 'alcalinity_of_ash',\n",
+ " 'magnesium',\n",
+ " 'total_phenols',\n",
+ " 'flavanoids',\n",
+ " 'nonflavanoid_phenols',\n",
+ " 'proanthocyanins',\n",
+ " 'color_intensity',\n",
+ " 'hue',\n",
+ " 'od280/od315_of_diluted_wines',\n",
+ " 'proline']"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wine.feature_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "e45ce5e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
+ " 2, 2])"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wine.target"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "259075ac",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['class_0', 'class_1', 'class_2'], dtype='"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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lnj/XgTbe+PLL7802epf+htSmu8LAik/0ci4efPmsmLFCp+hL33cqlUrCRT6f48aRC1YsEBWrlx5SRo1P1u3bjX3moVQej22b9/u8wfC+mPaqFEjcSqdkqwZFv059b0QERHh837QPw5aQ2W9HwLxOsyZM8cMRWgbgysJlveE/n7oH3Dv94HWfWl9i/f7QANurauz6O+W/v2wAk49RqePawDifX10WNlpQzdWEKX1hRp0a73LL9H3i9YFWcNcgXQ9vP3www+mRsr79yKY3htWRlv/fjZp0kT89r4oVGk6Srz9gc7GmTt3rpltMWDAANP+wHsmktMNHDjQTOX+4osvfKagpqWlmf179+4101N1un9ycrL7448/dtevX9/dpk2bS6a6d+zY0bRQWLJkibtatWqOmOru7c9//rO5Dvpz/ve//zXTunXKvs5ktNofaGuIlStXmuvRqlUrcwu06+A9S1V/Xp0l4y3Q3xNnz541LRv0pn+CJ0+ebP5tzULT9gf6d0B/7m3btpnZSPm1P2jWrJl7w4YN7q+++sp9/fXX+0xx15l+Oq27V69eZlq3/q2JjY213RT3X7oemZmZpv1D7dq1zevs/TfEmmm1du1aMzNL9+vU93fffde8Fx577DHHXY8rXQvd95e//MXM4tXfi+XLl7tvueUW89qnp6cH3Hvj7C/8nljtC/TcdcbuxcryfUEg5WfTp083HybaT0rbIWjvj0CivwD53bS3lEpJSTEfkFWqVDFBpfY8GTZsmE/PILV//353586dTY8PDT40KMnKynI7ye9+9zt3zZo1zWt91VVXmccaNFj0g/KJJ54w03H1l/mhhx4yHxiBdh0sS5cuNe+FPXv2+GwP9PeE9srK73dCp7ZbLRBGjRpl/sDrz9++fftLrtHPP/9sPhzLly9vWj706dPHfPB40x5Ud955p/ke+n7TAM2OrnQ9NGC43N8Qq+fYli1b3C1btjT/wxYdHe1OTEx0v/zyyz7BhVOux5Wuhf7Pp/6PgwYD2ipFp/Zrr7WL/8c7UN4bq37h90RpwKO//xoQXaws3xch+p+C568AAABgoUYKAACgiAikAAAAiohACgAAoIgIpAAAAIqIQAoAAKCICKQAAACKiEAKAACgiAikAAAAiohACgAAoIgIpAAAAIqIQAoAAKCICKQAAACkaP4/xm1gtspWSIkAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.histplot(wine.data, kde=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eba8670b",
+ "metadata": {},
+ "source": [
+ "The data is not discrete and not Normat, hence any model could work better, we have to check both."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a1e227ac",
+ "metadata": {},
+ "source": [
+ ">If you are having trouble plotting, check this [cheatsheet](../../../Cheatsheats/plotting.md) in preview mode"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38d670d5",
+ "metadata": {},
+ "source": [
+ "## Model Training"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "93b1d6a4",
+ "metadata": {},
+ "source": [
+ "### GuassianNB"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "755b16ac",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x_train, x_test, y_train, y_test = train_test_split(wine.data, wine.target, train_size=0.8)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d24724e6",
+ "metadata": {},
+ "source": [
+ "*We don't have to convert to dataframes, as of 2026, train_test_split() and Vectorizer().fit_train() have adapted to take in nd arrays*"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "bc79bc74",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.0"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_guass = GaussianNB()\n",
+ "model_guass.fit(x_train, y_train)\n",
+ "model_guass.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d4073060",
+ "metadata": {},
+ "source": [
+ "### MultinomialNB"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "f5e9311d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9444444444444444"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model_multi = MultinomialNB()\n",
+ "model_multi.fit(x_train, y_train)\n",
+ "model_multi.score(x_test, y_test)"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/15_gridsearch/Exercise/Solution_for_understanding.ipynb b/ML/15_gridsearch/Exercise/Solution_for_understanding.ipynb
new file mode 100644
index 00000000..90d5459c
--- /dev/null
+++ b/ML/15_gridsearch/Exercise/Solution_for_understanding.ipynb
@@ -0,0 +1,362 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6c37d4c9",
+ "metadata": {},
+ "source": [
+ "# Best Model and Parameter Selection for Digits Classification"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "550b1066",
+ "metadata": {},
+ "source": [
+ "## Imports and data load"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "c6492d0a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sklearn.datasets import load_digits\n",
+ "from sklearn.tree import DecisionTreeClassifier\n",
+ "from sklearn.svm import SVC\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.naive_bayes import MultinomialNB\n",
+ "from sklearn.naive_bayes import GaussianNB\n",
+ "from sklearn.model_selection import GridSearchCV\n",
+ "from sklearn.model_selection import train_test_split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "7b3fc717",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR', 'data', 'feature_names', 'frame', 'images', 'target', 'target_names']"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "digits = load_digits()\n",
+ "dir(digits)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dc5e91a0",
+ "metadata": {},
+ "source": [
+ "## Train Test Split"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "351965ce",
+ "metadata": {},
+ "source": [
+ "Not needed because the models also take nparrays"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1c4c9227",
+ "metadata": {},
+ "source": [
+ "## Defining models array"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b2629ab9",
+ "metadata": {},
+ "source": [
+ ">The following array is generated by ChatGPT as he can do the 'guessing' task better. This array is large and takes a lot of CPU if run locally"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "504d2c6e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "models = {\n",
+ "\n",
+ " 'svm': {\n",
+ " 'model': SVC(),\n",
+ " 'params': {\n",
+ " 'C': [0.1, 1, 10],\n",
+ " 'kernel': ['linear', 'rbf', 'poly'],\n",
+ " 'gamma': ['scale', 0.1, 1]\n",
+ " }\n",
+ " },\n",
+ "\n",
+ " 'LogisticRegression': {\n",
+ " 'model': LogisticRegression(max_iter=1000),\n",
+ " 'params': {\n",
+ " 'C': [0.1, 1, 10],\n",
+ " 'penalty': ['l2'],\n",
+ " 'solver': ['lbfgs']\n",
+ " }\n",
+ " },\n",
+ "\n",
+ " 'MultinomialNB': {\n",
+ " 'model': MultinomialNB(),\n",
+ " 'params': {\n",
+ " 'alpha': [0.1, 0.5, 1.0]\n",
+ " }\n",
+ " },\n",
+ "\n",
+ " 'GaussianNB': {\n",
+ " 'model': GaussianNB(),\n",
+ " 'params': {\n",
+ " 'var_smoothing': [1e-9, 1e-8, 1e-7]\n",
+ " }\n",
+ " },\n",
+ "\n",
+ " 'DecisionTree': {\n",
+ " 'model': DecisionTreeClassifier(),\n",
+ " 'params': {\n",
+ " 'max_depth': [None, 5, 10, 20],\n",
+ " 'min_samples_split': [2, 5, 10],\n",
+ " 'criterion': ['gini', 'entropy']\n",
+ " }\n",
+ " },\n",
+ "\n",
+ " 'RandomForest': {\n",
+ " 'model': RandomForestClassifier(),\n",
+ " 'params': {\n",
+ " 'n_estimators': [100, 200],\n",
+ " 'max_depth': [None, 10, 20],\n",
+ " 'min_samples_split': [2, 5],\n",
+ " 'max_features': ['sqrt', 'log2']\n",
+ " }\n",
+ " }\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fd706afb",
+ "metadata": {},
+ "source": [
+ "## Training Every possible model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1be00403",
+ "metadata": {},
+ "source": [
+ "And seeing the score."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "6b5adc7a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1135: FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', and C=np.inf instead of penalty=None.\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Grid Search CV tries every combination for all parameters for ONE MODEL. For more than one models, we still \n",
+ "# need a for loop\n",
+ "\n",
+ "scores = []\n",
+ "\n",
+ "for model_name, model_dict in models.items():\n",
+ " grid_search_obj = GridSearchCV(model_dict['model'], model_dict['params'], cv=5, return_train_score=False)\n",
+ " grid_search_obj.fit(digits.data, digits.target)\n",
+ " scores.append({\n",
+ " 'model' : model_name,\n",
+ " 'best parameters' : grid_search_obj.best_params_,\n",
+ " 'best score' : grid_search_obj.best_score_\n",
+ " })"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "496d0647",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " model \n",
+ " best parameters \n",
+ " best score \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " svm \n",
+ " {'C': 10, 'gamma': 'scale', 'kernel': 'rbf'} \n",
+ " 0.973850 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LogisticRegression \n",
+ " {'C': 0.1, 'penalty': 'l2', 'solver': 'lbfgs'} \n",
+ " 0.918217 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MultinomialNB \n",
+ " {'alpha': 0.1} \n",
+ " 0.870907 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " GaussianNB \n",
+ " {'var_smoothing': 1e-07} \n",
+ " 0.832518 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " DecisionTree \n",
+ " {'criterion': 'entropy', 'max_depth': 20, 'min... \n",
+ " 0.814708 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " RandomForest \n",
+ " {'max_depth': 20, 'max_features': 'log2', 'min... \n",
+ " 0.943254 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " model best parameters \\\n",
+ "0 svm {'C': 10, 'gamma': 'scale', 'kernel': 'rbf'} \n",
+ "1 LogisticRegression {'C': 0.1, 'penalty': 'l2', 'solver': 'lbfgs'} \n",
+ "2 MultinomialNB {'alpha': 0.1} \n",
+ "3 GaussianNB {'var_smoothing': 1e-07} \n",
+ "4 DecisionTree {'criterion': 'entropy', 'max_depth': 20, 'min... \n",
+ "5 RandomForest {'max_depth': 20, 'max_features': 'log2', 'min... \n",
+ "\n",
+ " best score \n",
+ "0 0.973850 \n",
+ "1 0.918217 \n",
+ "2 0.870907 \n",
+ "3 0.832518 \n",
+ "4 0.814708 \n",
+ "5 0.943254 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "scores = pd.DataFrame(scores)\n",
+ "scores"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bd566dae",
+ "metadata": {},
+ "source": [
+ "**For me, the winner is SVM with listed parameters.**"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/17_knn_classification/Exercise/Solution_for_understanding.ipynb b/ML/17_knn_classification/Exercise/Solution_for_understanding.ipynb
new file mode 100644
index 00000000..6980191d
--- /dev/null
+++ b/ML/17_knn_classification/Exercise/Solution_for_understanding.ipynb
@@ -0,0 +1,293 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e182be46",
+ "metadata": {},
+ "source": [
+ "# Iris Classification using Random Forest"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "252230bf",
+ "metadata": {},
+ "source": [
+ "## Imports and Data Loading"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "dc23c89d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.metrics import confusion_matrix, classification_report\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.datasets import load_digits\n",
+ "from sklearn.neighbors import KNeighborsClassifier\n",
+ "import seaborn as sns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "50546ce1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "digits = load_digits()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "93f59c0d",
+ "metadata": {},
+ "source": [
+ "## Train Test Split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "50617f47",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target , train_size=0.8)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82ed02b4",
+ "metadata": {},
+ "source": [
+ "No df making is required, as we are already familiar with the dataset, and models do accept nparrays anyways."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4070bd78",
+ "metadata": {},
+ "source": [
+ "## Model Training"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19a6f7a4",
+ "metadata": {},
+ "source": [
+ "### Hit and Trial (as dataset is very small)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "88f65886",
+ "metadata": {},
+ "source": [
+ "#### N=5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "eaafb061",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9861111111111112"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "knn = KNeighborsClassifier(n_neighbors=5)\n",
+ "knn.fit(x_train, y_train)\n",
+ "knn.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3d3d0a8",
+ "metadata": {},
+ "source": [
+ "#### N=10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "50b34362",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9833333333333333"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "knn = KNeighborsClassifier(n_neighbors=10)\n",
+ "knn.fit(x_train, y_train)\n",
+ "knn.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07011b48",
+ "metadata": {},
+ "source": [
+ "#### N=3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "9442ef43",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9944444444444445"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "knn = KNeighborsClassifier(n_neighbors=3)\n",
+ "knn.fit(x_train, y_train)\n",
+ "knn.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3a5885e",
+ "metadata": {},
+ "source": [
+ "**Lovely 😘**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d3c023ac",
+ "metadata": {},
+ "source": [
+ "## Model Evaluation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f5abc6d1",
+ "metadata": {},
+ "source": [
+ "### Confusion Matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "148b7959",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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hQuRmZmpzP43Jauc8EdERGSpPvvsM4SFhSEpKQlNmzbFp59+qmz2Y0pM/kRERDaGY/5EREQ2hsmfiIjIxjD5ExER2RgmfyIiIhtjdcm/NG6F+DgOHz6Mnj17okKFCrCzs8N3330HmYSGhqJly5bw8PCAv78/evfujXPnzkEGS5cuRXBwsLItqDjEetddu3ZBVnPnzlV+xxMnToQMZs6cqcTz8FGvXj3I4tq1axg0aBB8fHzg6uqKxo0bIzo6GjIQf0sM604cY8aMgQwKCgrw/vvvo3r16krd1axZE7Nnz5bmXvTp6enK56Bq1apKfE8++SSioqLUDousLfmX1q0QH4dYpyniERcnMhL7Ros/aJGRkdi7dy/y8vLQtWtXJW61VapUSUmoMTExSlLo1KkTevXqhdOnT0M24g/b559/rlysyKRhw4a4ceOG7jh69Chk8Oeff6Jt27ZwdHRULujOnDmDTz75BOXLl4csv8+H6018NoT+/ftDBh9//LFycSyWhp09e1Z5PG/ePPz3v/+FDN544w2lztauXYtTp04pf1O6dOmiXPCRyrRW5IknntCOGTNG97igoEBboUIFbWhoqFYmotoN79okm5SUFCXOQ4cOaWVUvnx57ZdffqmVSXp6urZ27dravXv3ap9++mnthAkTtDIQdw9r0qSJVkZvv/22tl27dlpLIX6nNWvW1Go0Gq0MevTooX399df1yvr27asdOHCgVm1ZWVnKHep++OEHvfJmzZpp33vvPdXiovuspuWfm5urtAzFVeUDZcqUUR4fP35c1dgskbj7luDt7Q2ZiG7OjRs3Kj0Spt7usqREz0mPHj303oOyuHDhgjLkVKNGDQwcOBBXrlyBDLZv367sZCZa0mK46V//+heWL18OWf/GrFu3Dq+//rrS9S8D0Y0utn49f/688jguLk7p1enevbvaoSE/P1/5vIoh2IeJ7n9Zep5smdVs75uamqq80QICAvTKxePffvtNtbgskdhLWozTie7YRo0aQQaiy1Ak++zsbLi7u2Pbtm1o0KABZCEuSMRQk4zjmWLuy+rVq1G3bl2l63rWrFl46qmn8OuvvypzPNR08eJFpdtaDNe9++67Sv2NHz9e2eNcbHEqEzFP586dOxg6dChk8c477yi3yxVzOMQNYcTfwA8//FC5wFObeG+Jz6yYg1C/fn3lb/HXX3+tNMZq1aqldng2z2qSP5m2BSsSg0xX5yJxnTx5UumR2Lp1q5IYxDwFGS4Arl69igkTJihjm4atHBk83AoUcxHExYCYgLV582YMHz5c9QtN0fL/6KOPlMei5S/ee8uWLZMu+a9YsUKpS9GDIgvxO1y/fj02bNigzOsQnxFx4S5ilKH+xFi/6CkR96gXFyfNmjXDK6+8ovTSkrqsJvmX5q0QrdnYsWPxww8/KKsTxEQ7WYiW4IPWgrjrlWghLlq0SJlcpzbxh0xMKhV/2B4QLTBRh2IiVk5OjvLelEW5cuVQp04dJCQkqB0KgoKCHrmAE63Eb775BjK5fPky9u3bh2+//RYymTp1qtL6f/nll5XHYqWEiFWs3pEh+YvVB+IiXQzTiR4K8ft+6aWXlOEnUpfVjPmX5q0QrZGYhygSv+hO379/v7J0SGbidyuSqgw6d+6sDEuIVteDQ7RmRder+F6mxC9kZGQgMTFR+UOsNjG0ZLikVIxfi54JmaxatUqZkyDmdMgkKytLmdv0MPF+E58Pmbi5uSnvN7G6Y/fu3cpqHVKX1bT8S/NWiI/7B/fhltbvv/+uJAYxoa5KlSqQoatfdB1+//33yliduJuU4OXlpUzQUVNISIjS3SrqSawbFnEePHhQ+SMiA1FfhnMjxB87sW5dhjkTU6ZMUfaYEAn1+vXrylJYkSBE96vaJk2apExaE93+AwYMUPbl+OKLL5RDFiKRiuQv/rY4OMj1J1P8XsUYv/hsiG7/EydOYMGCBUpXuwzEZ1Q0LMSwnfj7J3oqxPwEGf4m2zytlfnvf/+rrVKlitbJyUlZ+hcZGamVwYEDB5Slc4bHkCFDtDIoLDZxrFq1Su3QlKVMVatWVX6nfn5+2s6dO2v37NmjlZlMS/1eeuklbVBQkFJ/FStWVB4nJCRoZbFjxw5to0aNtM7Oztp69eppv/jiC61Mdu/erXwWzp07p5VNWlqa8j4Tf/NcXFy0NWrUUJbR5eTkaGWwadMmJSbx3gsMDFSWYt+5c0ftsEir1fKWvkRERDbGasb8iYiIqHiY/ImIiGwMkz8REZGNYfInIiKyMUz+RERENobJn4iIyMYw+RMREdkYJn8iIiIbw+RPRERkY5j8iYiIbAyTPxEREWzL/wFvubpfGvDW9QAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "y_predicted = knn.predict(x_test)\n",
+ "\n",
+ "cm = confusion_matrix(y_test, y_predicted)\n",
+ "sns.heatmap(cm, annot=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8ea0540",
+ "metadata": {},
+ "source": [
+ "### Classification Report"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "e8fa67f0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 1.00 1.00 1.00 40\n",
+ " 1 0.98 1.00 0.99 45\n",
+ " 2 1.00 1.00 1.00 35\n",
+ " 3 0.96 1.00 0.98 23\n",
+ " 4 1.00 1.00 1.00 42\n",
+ " 5 1.00 1.00 1.00 39\n",
+ " 6 1.00 1.00 1.00 35\n",
+ " 7 1.00 1.00 1.00 28\n",
+ " 8 1.00 0.98 0.99 41\n",
+ " 9 1.00 0.97 0.98 32\n",
+ "\n",
+ " accuracy 0.99 360\n",
+ " macro avg 0.99 0.99 0.99 360\n",
+ "weighted avg 0.99 0.99 0.99 360\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "cr = classification_report(y_test, y_predicted)\n",
+ "print(cr)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python",
+ "version": "3.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/1_linear_reg/Exercise/solution.ipynb b/ML/1_linear_reg/Exercise/solution.ipynb
new file mode 100644
index 00000000..2910cd32
--- /dev/null
+++ b/ML/1_linear_reg/Exercise/solution.ipynb
@@ -0,0 +1,1098 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "e9ce1328",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "from sklearn import linear_model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "77641018",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " year \n",
+ " per capita income (US$) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1970 \n",
+ " 3399.299037 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1971 \n",
+ " 3768.297935 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1972 \n",
+ " 4251.175484 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 1973 \n",
+ " 4804.463248 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1974 \n",
+ " 5576.514583 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1975 \n",
+ " 5998.144346 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 1976 \n",
+ " 7062.131392 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 1977 \n",
+ " 7100.126170 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 1978 \n",
+ " 7247.967035 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 1979 \n",
+ " 7602.912681 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 1980 \n",
+ " 8355.968120 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1981 \n",
+ " 9434.390652 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 1982 \n",
+ " 9619.438377 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 1983 \n",
+ " 10416.536590 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 1984 \n",
+ " 10790.328720 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 1985 \n",
+ " 11018.955850 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 1986 \n",
+ " 11482.891530 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 1987 \n",
+ " 12974.806620 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 1988 \n",
+ " 15080.283450 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 1989 \n",
+ " 16426.725480 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 1990 \n",
+ " 16838.673200 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 1991 \n",
+ " 17266.097690 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 1992 \n",
+ " 16412.083090 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 1993 \n",
+ " 15875.586730 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 1994 \n",
+ " 15755.820270 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 1995 \n",
+ " 16369.317250 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 1996 \n",
+ " 16699.826680 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 1997 \n",
+ " 17310.757750 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 1998 \n",
+ " 16622.671870 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 1999 \n",
+ " 17581.024140 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 2000 \n",
+ " 18987.382410 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " 2001 \n",
+ " 18601.397240 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 2002 \n",
+ " 19232.175560 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 2003 \n",
+ " 22739.426280 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 2004 \n",
+ " 25719.147150 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 2005 \n",
+ " 29198.055690 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 2006 \n",
+ " 32738.262900 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 2007 \n",
+ " 36144.481220 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 2008 \n",
+ " 37446.486090 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 2009 \n",
+ " 32755.176820 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 2010 \n",
+ " 38420.522890 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 2011 \n",
+ " 42334.711210 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " 2012 \n",
+ " 42665.255970 \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 2013 \n",
+ " 42676.468370 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 2014 \n",
+ " 41039.893600 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 2015 \n",
+ " 35175.188980 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " 2016 \n",
+ " 34229.193630 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " year per capita income (US$)\n",
+ "0 1970 3399.299037\n",
+ "1 1971 3768.297935\n",
+ "2 1972 4251.175484\n",
+ "3 1973 4804.463248\n",
+ "4 1974 5576.514583\n",
+ "5 1975 5998.144346\n",
+ "6 1976 7062.131392\n",
+ "7 1977 7100.126170\n",
+ "8 1978 7247.967035\n",
+ "9 1979 7602.912681\n",
+ "10 1980 8355.968120\n",
+ "11 1981 9434.390652\n",
+ "12 1982 9619.438377\n",
+ "13 1983 10416.536590\n",
+ "14 1984 10790.328720\n",
+ "15 1985 11018.955850\n",
+ "16 1986 11482.891530\n",
+ "17 1987 12974.806620\n",
+ "18 1988 15080.283450\n",
+ "19 1989 16426.725480\n",
+ "20 1990 16838.673200\n",
+ "21 1991 17266.097690\n",
+ "22 1992 16412.083090\n",
+ "23 1993 15875.586730\n",
+ "24 1994 15755.820270\n",
+ "25 1995 16369.317250\n",
+ "26 1996 16699.826680\n",
+ "27 1997 17310.757750\n",
+ "28 1998 16622.671870\n",
+ "29 1999 17581.024140\n",
+ "30 2000 18987.382410\n",
+ "31 2001 18601.397240\n",
+ "32 2002 19232.175560\n",
+ "33 2003 22739.426280\n",
+ "34 2004 25719.147150\n",
+ "35 2005 29198.055690\n",
+ "36 2006 32738.262900\n",
+ "37 2007 36144.481220\n",
+ "38 2008 37446.486090\n",
+ "39 2009 32755.176820\n",
+ "40 2010 38420.522890\n",
+ "41 2011 42334.711210\n",
+ "42 2012 42665.255970\n",
+ "43 2013 42676.468370\n",
+ "44 2014 41039.893600\n",
+ "45 2015 35175.188980\n",
+ "46 2016 34229.193630"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(\"canada_per_capita_income.csv\")\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "1e7d0d60",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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CcdCsRG2OC0uIhF8+fLl8tFHH/nse/PNN+2suapVq9o6TadOnXJ7OgAAgNgMmp555hnZtGmTZ3vDhg1y3333SefOnW018A8//NAuswIAABDXQdPatWulU6dOnu3p06dL69atbXL4sGHD5OWXX5aZM2eG6joBAACiI2g6fPiwVKtWzbOdlpYm3bp182xfe+21spsaEgAAIN6DJg2Ydu7caX/WIpZffvmltGnTxqdOkxa4BAAAiOug6aabbrK5S5999pmMHj1aSpYsKe3bt/ccX79+vVx++eWhuk4AAICwcl1y4Pe//7306tVLOnToYKuCT5s2zWdZlX/84x+SmpoaqusEAACIruKWWvxJg6YiRYr47D906JDdf7716WIZxS0BAIg+IS1uqSf2p2LFioGeCgAAIGq4DppatGghCQkJfoOo+vXry5AhQ+TKK68M9vUBAABEV9DUo0cPv/uzsrLsTLrmzZvLokWLpF27dsG8PgAAgNhasPe3v/2trFixQhYuXCjxiJwmAABi+/vbdcmBgtx55512aRUAAIBYFLSgSWfTnTt3LqDHTJ48Wa666iob2emtbdu2MnfuXM/xkydPyuDBg6VSpUp2Zt7tt98u+/fv9zlHRkaGdO/e3daN0oWDR4wYITk5OT5tlixZIi1btpTk5GSpV6+eTJ06Nc+1TJw4US677DIpXry4XR5m5cqVAb8HAAAgdgUtaHrvvfekUaNGAT2mZs2aMn78eFm9erWsWrVKbrzxRrnttts8CwMPHTrULgQ8a9Ysu2zL3r17ba0ox9mzZ23ApBXKly1bZmtHaUA0ZswYTxutYq5tOnbsaNfP04T1AQMGyPz58z1tZsyYYdfPGzt2rM3PatasmXTp0kUOHDgQlPcGAADEUU6TLsjrj44BatDz8ccf216izp07X9QFaemCCRMmyP/93/9JlSpV5J133rE/q6+++srO0Fu+fLldwkWf7+abb7bBlLMu3muvvSajRo2S77//3taM0p/12jZu3Oh5jjvuuMMmsM+bN89ua8+Srp336quv2m3tMatVq5b85je/sVXQ/Tl16pS9eY+J6mPIaQIAIM7rNP3lL3/xu1+foEGDBvLpp5/a4bULpb1G2qN0/Phxex4NxM6cOeMThDVs2FBq167tCZr0vmnTpj4LCWsP0YMPPmh7q7RMgrbJHchpG+1xUtpLpc+l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IjVr1gzqc3qvKg8guhE0AYgrtWrVkpdeekkee+wxGyxp79N9990nqamp0qJFC+nWrZuULl1aqlWrJn379pWDBw96Hjtv3jz5xS9+YXukKlWqJDfffLNs377dc3zXrl02MJsxY4Z06NBBihcvLm+//XaYXimAYGPBXgBxqUePHpKdnS29evWS3//+97Jp0yZp3LixDBgwQO6++245ceKEjBo1SnJycmTRokX2Mf/+979tUHTVVVfJsWPHZMyYMTZQWrt2rSQmJtqf69atK5dddpk8//zzNgjTwOmSSy4J98sFEAQETQDi0oEDB2yQdOjQIRsMbdy4UT777DOZP3++p43mN2nP1NatW6V+/fp5zqG9UFWqVJENGzZIkyZNPEHTiy++KI8++mghvyIAocbwHIC4VLVqVXnggQfkyiuvtL1O69atk8WLF9uhOefWsGFD29YZgvvmm2+kT58+kpKSImXLlrU9SiojI8Pn3Ndcc00YXhGAUCsa8mcAgAhVtGhRe1M63HbLLbfIn//85zztnOE1PV6nTh3561//KjVq1JBz587ZHqbTp0/7tC9VqlQhvQIAhYmgCQBEpGXLlnaYTnuPnEDK2w8//GCH6TRgat++vd23dOnSMFwpgHBheA4ARGTw4ME2v0mH37744gs7JKf5Tffee6+cPXtWKlSoYGfMvfHGG7Jt2zabHD5s2LBwXzaAQkTQBAAidrgtPT3dBkhafqBp06YyZMgQW15AZ8bpbfr06bJ69Wo7JDd06FCZMGFCuC8bQCFi9hwAAIAL9DQBAAC4QNAEAADgAkETAACACwRNAAAALhA0AQAAuEDQBAAA4AJBEwAAgAsETQAAAC4QNAEAALhA0AQAAOACQRMAAIAU7P8D1KFZ46VESY4AAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.xlabel(\"Year\")\n",
+ "plt.ylabel(\"Per Capita Income (in USD)\")\n",
+ "plt.scatter(df[\"year\"], df[\"per capita income (US$)\"], marker='x', color='red')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "6473cb0d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " copy_X \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " tol \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " n_jobs \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " positive \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = linear_model.LinearRegression()\n",
+ "model.fit(df[[\"year\"]], df[[\"per capita income (US$)\"]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b647dce5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\sklearn\\utils\\validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[41288.69409442]])"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.predict([[2020]])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f3f15d7a",
+ "metadata": {},
+ "source": [
+ "### Following code is just to see the regression line."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a3ada5b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\sklearn\\utils\\validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Predicted income for 2020: 41288.69409441762\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\sklearn\\utils\\validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n",
+ "C:\\Users\\HC\\AppData\\Local\\Temp\\ipykernel_8084\\4051086270.py:10: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
+ " print('Predicted income for 2020:', float(model.predict([[2020]])))\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot data with regression line and show prediction for 2020\n",
+ "plt.scatter(df['year'], df['per capita income (US$)'], marker='x', color='red')\n",
+ "preds = model.predict(df[[\"years\"]])\n",
+ "plt.plot(df['year'], preds, color='blue')\n",
+ "plt.xlabel('Year')\n",
+ "plt.ylabel('Per Capita Income (US$)')\n",
+ "plt.title('Canada Per Capita Income with Linear Regression')\n",
+ "plt.show()\n",
+ "print('Predicted income for 2020:', float(model.predict([[2020]])))"
+ ]
+ }
+ ],
+ "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.13.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/1_linear_reg/flashcards.md b/ML/1_linear_reg/flashcards.md
new file mode 100644
index 00000000..c3b673a9
--- /dev/null
+++ b/ML/1_linear_reg/flashcards.md
@@ -0,0 +1,75 @@
+### **Card 1**
+**Front**: What is the mathematical equation for linear regression?
+**Back**:
+`y = mx + b`
+Where: y = dependent variable, x = independent variable, m = slope/coefficient, b = intercept
+
+---
+
+### **Card 2**
+**Front**: Which sklearn module contains the LinearRegression class?
+**Back**:
+`from sklearn import linear_model`
+
+---
+
+### **Card 3**
+**Front**: What method trains a linear regression model on data?
+**Back**:
+`model.fit(X, y)`
+Where X = feature matrix, y = target vector
+
+---
+
+### **Card 4**
+**Front**: How do you make predictions with a trained linear regression model?
+**Back**:
+`model.predict(X_new)`
+Where X_new = new feature values to predict
+
+---
+
+### **Card 5**
+**Front**: What do the coef_ and intercept_ attributes store in a linear regression model?
+**Back**:
+- `coef_`: Slope coefficients (m values)
+- `intercept_`: Y-intercept (b value)
+
+---
+
+### **Card 6**
+**Front**: How can you manually calculate predictions using coef_ and intercept_?
+**Back**:
+`prediction = (X * model.coef_) + model.intercept_`
+For single feature: `prediction = X * coef_ + intercept_`
+
+---
+
+### **Card 7**
+**Front**: What matplotlib function creates a scatter plot?
+**Back**:
+`plt.scatter(x, y)`
+Plots x values against y values as points
+
+---
+
+### **Card 8**
+**Front**: How do you remove a column from a pandas DataFrame?
+**Back**:
+`df.drop('column_name', axis=1)`
+or `df.drop('column_name', axis='columns')`
+
+---
+
+### **Card 9**
+**Front**: How do you add a new column with predictions to a DataFrame?
+**Back**:
+`df['new_column_name'] = predictions_array`
+
+---
+
+### **Card 10**
+**Front**: What method exports a DataFrame to a CSV file?
+**Back**:
+`df.to_csv("filename.csv")`
+Saves DataFrame as comma-separated values file
\ No newline at end of file
diff --git a/ML/2_linear_reg_multivariate/Exercise/solution.ipynb b/ML/2_linear_reg_multivariate/Exercise/solution.ipynb
new file mode 100644
index 00000000..641e179f
--- /dev/null
+++ b/ML/2_linear_reg_multivariate/Exercise/solution.ipynb
@@ -0,0 +1,1076 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3dac90a3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sklearn import linear_model\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "b07f09c4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " experience \n",
+ " test_score(out of 10) \n",
+ " interview_score(out of 10) \n",
+ " salary($) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " NaN \n",
+ " 8.0 \n",
+ " 9 \n",
+ " 50000 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " NaN \n",
+ " 8.0 \n",
+ " 6 \n",
+ " 45000 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " five \n",
+ " 6.0 \n",
+ " 7 \n",
+ " 60000 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " two \n",
+ " 10.0 \n",
+ " 10 \n",
+ " 65000 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " seven \n",
+ " 9.0 \n",
+ " 6 \n",
+ " 70000 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " three \n",
+ " 7.0 \n",
+ " 10 \n",
+ " 62000 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " ten \n",
+ " NaN \n",
+ " 7 \n",
+ " 72000 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " eleven \n",
+ " 7.0 \n",
+ " 8 \n",
+ " 80000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " experience test_score(out of 10) interview_score(out of 10) salary($)\n",
+ "0 NaN 8.0 9 50000\n",
+ "1 NaN 8.0 6 45000\n",
+ "2 five 6.0 7 60000\n",
+ "3 two 10.0 10 65000\n",
+ "4 seven 9.0 6 70000\n",
+ "5 three 7.0 10 62000\n",
+ "6 ten NaN 7 72000\n",
+ "7 eleven 7.0 8 80000"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(\"hiring.csv\")\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "96c3ae09",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " experience \n",
+ " test_score(out of 10) \n",
+ " interview_score(out of 10) \n",
+ " salary($) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0 \n",
+ " 8.0 \n",
+ " 9 \n",
+ " 50000 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " 8.0 \n",
+ " 6 \n",
+ " 45000 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5 \n",
+ " 6.0 \n",
+ " 7 \n",
+ " 60000 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2 \n",
+ " 10.0 \n",
+ " 10 \n",
+ " 65000 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 7 \n",
+ " 9.0 \n",
+ " 6 \n",
+ " 70000 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 3 \n",
+ " 7.0 \n",
+ " 10 \n",
+ " 62000 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 10 \n",
+ " NaN \n",
+ " 7 \n",
+ " 72000 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 11 \n",
+ " 7.0 \n",
+ " 8 \n",
+ " 80000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " experience test_score(out of 10) interview_score(out of 10) salary($)\n",
+ "0 0 8.0 9 50000\n",
+ "1 0 8.0 6 45000\n",
+ "2 5 6.0 7 60000\n",
+ "3 2 10.0 10 65000\n",
+ "4 7 9.0 6 70000\n",
+ "5 3 7.0 10 62000\n",
+ "6 10 NaN 7 72000\n",
+ "7 11 7.0 8 80000"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from word2number import w2n\n",
+ "df.experience.fillna(\"zero\", inplace=True)\n",
+ "df.experience = df.experience.apply(w2n.word_to_num)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "33ad39f6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\HC\\AppData\\Local\\Temp\\ipykernel_6756\\2839352622.py:1: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
+ "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
+ "\n",
+ "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
+ "\n",
+ "\n",
+ " df[r'test_score(out of 10)'].fillna(df[r'test_score(out of 10)'].mean(), inplace=True)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " experience \n",
+ " test_score(out of 10) \n",
+ " interview_score(out of 10) \n",
+ " salary($) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0 \n",
+ " 8.000000 \n",
+ " 9 \n",
+ " 50000 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " 8.000000 \n",
+ " 6 \n",
+ " 45000 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5 \n",
+ " 6.000000 \n",
+ " 7 \n",
+ " 60000 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2 \n",
+ " 10.000000 \n",
+ " 10 \n",
+ " 65000 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 7 \n",
+ " 9.000000 \n",
+ " 6 \n",
+ " 70000 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 3 \n",
+ " 7.000000 \n",
+ " 10 \n",
+ " 62000 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 10 \n",
+ " 7.857143 \n",
+ " 7 \n",
+ " 72000 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 11 \n",
+ " 7.000000 \n",
+ " 8 \n",
+ " 80000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " experience test_score(out of 10) interview_score(out of 10) salary($)\n",
+ "0 0 8.000000 9 50000\n",
+ "1 0 8.000000 6 45000\n",
+ "2 5 6.000000 7 60000\n",
+ "3 2 10.000000 10 65000\n",
+ "4 7 9.000000 6 70000\n",
+ "5 3 7.000000 10 62000\n",
+ "6 10 7.857143 7 72000\n",
+ "7 11 7.000000 8 80000"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[r'test_score(out of 10)'].fillna(df[r'test_score(out of 10)'].mean(), inplace=True)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c92483e7",
+ "metadata": {},
+ "source": [
+ "### For Visualising the patterns and dependencies...\n",
+ "went pretty bad i guess😅"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "366541b7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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+EWcdNJJ8eWXX8bVV18du+++e9xyyy1x6aWX5p09oMylZTbSLKDzf1Cm/YG9u1uGA1godQdUN3UAFT0me8cdd4xXXnklm0l8iy22iEceeSS+8Y1vxLPPPpvtAyxJWmbj2iN6ZpOUpDFUqYtX+gXaBySwOOoOqG7qACo2yE7S2tg33nhj3tkACix9IPpQBJaVugOqmzqAig2yZ82aFffee2+8+eab2f6mm24aBxxwQKy2WtlnHQAAgCpT1pHqP//5z9h///1j3LhxsfHGG2fHBg4cGO3atYs///nPsfnmm+edRQAAACjGxGfHH398tib2hx9+GC+//HK2jRkzJrp37x4nnnhi3tkDAACA4rRkp0nPXnzxxVhjjTXqj6X7aWbxb37zm7nmDQAAAArVkv31r389Pv744wWOf/LJJ7HRRhvlkicAAAAoZJDdv3//OOWUU+Kee+7JuoynLd0/9dRTs7HZtbW19RsAAADkray7i++7777Z7aGHHhqNGjXK7s+ZMye73W+//er3U1qahRwAAADyVNZB9t/+9re8swAAAACVEWTvvPPOuTzvgAEDol+/fvHzn/88Bg0alEseAAAAKJ6yHpN9wQUXxOzZsxc4PnHixDjiiCNWynO+8MIL8V//9V/ZMmEAAABQMUH2zTffHDvuuGO899579cf+/ve/xxZbbBEjR44s+fNNnjw5jjzyyLjxxhvnWTYMAAAACh9kDx8+PNZbb73o0aNHFvieddZZsfvuu8cPfvCDeOaZZ0r+fCeffHLss88+sdtuuy3x3OnTp88zu7kZzqFhKHuQD2UP8qHsQfGU9Zjs1Jp89913xy9+8Yv4j//4j1httdXir3/9a+y6664lf64//vGP8fLLL2fdxZd2ebELL7yw5PkAFk/Zg3woe5APZQ+Kp6xbspNrr702rr766mwM9te+9rVs3exXX321pM8xZsyYbJKz3//+99GsWbOl+ps0MVoaG163pccAVj5lD/Kh7EE+lD0onrJuyd5zzz2zluXbbrstvve978XUqVPj9NNPj2233Tb7Re/ss88uyfO89NJL8cknn8Q3vvGN+mNp3e2hQ4fGddddl3XTWXXVVef5m6ZNm2Yb0LCUPciHsgf5UPageMo6yE6B7muvvRYdO3bM9mtqamLw4MGx7777xvHHH1+yIDt1P0/PM7djjjkmunXrFn369FkgwAYAAIDCBdmPPvpoPPnkk1kwnWYTv+eee2LdddeNf//739lY7VJp2bJlbL755vMca9GiRay11loLHAcAAIBCjskeMmRI7LHHHlkL9rBhw7Ju20kaj5ImgQAAAIByUtZB9iWXXBLXX399tnxX48aN64/vsMMO2UzgK1Naj3vQoEEr9TkAAACoLGUdZL/99tvRq1evBY63bt06JkyYkEueAAAAoJBB9jrrrBPvvvvuAsefeuqpbDkvAAAAKCdlHWSfcMIJ2frVzz33XDRq1CjGjh2brWV95plnxkknnZR39gAAAKA4s4v37ds3Zs+enS2xNWXKlKzreFonMAXZP/vZz/LOHgAAABQnyE6t1+ecc06cddZZWbfxyZMnx6abbhqrr7563lkDAACAYgXZdZo0aZIF11Aqb775ZhRRUfMNAADVohBBNpTK1ImfpT4ScdRRR0WRzZw+I+8sAAAACyHIpqrMnDIpIuZEj+/3iXZdukXRfPTas/H6/TfEl19+mXdWAACAhRBkU5VWb9851uy8cRRN7Ufv550FcjBxyowYP3lG1E6bGa1qGkfbFk2idfMmeWcLgMVQd1cX7zdzE2QDlLGxE6ZGnyHD48kR4+uP9eraNgb07h4d29TkmjcAFk7dXV283xRqnWyAav9VfP4P7WToiPHRd8jwLB2A8qLuri7ebxZGkA1QplK3s/k/tOf+8E7pAJQXdXd18X6zMIJsgDKVxnUtzqQlpAPQ8NTd1cX7zcIIsgHKVKtmjReb3nIJ6QA0PHV3dfF+szCCbIAy1Xb1JtnEKQuTjqd0AMqLuru6eL9ZGEE2QJlKS3+kmUnn//BO+wN7d7c0CEAZUndXF+83C2MJL4Aylpb+uPaIntnEKWlcV+p2ln4V96ENUL7U3dXF+838BNkAZS59SPugBigWdXd18X4zN93FAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAlIggGwAAAEpEkA0AAAAlIsgGAACAEhFkAwAAQIkIsr/Sv3//+OY3vxktW7aM9u3bx4EHHhhvv/123tkCgBUyccqMGPnJ5Bg2+vMY+enkbB9Y+ZQ9loXrpbKslncGysUTTzwRJ598chZof/nll/GLX/widt9993jjjTeiRYsWeWcPAJbZ2AlTo8+Q4fHkiPH1x3p1bRsDenePjm1qcs0bVDJlj2Xheqk8WrK/8tBDD8WPfvSj2GyzzWLLLbeMW2+9NUaPHh0vvfRS3lkDgGWWWkHm/9KWDB0xPvoOGa6VBFYSZY9l4XqpTFqyF2HixInZ7ZprrrnQ9OnTp2dbndra2gbLG1QzZQ+WzvjJMxb40jb3l7eU3rp5k6V+PGUPlo6yR57XC+VBS/ZCzJ49O0499dTYYYcdYvPNN1/kGO7WrVvXb506dWrwfEI1UvZg6dROm7nY9ElLSJ+fsgdLR9kjz+uF8iDIXog0Nvv111+PP/7xj4s8p1+/fllrd902ZsyYBs0jVCtlD5ZOq2aNF5vecgnp81P2YOkoe+R5vVAedBefz09/+tN44IEHYujQobHeeust8rymTZtmG9CwlD1YOm1Xb5JNnJO6G84vHU/py0LZg6Wj7JHn9UJ50JL9lTlz5mQB9r333hv/8z//E126dMk7SwCw3NIYvjQzbfqSNre0P7B3d2P8YCVR9lgWrpfKpCV7ri7id955Z/z3f/93tlb2uHHjsuNp7EtNjanzASietPTLtUf0zCbOSeP6UrfD1CriSxusXMoey8L1UnkE2V8ZPHhwdvvtb397nuO33HJLtrQXABRR+pLmixo0PGWPZeF6qSyC7Lm6iwMAAMCKMCYbAAAASkSQDQAAACUiyAYAAIASEWQDAABAiQiyAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAlIggGwAAAEpEkA0AAAAlIsgGAACAEhFkAwAAQIkIsgEAAKBEBNkAAABQIoJsAAAAKBFBNgAAAJSIIBsAAABKRJANAAAAJSLIBgAAgBIRZAMAAECJCLIBAACgRATZAAAAUCKCbAAAACgRQTYAAACUiCAbAAAASkSQPZ/f/OY3scEGG0SzZs1im222ieeffz7vLAEAAFAQq+WdgXJy1113xemnnx7XX399FmAPGjQo9thjj3j77bejffv2eWcPoJA+rp0Wn38xI2qnfRmtalaLNZo3ibVbNcs7WzSAiVNmxPjJ6b2fGa1qGkfbFk2idfMmeWeLgnD9FOO18z7BggTZc7nyyivjhBNOiGOOOSbbT8H2X/7yl/jtb38bffv2zTt7AIUz+rMvot+9r8XT735Wf2zHjdaKyw7aIjqv1SLXvLFyjZ0wNfoMGR5Pjhhff6xX17YxoHf36NimJte8Uf5cP8V47bxPsHC6i39lxowZ8dJLL8Vuu+1Wf2yVVVbJ9p999tlc8wZQ1Bbs+QPs5Kl3P4tf3Ptalk5lSi1b83/xToaOGB99hwzP0mFRXD/FeO28T7BoWrK/Mn78+Jg1a1asvfba8xxP+2+99dYC50+fPj3b6tTW1jZIPqHaKXvFkbqIzx9gzx1op3Tdxiuz7KWuo/N/8Z77C3hK152URXH9FKPseZ9g0bRkL6f+/ftH69at67dOnTrlnSWoCspecaQx2CuSTnHLXhqbuTiTlpBOdXP9FKPseZ9g0QTZX2nbtm2suuqq8fHHH89zPO2vs846C5zfr1+/mDhxYv02ZsyYBswtVC9lrzhaNVtthdIpbtlr1azxYh+r5RLSqW6un2KUPe8TLJog+ytNmjSJrbbaKh5//PH6Y7Nnz872t9tuuwXOb9q0abRq1WqeDVj5lL3iWKNFk2ySs4VJx1M6lVn22q7eJJv8aGHS8ZQOi+L6KUbZ8z7Bogmy55KW77rxxhvjtttuizfffDNOOumk+OKLL+pnGwdg6aXx1mkW8fkD7brZxY3HrlxpHGaaXXj+L+Bpf2Dv7sZpsliun2K8dt4nWDR99eZy2GGHxaeffhrnnXdejBs3Lnr06BEPPfTQApOhAbB00jJdVxza4//WyW62WtaCLcCufGn5nmuP6JlNfpTGZqauo6llyxdvlobrpxivnfcJFk6QPZ+f/vSn2QZAaaSAWlBdndIXbV+2WV6un2K8dt4nWJDu4gAAAFAigmwAAAAoEUE2AAAAlIgx2SUyZ86c7La2tnax502ePDm7nfjhezH7y1lRNJM/+Vd2Wzvu/WxJiaKR/3xNGvdBfTlYUllp2bJlNGrUqGRlD1g6yh7kQ9mD8i57y6LRnLqSygr58MMPo1OnTnlnAyrGxIkTl2oNbGUPSkvZg3woe1DeZW9ZCLJLZPbs2TF27Ngl/hKSfnVMFeOYMWNK/maWWpHymshvZeV1aX9VrMSytzDyn69qyr+yNy/5z1c15b/UZa8hFf19Whz/WzHVroSytyx0Fy+RVVZZJdZbb72lPj+92UW5mIuU10R+qyuvlVz2Fkb+8yX//0fZKxb5r96y15CK/j4tjv+tmFrl9L+Z+AwAAABKRJANAAAAJSLIbmBpRujzzz+/EDNDFymvifyuPEXKa6X+D/KfL/kv5nOXgvznS/6LoZL/T/9bMTXN+X8z8RkAAACUiJZsAAAAKBFBNgAAAJSIIBsAAABKRJANAAAAJSLILpE0f1xtbW12CzQcZQ/yoexBPpQ9KH+C7BKZNGlStG7dOrsFGo6yB/lQ9iAfyh6UP0E2AAAAlIggGwAAAEpEkA0AAAAlIsgGAACAEqmKIHvo0KGx3377RceOHaNRo0Zx3333zZOeZmc877zzokOHDlFTUxO77bZbjBgxIrf8AgAAUExVEWR/8cUXseWWW8ZvfvObhaZffvnlcc0118T1118fzz33XLRo0SL22GOPmDZtWlSqiVNmxMhPJsew0Z/HyE8nZ/sAAJSG71osC9dLZVktqsBee+2VbQuTWrEHDRoUv/zlL+OAAw7Ijt1+++2x9tprZy3ehx9+eFSasROmRp8hw+PJEePrj/Xq2jYG9O4eHdvU5Jo3AICi812LZeF6qTxV0ZK9OKNGjYpx48ZlXcTrpLUHt9lmm3j22Wej0qRfxeYvxMnQEeOj75DhfjUDAFgBvmuxLFwvlakqWrIXJwXYSWq5nlvar0tbmOnTp2dbndra2iiC8ZNnLFCI5y7MKb118yYNni9YWkUte6UwevToGD9+4eW3CNq2bRudO3fOOxssp2oue5Dndy1lr7L5bl6Zqj7IXl79+/ePCy+8MIqmdtrMxaZPWkI65K2oZa8UAXa3bpvE1KlToqhqaprHW2+9KdAuqGote5D3dy1lr7L5bl6Zqj7IXmeddbLbjz/+OJtdvE7a79GjxyL/rl+/fnH66afP86tip06doty1atZ4sektl5AOeStq2VtRqQU7BdjbHHt+tOqwQRRN7Ufvx3O/vTD7PwTZxVStZQ/y/q6l7FU2380rU9UH2V26dMkC7ccff7w+qE6VV5pl/KSTTlrk3zVt2jTbiqbt6k2yiRRS95P5peMpHcpZUcteqaQAe83OG+edDapQtZc9yOu7lrJX2Xw3r0xVMfHZ5MmT45VXXsm2usnO0v3U/TKtm33qqafGJZdcEvfff3+89tpr8cMf/jBbU/vAAw+MSpPGdKSZClOhnVvaH9i7uzEfAAArwHctloXrpTJVRUv2iy++GLvsskv9fl2Xm6OPPjpuvfXWOPvss7O1tE888cSYMGFC7LjjjvHQQw9Fs2bNohKlpQCuPaJnNpFCGueRuqGkX8kUYgCAFee7FsvC9VJ5qiLI/va3v52th70oqTX7oosuyrZqkQqtggsAsHL4rsWycL1UlqroLg4AAAANQZANAAAAJSLIBgAAgBIRZAMAAECJCLIBAACgRATZAAAAUCKCbAAAACgRQTYAAACUiCAbAAAASkSQDQAAACUiyAYAAIASEWQDAABAiQiyAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAlIggGwAAAEpEkA0AAAAlIsgGAACAEhFkAwAAQIkIsgEAAKBEBNkAAABQIoJsAAAAKBFBNgAAAJTIalHGZs6cGePGjYspU6ZEu3btYs0118w7SwAAAFCcluxJkybF4MGDY+edd45WrVrFBhtsEJtsskkWZK+//vpxwgknxAsvvJB3NgEAAKC8g+wrr7wyC6pvueWW2G233eK+++6LV155Jd5555149tln4/zzz48vv/wydt9999hzzz1jxIgReWcZAAAAyrO7eGqhHjp0aGy22WYLTf/Wt74Vxx57bFx//fVZIP7kk09G165dGzyfAAAAUPZB9h/+8IelOq9p06bx4x//eKXnBwAAAArbXXxhpk+fnm0AAABQ7soyyH700Udj7733jjXWWCOaN2+ebel+OvbYY4/lnT0AAAAoRpB92223ZcF069at46qrrooHHngg29L9Nm3aZGm/+93v8s4mAAAAlPeY7OTSSy+NQYMGxcknn7xA2o9+9KPYcccd46KLLoof/OAHueQPAAAACtOSPXr06Gz5rkXZdddd48MPP2zQPAEAAEAhg+y0fNfNN9+8yPTf/va3semmmzZongAAAKCQ3cWvuOKK2HfffeOhhx7KWrTXXnvt7PjHH38cjz/+eLz33nvxl7/8Je9sAgAAQPkH2d/+9rfj9ddfj8GDB8c//vGPGDduXHZ8nXXWib322itbH3uDDTbIO5sAAABQ/kF2koLogQMH5p0NAAAAKPaYbAAAACiqwgXZr776aqy66qp5ZwMAAACKH2Qnc+bMKfljTpo0KU499dRYf/31o6amJrbffvt44YUXSv48VL6JU2bEyE8mx7DRn8fITydn+wDVSH0IUJ7Uz1U2Jvvggw9ebPrEiROjUaNGJX/e448/Pptw7Xe/+1107Ngx7rjjjmx28zfeeCPWXXfdkj8flWnshKnRZ8jweHLE+Ppjvbq2jQG9u0fHNjW55g2gIakPAcqT+rkKW7L//Oc/x7Rp06J169YL3VZfffWSP+fUqVNjyJAhcfnll0evXr1io402igsuuCC7TbOcw9JIvwDOX2ElQ0eMj75DhvuFEKga6kOA8qR+rtKW7E022SR69+4dxx133ELTX3nllXjggQdK+pxffvllzJo1K5o1azbP8dRt/Kmnnlro30yfPj3b6tTW1pY0TxTP+MkzFqiw5q64Unrr5k0aPF+VRtmD8i976kMoHZ97lJL6uUpbsrfaaqt4+eWXF5netGnT6Ny5c0mfs2XLlrHddtvFxRdfHGPHjs0C7tRd/Nlnn42PPvpooX/Tv3//eVrYO3XqVNI8UTy102YuNn3SEtJZOsoelH/ZUx9C6fjco5TUz1UaZF9//fXxq1/9arEt3aNGjSr586ax2GlCtTT+OgXy11xzTRxxxBGxyioLf4n69euXjQ+v28aMGVPyPFEsrZo1Xmx6yyWks3SUPSj/sqc+hNLxuUcpqZ+rtLt4CnDzsOGGG8YTTzwRX3zxRdYNp0OHDnHYYYfF1772tUXmM6+8Up7art4kmzQidbWZXzqe0llxyh6Uf9lTH0Lp+NyjlNTPVdqSnbcWLVpkAfbnn38eDz/8cBxwwAF5Z4mCSONX0qyMqYKaW9of2Lu78S1A1VAfApQn9XOVtmTnJQXUqbv4xhtvHO+++26cddZZ0a1btzjmmGPyzhoFkpY9uPaIntmkEWlMS+pyk34RVGEB1UZ9CFCe1M8rnyD7K2mMSxrz8uGHH8aaa66ZzXB+6aWXRuPGxiWwbFIFpZICUB8ClCv1cxUF2cOHD4/NN998kZONrUyHHnpotgEAAEBFjMnu2bNnjB//v4Pw04Rjn332Wd5ZAgAAgGIG2W3atKlfnuv999+P2bNn550lAAAAKGZ38TQOeuedd85m927UqFFsvfXWseqqqy703Pfee6/B8wcAAACFCbJvuOGGOPjgg7PZvU855ZQ44YQTomXLlnlnCwAAAIoXZCd77rlndvvSSy/Fz3/+c0E2AAAAhVF2QXadW265pf5+WlYrWW+99XLMEQAAABRo4rO5pUnPLrroomjdunWsv/762ZYmRrv44otNiAYAAEBZKtuW7HPOOSduvvnmGDBgQOywww7ZsaeeeiouuOCCmDZtWlx66aV5ZxEAAACKEWTfdtttcdNNN8X+++9ff6x79+6x7rrrxk9+8hNBNgAAAGWnbLuL//vf/45u3botcDwdS2kAAABQbso2yN5yyy3juuuuW+B4OpbSAAAAoNyUbXfxyy+/PPbZZ5947LHHYrvttsuOPfvsszFmzJh48MEH884eAAAAFCfI3nnnneOdd96J3/zmN/HWW29lxw4++OBsPHbHjh3zzh4Ay+HNN9+Mopo+fXo0bdo0iqpt27bRuXPnvLMBABWvbIPsJAXTJjgDKL6pEz+LiEZx1FFHRWE1ahQxZ04UVU1N83jrrTcF2gBQzUE2AJVh5pRJETEneny/T7TrsuCkluXuo9eejdfvv6Gw+a/96P147rcXxvjx4wXZALCSCbIBaDCrt+8ca3beOIoYpBY5/wBAwynb2cUBAACgaATZAAAAUOlB9ne+852YMGHCAsdra2uzNAAAACg3ZRtk//3vf48ZM2YscHzatGnx5JNP5pInAAAAKNTEZ8OHD6+//8Ybb8S4cePq92fNmhUPPfRQrLvuujnlDgAAAAoUZPfo0SMaNWqUbQvrFl5TUxPXXnttLnkDAACAQgXZo0aNijlz5sTXvva1eP7556Ndu3b1aU2aNIn27dvHqquummseAQAAoBBB9vrrr5/dzp49O++sAAAAQLGD7Dq33377YtN/+MMfNlheAAAAoNBB9s9//vN59mfOnBlTpkzJuow3b95ckA0AAEDZKdslvD7//PN5tsmTJ8fbb78dO+64Y/zhD3/IO3sAAABQnCB7Ybp27RoDBgxYoJUbAAAAykGhguxktdVWi7Fjx+adDQAAACjOmOz7779/nv20rNdHH30U1113Xeywww655QsAAAAKF2QfeOCB8+w3atQoWzP7O9/5TlxxxRW55QsAAAAKF2RbJxsAAICiKcSY7NRVPG0AAABQzso6yL799ttjiy22iJqammzr3r17/O53v8s7WwAAAFCs7uJXXnllnHvuufHTn/60fqKzp556Kn784x/H+PHj47TTTss7iwAAAFCMIPvaa6+NwYMHxw9/+MP6Y/vvv39sttlmccEFFwiyAQAAKDtl2108Lde1/fbbL3A8HUtpAAAAUG7KNsjeaKON4u67717g+F133RVdu3bNJU8AAABQyO7iF154YRx22GExdOjQ+jHZTz/9dDz++OMLDb4BAAAgb2UbZPfu3Tuee+65uOqqq+K+++7Ljm2yySbx/PPPR8+ePUv+fLNmzcrGet9xxx0xbty46NixY/zoRz+KX/7yl9GoUaOSPMfHtdPi8y9mRO20L6NVzWqxRvMmsXarZiV5bAAo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aR5vvfWmQBug2oPshx9+OPbff//o0aNH7LDDDtmxp59+OjbbbLP485//HN/97nfzziIAsASpBTsF2Nsce3606rBBFM1Hrz0br99/Q/T4fp9o16VbFE3tR+/Hc7+9MHsfBNkAVR5k9+3bN0477bQYMGDAAsf79OkjyAaAAkkB9pqdN44iBqnJ6u07FzL/ADS8sl0nO3URP+644xY4fuyxx8Ybb7yRS54AAACgkEF2mkn8lVdeWeB4Ota+fftc8gQAAACF7C5+wgknxIknnhjvvfdebL/99vVjsgcOHBinn3563tkDAACA4gTZ5557brRs2TKuuOKK6NevX3asY8eOccEFF8Qpp5ySd/YAAACgOEF2o0aNsonP0jZp0qTsWAq6AQAAoFyVbZA9N8E1AAAARVBWE5/tueee8Y9//GOJ56WW7TQ2+ze/+U2D5AsAAAAK15J9yCGHRO/evaN169ax3377xdZbb52Nw27WrFl8/vnn2dJdTz31VDz44IOxzz77xK9+9au8swwAAADlGWSndbGPOuqo+NOf/hR33XVX3HDDDTFx4sT6Mdqbbrpp7LHHHvHCCy/EJptsknd2AQAAoHyD7KRp06ZZoJ22JAXZU6dOjbXWWisaN26cd/YAAACgOEH2/FLX8bQBAABAuSuric/m97vf/S522GGHbFz2Bx98kB276qqr4r//+7/zzhoAAAAUJ8gePHhwnH766bH33nvHhAkTYtasWdnxNdZYIwYNGpR39gAAAKA4Qfa1114bN954Y5xzzjmx6qqr1h9PM46/9tprueYNAAAAChVkjxo1Knr27LnQidG++OKLXPIEAAAAhQyyu3TpEq+88soCxx966CHLdwEAAFCWynZ28TQe++STT45p06bFnDlz4vnnn48//OEP0b9//7jpppvyzh4AAAAUJ8g+/vjjo6amJn75y1/GlClT4vvf/342y/jVV18dhx9+eN7ZAwAAgGIE2V9++WXceeedsccee8SRRx6ZBdmTJ0+O9u3b5501AAAAKNaY7NVWWy1+/OMfZ13Fk+bNmwuwAQAAKHtlGWQn3/rWt2LYsGF5ZwMAAACK3V08+clPfhJnnHFGfPjhh7HVVltFixYt5knv3r17bnkDAACAQgXZdZObnXLKKfXHGjVqlM00nm5nzZqVY+4AAACgQEH2qFGjGvT5UtB+wQUXxB133BHjxo3LZjL/0Y9+lM1unoJ6YMVMnDIjxk+eEbXTZkarmsbRtkWTaN28Sd7ZKgSvHQBAcb43lW2Qvf766zfo8w0cODAGDx4ct912W2y22Wbx4osvxjHHHBOtW7eepzUdWHZjJ0yNPkOGx5Mjxtcf69W1bQzo3T06tqnJNW/lzmsHAFCs701lO/FZMnLkyPjZz34Wu+22W7alYDcdWxmeeeaZOOCAA2KfffaJDTbYIL73ve/F7rvvHs8///xKeT6opl8T56/skqEjxkffIcOzdBbOawcAULzvTWUbZD/88MOx6aabZkFumuQsbc8991zWyvzoo4+W/Pm23377ePzxx+Odd97J9l999dV46qmnYq+99lro+dOnT4/a2tp5NmBBqbvO/JXd3JVeSl8W1VT2Sv3awYqoprIH5UTZg+J9byrb7uJ9+/aN0047LQYMGLDA8T59+sR3v/vdkj9fqrS6desWq666ajZG+9JLL40jjzxyoef3798/LrzwwpLmASpRGg+zOJOWkF7NZa/Urx2siGoqe1BOlD0o3vemsm3JfvPNN+O4445b4Pixxx4bb7zxRsmf7+67747f//73ceedd8bLL7+cjc3+9a9/nd0uTL9+/WLixIn125gxY0qeJ6gErZo1Xmx6yyWkV3PZK/VrByuimsoelBNlD4r3valsW7LbtWsXr7zySnTt2nWe4+lY+/btS/58Z511VtaaXbd02BZbbBEffPBB9uvh0UcfvcD5TZs2zTZg8dqu3iSbcCJ105lfOp7Sl0U1lb1Sv3awIqqp7EE5UfageN+byrYl+4QTTogTTzwxm/X7ySefzLbUdfw//uM/srRSmzJlSqyyyrwvR+o2Pnv27JI/F1STtGRCmtExVW5zS/sDe3e3FNVieO0AAIr3valsW7LPPffcaNmyZVxxxRVZN5kkrV2d1rJeGUtq7bffftkY7M6dO2eTqw0bNiyuvPLKrHs6sGLSkgnXHtEzm3AijYdJ3XXSr4mCxCXz2gEAFOt7U9kG2Y0aNcomPkvbpEmTsmMp6F5Zrr322iyw/8lPfhKffPJJFtCnVvPzzjtvpT0nVJNUuQkMl4/XDgCgON+byjbIHjVqVHz55ZfZmOy5g+sRI0ZE48aNs7WsSyk9x6BBg7INAAAAKmpM9o9+9KN45plnFjie1spOaQAAAFBuyjbITmOid9hhhwWOb7vtttkM4wAAAFBuVinnMdl1Y7HnltYHnDVrVi55AgAAgEIG2b169crWqJ47oE7307Edd9wx17wBAABAoSY+S+tjp0B74403jp122ik7ltbKrq2tjf/5n//JO3sAAABQnJbsTTfdNIYPHx6HHnpotqRW6jr+wx/+MN56663YfPPN884eAAAAFKclO0lrVV922WV5ZwMAAACK3ZL90EMPxVNPPVW//5vf/CZ69OgR3//+9+Pzzz/PNW8AAABQqCD7rLPOysZfJ6+99lqcfvrpsffee8eoUaOy+wAAAFBuyra7eAqm07jsZMiQIbHffvtlXcdffvnlLNgGAACAclO2LdlNmjSJKVOmZPcfe+yx2H333bP7a665Zn0LNwAAAJSTsm3JTmthp27hO+ywQzz//PNx1113ZcffeeedWG+99fLOHgAAABSnJfu6666L1VZbLe65554YPHhwrLvuutnxv/71r7HnnnvmnT0AAAAoTkt2586d44EHHljg+FVXXTXP/oABA+LHP/5xtGnTpgFzBwAAAAVqyV5aaTK0f//733lnAwAAAIofZM+ZMyfvLAAAAEBlBNkAAABQLgTZAAAAUCKCbAAAACgRQTYAAACUSOGD7J122ilqamryzgYAAACUb5D9wx/+MG655ZYYOXLkYs978MEHo0OHDg2WLwAAAChckN2kSZPo379/dO3aNTp16hRHHXVU3HTTTTFixIi8swYAAADFCrJTQP3OO+/EmDFj4vLLL4/VV189rrjiiujWrVust956eWcPAAAAihNk11ljjTVirbXWym7btGkTq622WrRr1y7vbAEAAEBxguxf/OIXsf3222cBdt++fWPatGnZ7bhx42LYsGF5Zw8AAAAWsFqUqQEDBmQt1ueff34cfPDB8fWvfz3vLAEAAEAxg+zUWv3EE0/E3//+92wsdpoIbeedd45vf/vb2SboBgAAoNyUbZC95ZZbZtspp5yS7b/66qtx1VVXxcknnxyzZ8+OWbNm5Z1FAAAAKEaQPWfOnKw1O7Vkp+2pp56K2tra6N69e9aiDQAAAOWmbIPsNddcMyZPnpy1Zqeg+oQTToiddtopm2EcAAAAylHZBtl33HFHFlS3atUq76wAAABAsZfw2meffbIA+913342HH344pk6dWt+NHAAAAMpR2bZkf/bZZ3HooYfG3/72t2jUqFGMGDEivva1r8Vxxx0Xa6yxRjbjOAAAS/bmm29GERU130B1K9sg+7TTTovGjRvH6NGjY5NNNqk/fthhh8Xpp58uyAYAWIKpEz+LiEZx1FFHRZHNnD4j7ywAFD/IfuSRR7Ju4uutt948x7t27RoffPBBbvkCACiKmVMmpcF20eP7faJdl25RNB+99my8fv8N8eWXX+adFYDiB9lffPFFNG/efIHj//73v6Np06a55AkAoIhWb9851uy8cRRN7Ufv550FgMqZ+CzNLH777bfX76dx2bNnz47LL788dtlll1zzBgAAAIVqyU7B9K677hovvvhizJgxI84+++z45z//mbVkP/3003lnDwAAAIoTZG+++ebxzjvvxHXXXRctW7aMyZMnx8EHHxwnn3xydOjQoeTPt8EGGyx0rPdPfvKT+M1vflPy56O0Jk6ZEeMnz4jaaTOjVU3jaNuiSbRu3iTvbFWESnhtK+F/KHdeYwAqjc+2/+V1qKAgO2ndunWcc845DfJcL7zwQsyaNat+//XXX4/vfve7ccghhzTI87P8xk6YGn2GDI8nR4yvP9ara9sY0Lt7dGxTk2veiq4SXttK+B/KndcYgErjs+1/eR0qYEz28OHDs3HXdfcXt5Vau3btYp111qnfHnjggdhwww1j5513LvlzUdpf1uYv+MnQEeOj75DhWTrV+9pWwv9Q7rzGAFQan23/y+tQIS3ZPXr0iHHjxkX79u2z+2myszlz5ixwXjo+d6tzqaUx4HfccUe2Hnd6roWZPn16ttWpra1daflh0VLXlfkL/twVQErXnaWyXttlKXvl+j9UEq9x9fC5B/lQ9hqez7b/5XWokCB71KhRWYty3f283HfffTFhwoT40Y9+tMhz+vfvHxdeeGGD5osFpbEhizNpCekU77VdlrJXrv9DJfEaVw+fe5APZa/h+Wz7X16HCukuvv7669e3HK+99trZ/qK2lenmm2+OvfbaKzp27LjIc/r16xcTJ06s38aMGbNS88TCtWrWeLHpLZeQTvFe22Upe+X6P1QSr3H18LkH+VD2Gp7Ptv/ldaiQIHtuqcv40UcfHY8++mj9OO2GkGYYf+yxx+L4449f7HlNmzaNVq1azbPR8Nqu3iSbfGFh0vGUTmW9tstS9sr1f6gkXuPq4XMP8qHsNTyfbf/L61CBQfZtt90WU6ZMiQMOOCDWXXfdOPXUU7M1s1e2W265JQvw99lnn5X+XKy4NA4kzW44fwWQ9gf27m6cSJW/tpXwP5Q7rzEAlcZn2//yOlTImOy5HXTQQdk2adKkuOeee+IPf/hDbLvttvG1r30tjjrqqDjvvPNK/pypxTwF2akFfbXVyvalYT5p+YBrj+iZTb6QxoakrivplzUFf8VVwmtbCf9DufMaA1BpfLb9L6/D8in7SLJly5ZxzDHHZNsbb7wRRx55ZDb5w8oIslM38dGjR8exxx5b8sdm5UoFXWFfOSrhta2E/6HceY0BqDQ+2/6X16ECg+xp06bF/fffH3feeWc89NBD2YRoZ5111kp5rt13332hS4YBAABAoYPshx9+OAus03Jaqev29773vXjkkUeiV69eeWcNAAAAihVkp/HY++23X9x+++2x9957R+PGpogHAACgvJVlkP3ll1/GwIED45BDDol11lkn7+wAAABAcZfwSt3D+/TpE9OnT887KwAAAFDsIDv51re+FcOGDcs7GwAAAFDs7uLJT37ykzjjjDPiww8/jK222ipatGgxT3r37t1zyxsAAAAUKsg+/PDDs9tTTjml/lijRo2yJbbS7axZs3LMHQAAABQoyB41alTeWQAAAIDKCLLXX3/9vLMAAAAAlTHxWfK73/0udthhh+jYsWN88MEH2bFBgwbFf//3f+edNQAAAChOkD148OA4/fTTY++9944JEybUj8Fu06ZNFmgDAABAuSnbIPvaa6+NG2+8Mc4555xYddVV649vvfXW8dprr+WaNwAAAChUkJ0mPuvZs+cCx5s2bRpffPFFLnkCAACAQgbZXbp0iVdeeWWB4w899FBssskmueQJAAAACjm7eBqPffLJJ8e0adOytbGff/75+MMf/hD9+/ePm266Ke/sAQAAQHGC7OOPPz5qamril7/8ZUyZMiW+//3vZ7OMX3311XH44YfnnT0AAAAoTpCdHHnkkdmWguzJkydH+/bt884SAAAAFG9M9ne+851s6a6kefPm9QF2bW1tlgYAAADlpmyD7L///e8xY8aMBY6nMdpPPvlkLnkCAACAQnUXHz58eP39N954I8aNG1e/P2vWrGx28XXXXTen3AEAAECBguwePXpEo0aNsm1h3cLTZGjXXnttLnkDAACAQgXZo0aNypbs+trXvpYt29WuXbv6tCZNmmRjs1ddddVc8wgAAACFCLLX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RprEJ82am75Azi3tD+zd3SQ/UDDK9PLz2gFQzXKfXTwFtF26dIkjjjgiBgwYME/aSSedFA8++GC2rnUKnNNs30laritJY6l79OiRdTG//PLLszHUP/jBD7IluuZewmvzzTfP1ttOk6r9z//8T5xyyinZjONzL+F19NFHx3/913/Ft771rWwJr7vvvjubzXz+sdqLYqZH5p5VN03qk8Ycpi6RqcXGF8qVR9ljZVOml7/see2g9HzuQfnLvbt46iaeWqdTADy/q666Kpvpu3fv3tnMiiko/s///M/69NTNOy35lYLx1OrcokWLLFi+6KKL6s9JAXwKqNOa21dffXWst956cdNNN9UH2Mlhhx2WLfl13nnnZYF6CtzT8l5LG2DD3NIXSF8ioXIo08vPawdANcq9JbtS+FUR8qHsQT6UPciHsgflryzGZAMAAEAlEGQDAABAiQiyAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAVMo62QAAQOmNHj06xo8fH0U1ffr0aNq0aRSV/Oerbdu20blz51yeW5ANAAAVGGB367ZJTJ06JQqrUaOIOXOisOQ/VzU1zeOtt97MJdAWZAMAQIVJLdgpwN7m2POjVYcNomg+eu3ZeP3+G6LH9/tEuy7domjkP1+1H70fz/32wqwcFCLInjBhQtx7773x5JNPxgcffBBTpkyJdu3aRc+ePWOPPfaI7bfffuXkFAAAWCYpwF6z88ZRxCApWb19Z/nPQdHzX5iJz8aOHRvHH398dOjQIS655JKYOnVq9OjRI3bddddYb7314m9/+1t897vfjU033TTuuuuulZtrAAAAKENL3ZKdWqqPPvroeOmll7JAemFS4H3ffffFoEGDYsyYMXHmmWeWMq8AAABQGUH2G2+8EWuttdZiz6mpqYkjjjgi2z777LNS5A8AAAAqr7v4kgLsFT0fAAAAqibIXpw333wzbrnllnjllVdK8XAAAABQSMs8u/hFF12UdQs/66yzsv004dmee+4ZLVu2jIkTJ8att94aRx555MrIKwAAAFRWS/Y999wzz8Rnl156aZxyyinZGmTXXXddXHbZZaXOIwAAAFRWS/btt98ec+bMiffffz/rFp4mNkv7Tz/9dOy0005Z+uzZs+O9997L7ic//OEPV2beAQAAoJhB9vrrr5/dNmnSJNZee+1sPwXbrVq1il122SULuKdPnx6NGjWKDTbYINunfE2cMiPGT54RtdNmRquaxtG2RZNo3bxJ3tkCoMTU95APZQ+q11IH2TvvvHN2+41vfCMeeOCB6NOnTzz00EOx9957R69evbK01157LTp16lS/T3kaO2Fq9BkyPJ4cMb7+WK+ubWNA7+7RsU1NrnkDoHTU95APZQ+q2zKPyf7Vr36VtWDvsMMO8cEHH2QTodVJk56lSdAo719V56/0k6EjxkffIcOzdACKT30P+VD2gGWeXXzLLbfMxmWnMdnzr4V95plnZt3HKV+p29L8lf7clX9K15UJoPjU95APZQ9Y5iC7zvwBdtKhQ4cVzQ8rWRoXtDiTlpAOQDGo7yEfyh6w1N3F//jHPy71g44ZMyabdZzy06pZ48Wmt1xCOgDFoL6HfCh7wFIH2YMHD45NNtkkLr/88njzzTcXSJ84cWI8+OCD8f3vfz+bHC11J6f8tF29STbxxsKk4ykdgOJT30M+lD1gqYPsJ554IgYOHBiPPvpobL755tnY665du8YWW2wR6623XtZ9/Nhjj43OnTvH66+/Hvvvv//KzTnLJY0BSjNbzl/5p/2BvbsbIwRQIdT3kA9lD1imMdkpcE7bp59+mnUHT7OLT506Ndq2bRs9e/bMtlVWWeYJy2lgaemIa4/omU28kcYFpW5L6VdVlT5AZVHfQz6UPahuyzXxWbt27eLAAw8sfW5oMKmSV9EDVD71PeRD2YPqtVzNzkcffXQMHTq09LkBAACAaguy0yRnu+22WzYm+7LLLot//etfpc8ZAAAAVEOQfd9992WB9UknnRR33XVXbLDBBrHXXnvFPffcEzNnWvsPAACA6rTcs5Slcdmnn356vPrqq/Hcc8/FRhttFD/4wQ+iY8eOcdppp8WIESNKm1MAAAAocys8FfhHH32ULeuVtlVXXTX23nvveO2112LTTTeNq666qjS5BAAAgEoNslOX8CFDhsS+++4b66+/fvzpT3+KU089NcaOHRu33XZbPPbYY3H33XfHRRddVPocAwAAQCUt4dWhQ4eYPXt2HHHEEfH8889Hjx49Fjhnl112iTZt2pQijwAAAFC5QXbqBn7IIYdEs2bNFnlOCrBHjRq1InkDAACAyg6yU1fxY445Jnr27Bmbb775yskVhTBxyowYP3lG1E6bGa1qGkfbFk2idfMmeWcLKo6yBlA86m6oXsscZDdu3Dg6d+4cs2bNWjk5ohDGTpgafYYMjydHjK8/1qtr2xjQu3t0bFOTa96gkihrAMWj7obqtlwTn51zzjnxi1/8Iv7973+XPkcU4pfZ+T84kqEjxkffIcOzdGDFKWsAxaPuBpZrTPZ1110X7777brYmdppdvEWLFvOkv/zyy6XKH2UodX2a/4Nj7g+QlK47FKw4ZQ2geNTdwHIF2QceeGDpc0JhpLFFizNpCenA0lHWAIpH3Q0sV5B9/vnnlz4nFEarZo0Xm95yCenA0lHWAIpH3Q0s15hsqlvb1Ztkk3csTDqe0oEVp6wBFI+6G1iuIDvNLP7rX/86vvWtb8U666wTa6655jwblS2NI0qzY87/AZL2B/bubpwRlIiyBlA86m5gubqLX3jhhXHTTTfFGWecEb/85S+z2cbff//9uO++++K8884rfS4pO2n5iWuP6JlN3pHGFqWuT+mXWR8cUFrKGkDxqLuhui1XkP373/8+brzxxthnn33iggsuiCOOOCI23HDD6N69e/zjH/+IU045pfQ5peykDwofFrDyKWsAxaPuhuq1XN3Fx40bF1tssUV2f/XVV4+JEydm9/fdd9/4y1/+UtocAgAAQCUH2eutt1589NFH2f3Ugv3II49k91944YVo2rTpMj3Wv/71rzjqqKNirbXWipqamix4f/HFF+vT58yZk3VB79ChQ5a+2267xYgRI+Z5jH//+99x5JFHRqtWraJNmzZx3HHHxeTJk+c5Z/jw4bHTTjtFs2bNolOnTnH55ZcvkJc//elP0a1bt+yclI8HH3xwmf4X8jNxyowY+cnkGDb68xj56eRsH+q4PoDloe4AoMG6ix900EHx+OOPxzbbbBM/+9nPsiD55ptvjtGjR8dpp5221I/z+eefxw477BC77LJL/PWvf4127dplAfQaa6xRf04Khq+55pq47bbbokuXLnHuuefGHnvsEW+88UYWDCcpwE5B/6OPPhozZ86MY445Jk488cS48847s/Ta2trYfffdswD9+uuvj9deey2OPfbYLCBP5yXPPPNM1u29f//+WYt8+tu0HvjLL78cm2+++fK8TDSQsROmRp8hw+PJEePnmVwkTTqSxkRR3VwfwPJQdwDQoEH2gAED6u8fdthh0blz53j22Weja9eusd9++y314wwcODBrVb7lllvqj6VAeu5W7EGDBmWTqx1wwAHZsdtvvz3WXnvtbJK1ww8/PN5888146KGHslb0rbfeOjvn2muvjb333jubAb1jx47ZGPIZM2bEb3/722jSpElsttlm8corr8SVV15ZH2RfffXVseeee8ZZZ52V7V988cVZ0H7ddddlgTnlKbUqzP8lKBk6Ynz0HTI8m3TEeKjq5foAloe6A4Dc18nebrvt4vTTT1+mADu5//77s8D4kEMOifbt20fPnj2zCdXqjBo1Khv/nVqg67Ru3TprQU9BfZJuU4t0XYCdpPNXWWWVeO655+rP6dWrVxZg10mt4W+//XbWml53ztzPU3dO3fPMb/r06VkL+dwbDS/N2jn/l6C5vwyldCrLspQ91weUTjV97qk7KCfVVPag6lqyU0C8tPbff/+lOu+9996LwYMHZwH6L37xi6w1Os1MnoLho48+Oguwk9RyPbe0X5eWblOAPrfVVlstW6977nPmbiGf+zFTWuqenm4X9zzzS93K01Jm5Kt22szFpqdlM6gsy1L2XB9QOtX0uafuoJxUU9mDqguy0/jkpdGoUaOYNWvWUp07e/bsrAX6sssuy/ZTS/brr7+edc9OQXY569evX/bjQJ30q2Lq+k7DatWs8WLT07qUVJZlKXuuDyidavrcU3dQTqqp7EHVdRdPAfHSbEsbYCdpxvBNN910nmObbLJJNoFass4662S3H3/88TznpP26tHT7ySefzJP+5ZdfZjOOz33Owh5j7udY1Dl16fNLs6in2czn3mh4bVdvkk1EszDpeEqnsixL2XN9QOlU0+eeuoNyUk1lDypFScZkL680s3gaFz23d955J9Zff/3sfurinYLcNJP53L/epbHWaRx4km4nTJgQL730Uv05//M//5MF/Gnsdt05Q4cOzWYer5MmNdt4443rZzJP58z9PHXn1D0P5SlNPJNmep3/y1DaH9i7u4lpqpzrA1ge6g4AGnx28eSLL76IJ554Imt1TjN3zy2Nq14aabmv7bffPusufuihh8bzzz8fN9xwQ7bVdT0/9dRT45JLLslmLq9bwivNGF7XfT21fKdZwU844YSsm3kKpH/6059mM4+n85Lvf//72ViWtH52nz59si7paTbxq666qj4vP//5z2PnnXeOK664IvbZZ5/44x//mK3XXZcXyldaSiXN9Jomoknj5FI3vtTK4EsQiesDWB7qDgAaNMgeNmxYtkTWlClTsmA7TTI2fvz4aN68eTYJ2dIG2d/85jfj3nvvzcaaXHTRRVkQnZbsSute1zn77LOz50hLbaUW6x133DFbsqtujewkLdGVAutdd901m1W8d+/e2drac89I/sgjj8TJJ58cW221VbRt2zbOO++8+uW7khTsp7Wx03JhaRK2FNSnZcKskV0M6UuPLz4siusDWB7qDgAaLMhOLdBpua7UcpwC2H/84x/RuHHjOOqoo7IW4WWx7777ZtuipNbsFICnbVFSkJ8C5MXp3r17PPnkk4s9Jy0lljYAAABosDHZr7zySpxxxhlZq/Gqq66ard+XZjm8/PLLs1ZgAAAAqEbLFWSnVusUYCepe3jdbOCpVXvMmDGlzSEAAABUcnfxtJ71Cy+8kI1bTpOFpfHNaUz27373O2OYAQAAqFrL1ZKdZgNPa1wnl156abYM1kknnZQF2v/1X/9V6jwCAABA5bZkb7bZZjFnzpz67uJpArQ0S/imm24aPXr0KHUeAQAAoHJbsg844IC4/fbbs/tpWa1tt902rrzyymzt6sGDB5c6jwAAAFC5QfbLL78cO+20U3b/nnvuibXXXjs++OCDLPCee31qAAAAqCbLFWRPmTIlWrZsmd1/5JFH4uCDD85mG08t2inYBgAAgGq0XEH2RhttFPfdd1+2XNfDDz8cu+++e3b8k08+iVatWpU6jwAAAFC5QXZasuvMM8+MDTbYILbZZpvYbrvt6lu10/JeAAAAUI2Wa3bx733ve7HjjjvGRx99FFtuuWX98V133TUOOuigUuYPAAAAKjvITtZZZ51sm9u3vvWtUuQJAAAAqqe7OAAAALAgQTYAAACUiCAbAAAASkSQDQAAACUiyAYAAIASEWQDAABAiQiyAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAlIggGwAAAEpEkA0AAAAlIsgGAACAEhFkAwAAQIkIsgEAAKBEBNkAAABQIoJsAAAAKBFBNgAAAJSIIBsAAABKRJANAAAAJSLIBgAAgBIRZAMAAECJCLIBAACgRATZAAAAUCKCbAAAACgRQTYAAACUiCAbAAAASkSQDQAAACUiyAYAAIASEWQDAABAiQiyAQAAoEQE2QAAAFAigmwAAAAoEUE2AAAAVEKQfcEFF0SjRo3m2bp161afPm3atDj55JNjrbXWitVXXz169+4dH3/88TyPMXr06Nhnn32iefPm0b59+zjrrLPiyy+/nOecv//97/GNb3wjmjZtGhtttFHceuutC+TlN7/5TWywwQbRrFmz2GabbeL5559fif85AAAAlSj3luzNNtssPvroo/rtqaeeqk877bTT4s9//nP86U9/iieeeCLGjh0bBx98cH36rFmzsgB7xowZ8cwzz8Rtt92WBdDnnXde/TmjRo3Kztlll13ilVdeiVNPPTWOP/74ePjhh+vPueuuu+L000+P888/P15++eXYcsstY4899ohPPvmkpP/rxCkzYuQnk2PY6M9j5KeTs32ASqfuA5aHugMoqtVyz8Bqq8U666yzwPGJEyfGzTffHHfeeWd85zvfyY7dcsstsckmm8Q//vGP2HbbbeORRx6JN954Ix577LFYe+21o0ePHnHxxRdHnz59slbyJk2axPXXXx9dunSJK664InuM9PcpkL/qqquyQDq58sor44QTTohjjjkm209/85e//CV++9vfRt++fUvyf46dMDX6DBkeT44YX3+sV9e2MaB39+jYpqYkzwFQbtR9wPJQdwBFlntL9ogRI6Jjx47xta99LY488sis+3fy0ksvxcyZM2O33XarPzd1Je/cuXM8++yz2X663WKLLbIAu04KnGtra+Of//xn/TlzP0bdOXWPkVrB03PNfc4qq6yS7deds6LSL6/zf1AkQ0eMj75DhvtlFqhI6j5geag7gKLLtSU7jX1O3bs33njjrKv4hRdeGDvttFO8/vrrMW7cuKwluk2bNvP8TQqoU1qSbucOsOvS69IWd04KxKdOnRqff/551u18Yee89dZbi8z79OnTs61OerxFGT95xgIfFHN/YKT01s2bLPLvgeUre+RL3VdZlD0airpjXsoeFE+uLdl77bVXHHLIIdG9e/esdfnBBx+MCRMmxN133x3lrn///tG6dev6rVOnTos8t3bazMU+1qQlpAPLV/bIl7qvsih7NBR1x7yUPSie3LuLzy21Wn/961+Pd999Nxunnbpyp6B7bml28box3Ol2/tnG6/aXdE6rVq2ipqYm2rZtG6uuuupCz1nYWPE6/fr1y8aN121jxoxZ5LmtmjVe7P/dcgnpwPKVPfKl7qssyh4NRd0xL2UPiqesguzJkyfHyJEjo0OHDrHVVltF48aN4/HHH69Pf/vtt7Mx29ttt122n25f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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import seaborn as sns\n",
+ "sns.pairplot(df)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "3184c055",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " copy_X \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " tol \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " n_jobs \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " positive \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = linear_model.LinearRegression()\n",
+ "model.fit(df[['experience', 'test_score(out of 10)', 'interview_score(out of 10)']], df['salary($)'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "1acba9d9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[53290.89255945]\n",
+ "[92268.07227784]\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\sklearn\\utils\\validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n",
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\sklearn\\utils\\validation.py:2749: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(model.predict([[2, 9, 6]]))\n",
+ "print(model.predict([[12, 10, 10]]))"
+ ]
+ }
+ ],
+ "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.13.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/2_linear_reg_multivariate/flashcards.md b/ML/2_linear_reg_multivariate/flashcards.md
new file mode 100644
index 00000000..d86e87a6
--- /dev/null
+++ b/ML/2_linear_reg_multivariate/flashcards.md
@@ -0,0 +1,70 @@
+### **Card 1**
+**Front**: What is multiple linear regression?
+**Back**:
+A regression model with multiple independent variables predicting one dependent variable:
+`y = b + m₁x₁ + m₂x₂ + ... + mₙxₙ`
+
+---
+
+### **Card 2**
+**Front**: How do you handle missing values in a DataFrame column using median?
+**Back**:
+`df['column'] = df['column'].fillna(df['column'].median())`
+
+---
+
+### **Card 3**
+**Front**: How to select all columns except one as features for training?
+**Back**:
+`df.drop('target_column', axis=1)`
+Returns DataFrame without the specified column
+
+---
+
+### **Card 4**
+**Front**: What does `reg.coef_` return in multiple linear regression?
+**Back**:
+An array of coefficients - one for each feature in the order they were provided
+
+---
+
+### **Card 5**
+**Front**: How to manually calculate predictions using coefficients and intercept?
+**Back**:
+`prediction = intercept + (feature1 * coef1) + (feature2 * coef2) + ...`
+
+---
+
+### **Card 6**
+**Front**: What's the correct format for prediction input with multiple features?
+**Back**:
+`model.predict([[feature1, feature2, feature3]])`
+Double brackets for 2D array format
+
+---
+
+### **Card 7**
+**Front**: What are independent variables called in machine learning?
+**Back**:
+Features or predictors
+
+---
+
+### **Card 8**
+**Front**: What is the dependent variable called in machine learning?
+**Back**:
+Target or response variable
+
+---
+
+### **Card 9**
+**Front**: How to get the median of a DataFrame column?
+**Back**:
+`df['column_name'].median()`
+
+---
+
+### **Card 10**
+**Front**: What does data preprocessing typically involve?
+**Back**:
+Handling missing values, feature scaling, encoding categorical variables
diff --git a/ML/3_gradient_descent/Exercise/solution.ipynb b/ML/3_gradient_descent/Exercise/solution.ipynb
new file mode 100644
index 00000000..f546084b
--- /dev/null
+++ b/ML/3_gradient_descent/Exercise/solution.ipynb
@@ -0,0 +1,940 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "50084964",
+ "metadata": {},
+ "source": [
+ "## The Process of Gradient Descent\n",
+ "\n",
+ "1. Initialize the parameters (slope and intercept) with random values or zeros\n",
+ "2. Use the current parameters to make predictions\n",
+ "3. Compute the cost function (e.g., MSE)\n",
+ "4. Compute the partial derivatives of the cost with respect to the slope and intercept\n",
+ "5. Update the parameters using the learning rate and the gradients\n",
+ "6. Repeat steps 2–5 until the cost converges or a set number of iterations is reached"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "69df8424",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np #np also has an isclose function\n",
+ "from sklearn.linear_model import LinearRegression"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "15fab6d0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv(\"test_scores.csv\")\n",
+ "x = np.array(df.math) #arrays are efficient, series give errors in function defined below\n",
+ "y = np.array(df.cs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "45600db6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def gradient_desc(x, y):\n",
+ " m_current = 0\n",
+ " b_current = 0\n",
+ " learning_rate = 0.0002\n",
+ " iterations = 1000000\n",
+ " n = len(x)\n",
+ " mse_previous = 0\n",
+ "\n",
+ " for i in range(iterations):\n",
+ " y_predicted = m_current * x + b_current\n",
+ "\n",
+ " if i > 0:\n",
+ " mse_previous = mse\n",
+ " mse = (1/n) * np.sum([val**2 for val in (y-y_predicted)])\n",
+ " \n",
+ " if np.isclose(mse, mse_previous, rtol=1e-20):\n",
+ " return m_current, b_current\n",
+ "\n",
+ " md = -(2 / n) * np.sum(x * (y - y_predicted))\n",
+ " bd = -(2 / n) * np.sum(y - y_predicted)\n",
+ "\n",
+ " m_current = m_current - learning_rate * md\n",
+ " b_current = b_current - learning_rate * bd\n",
+ "\n",
+ " #math.isclose(mse,)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "dfa06b83",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1.0186053631193346 1.8536266598224878\n"
+ ]
+ }
+ ],
+ "source": [
+ "slope, coefficient = gradient_desc(x, y)\n",
+ "print(slope, coefficient)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "da5d1965",
+ "metadata": {},
+ "source": [
+ "*What we have just done is created a linear regression model in python, it successfully calculated the slope and the intercept. So the equation is:*\n",
+ "$ y = 1.0189653763997015x + 1.82811345313911 $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d1db445",
+ "metadata": {},
+ "source": [
+ "Checking by matching through scikit library"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "34765020",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept\n",
+ " fit_intercept: bool, default=True Whether to calculate the intercept for this model. If set to False, no intercept will be used in calculations (i.e. data is expected to be centered). \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " copy_X\n",
+ " copy_X: bool, default=True If True, X will be copied; else, it may be overwritten. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-6 The precision of the solution (`coef_`) is determined by `tol` which specifies a different convergence criterion for the `lsqr` solver. `tol` is set as `atol` and `btol` of :func:`scipy.sparse.linalg.lsqr` when fitting on sparse training data. This parameter has no effect when fitting on dense data. .. versionadded:: 1.7 \n",
+ " \n",
+ " \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None The number of jobs to use for the computation. This will only provide speedup in case of sufficiently large problems, that is if firstly `n_targets > 1` and secondly `X` is sparse or if `positive` is set to `True`. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` for more details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " positive\n",
+ " positive: bool, default=False When set to ``True``, forces the coefficients to be positive. This option is only supported for dense arrays. For a comparison between a linear regression model with positive constraints on the regression coefficients and a linear regression without such constraints, see :ref:`sphx_glr_auto_examples_linear_model_plot_nnls.py`. .. versionadded:: 0.24 \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = LinearRegression()\n",
+ "model.fit(df[[\"math\"]], y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "b06185f9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1.01773624] 1.9152193111568891\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(model.coef_, model.intercept_)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "291620d5",
+ "metadata": {},
+ "source": [
+ "They Matched 😎 "
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/3_gradient_descent/flashcards.md b/ML/3_gradient_descent/flashcards.md
new file mode 100644
index 00000000..7c09db4d
--- /dev/null
+++ b/ML/3_gradient_descent/flashcards.md
@@ -0,0 +1,88 @@
+### **Card 1**
+**Front**: What is the Mean Squared Error (MSE) formula?
+**Back**:
+`MSE = (1/n) * Σ(y_actual - y_predicted)²`
+Where n = number of samples
+
+---
+
+### **Card 2**
+**Front**: What is a cost function in machine learning?
+**Back**:
+A function that measures how wrong the model's predictions are.
+MSE is a common cost function for regression.
+
+---
+
+### **Card 3**
+**Front**: What is gradient descent?
+**Back**:
+An optimization algorithm that minimizes the cost function by iteratively adjusting parameters in the direction of steepest descent.
+
+---
+
+### **Card 4**
+**Front**: What is the learning rate (α) in gradient descent?
+**Back**:
+A hyperparameter that controls the step size during parameter updates.
+Too small = slow convergence, too large = may overshoot minimum.
+
+---
+
+### **Card 5**
+**Front**: What are the gradient descent update rules for linear regression?
+**Back**:
+`m_new = m - α * ∂J/∂m`
+`b_new = b - α * ∂J/∂b`
+Where J is the cost function
+
+---
+
+### **Card 6**
+**Front**: What do partial derivatives represent in gradient descent?
+**Back**:
+- `∂J/∂m` = rate of cost change with respect to slope
+- `∂J/∂b` = rate of cost change with respect to intercept
+
+---
+
+### **Card 7**
+**Front**: What are the partial derivative formulas for MSE cost function?
+**Back**:
+`∂J/∂m = (-2/n) * Σ x(y - (mx + b))`
+`∂J/∂b = (-2/n) * Σ (y - (mx + b))`
+
+---
+
+### **Card 8**
+**Front**: What happens if learning rate is too large?
+**Back**:
+Overshooting the minimum, causing divergence or oscillation around the optimal values.
+
+---
+
+### **Card 9**
+**Front**: What happens if learning rate is too small?
+**Back**:
+Very slow convergence, requiring many iterations to reach the minimum.
+
+---
+
+### **Card 10**
+**Front**: How do you know when gradient descent has converged?
+**Back**:
+When the cost function stops decreasing significantly between iterations.
+
+---
+
+### **Card 11**
+**Front**: What is the typical range for learning rate values?
+**Back**:
+Usually between 0.001 and 0.1, but depends on the specific problem and data scale.
+
+---
+
+### **Card 12**
+**Front**: Why do we square the errors in MSE?
+**Back**:
+To handle negative errors and penalize larger errors more heavily.
\ No newline at end of file
diff --git a/ML/3_gradient_descent/image-1.png b/ML/3_gradient_descent/image-1.png
new file mode 100644
index 00000000..ae2d09eb
Binary files /dev/null and b/ML/3_gradient_descent/image-1.png differ
diff --git a/ML/3_gradient_descent/image-2.png b/ML/3_gradient_descent/image-2.png
new file mode 100644
index 00000000..215ddede
Binary files /dev/null and b/ML/3_gradient_descent/image-2.png differ
diff --git a/ML/3_gradient_descent/image-3.png b/ML/3_gradient_descent/image-3.png
new file mode 100644
index 00000000..467bc89c
Binary files /dev/null and b/ML/3_gradient_descent/image-3.png differ
diff --git a/ML/3_gradient_descent/image-4.png b/ML/3_gradient_descent/image-4.png
new file mode 100644
index 00000000..85bc797c
Binary files /dev/null and b/ML/3_gradient_descent/image-4.png differ
diff --git a/ML/3_gradient_descent/image-5.png b/ML/3_gradient_descent/image-5.png
new file mode 100644
index 00000000..31d1119e
Binary files /dev/null and b/ML/3_gradient_descent/image-5.png differ
diff --git a/ML/3_gradient_descent/image.png b/ML/3_gradient_descent/image.png
new file mode 100644
index 00000000..7586a145
Binary files /dev/null and b/ML/3_gradient_descent/image.png differ
diff --git a/ML/4_save_model/4_save_and_load_model_using_pickle.ipynb b/ML/4_save_model/4_save_and_load_model_using_pickle.ipynb
index b1bcf5ac..cc8410d4 100644
--- a/ML/4_save_model/4_save_and_load_model_using_pickle.ipynb
+++ b/ML/4_save_model/4_save_and_load_model_using_pickle.ipynb
@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -20,7 +20,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -87,7 +87,7 @@
"4 4000 725000"
]
},
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@@ -99,17 +99,774 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept\n",
+ " fit_intercept: bool, default=True Whether to calculate the intercept for this model. If set to False, no intercept will be used in calculations (i.e. data is expected to be centered). \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " copy_X\n",
+ " copy_X: bool, default=True If True, X will be copied; else, it may be overwritten. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-6 The precision of the solution (`coef_`) is determined by `tol` which specifies a different convergence criterion for the `lsqr` solver. `tol` is set as `atol` and `btol` of :func:`scipy.sparse.linalg.lsqr` when fitting on sparse training data. This parameter has no effect when fitting on dense data. .. versionadded:: 1.7 \n",
+ " \n",
+ " \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None The number of jobs to use for the computation. This will only provide speedup in case of sufficiently large problems, that is if firstly `n_targets > 1` and secondly `X` is sparse or if `positive` is set to `True`. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` for more details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " positive\n",
+ " positive: bool, default=False When set to ``True``, forces the coefficients to be positive. This option is only supported for dense arrays. For a comparison between a linear regression model with positive constraints on the regression coefficients and a linear regression without such constraints, see :ref:`sphx_glr_auto_examples_linear_model_plot_nnls.py`. .. versionadded:: 0.24 \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
"text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n",
- " normalize=False)"
+ "LinearRegression()"
]
},
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -121,7 +878,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -130,7 +887,7 @@
"array([135.78767123])"
]
},
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -141,16 +898,16 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "180616.43835616432"
+ "np.float64(180616.43835616432)"
]
},
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -164,6 +921,14 @@
"execution_count": 7,
"metadata": {},
"outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\utils\\validation.py:2691: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
{
"data": {
"text/plain": [
@@ -201,8 +966,8 @@
"metadata": {},
"outputs": [],
"source": [
- "with open('model_pickle','wb') as file:\n",
- " pickle.dump(model,file)"
+ "with open(\"model_pickle\", \"wb\") as f:\n",
+ " pickle.dump(model, f)"
]
},
{
@@ -218,8 +983,8 @@
"metadata": {},
"outputs": [],
"source": [
- "with open('model_pickle','rb') as file:\n",
- " mp = pickle.load(file)"
+ "with open(\"model_pickle\", \"rb\") as f:\n",
+ " mp = pickle.load(f)"
]
},
{
@@ -252,7 +1017,7 @@
{
"data": {
"text/plain": [
- "180616.43835616432"
+ "np.float64(180616.43835616432)"
]
},
"execution_count": 12,
@@ -269,6 +1034,14 @@
"execution_count": 13,
"metadata": {},
"outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\utils\\validation.py:2691: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
{
"data": {
"text/plain": [
@@ -293,16 +1066,16 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
- "from sklearn.externals import joblib"
+ "import joblib"
]
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 17,
"metadata": {},
"outputs": [
{
@@ -311,13 +1084,13 @@
"['model_joblib']"
]
},
- "execution_count": 15,
+ "execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "joblib.dump(model, 'model_joblib')"
+ "joblib.dump(model, \"model_joblib\")"
]
},
{
@@ -329,16 +1102,16 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
- "mj = joblib.load('model_joblib')"
+ "mj = joblib.load(\"model_joblib\")"
]
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 19,
"metadata": {},
"outputs": [
{
@@ -347,7 +1120,7 @@
"array([135.78767123])"
]
},
- "execution_count": 17,
+ "execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
@@ -358,7 +1131,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 20,
"metadata": {
"scrolled": true
},
@@ -366,10 +1139,10 @@
{
"data": {
"text/plain": [
- "180616.43835616432"
+ "np.float64(180616.43835616432)"
]
},
- "execution_count": 18,
+ "execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
@@ -380,16 +1153,24 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": 21,
"metadata": {},
"outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\utils\\validation.py:2691: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
{
"data": {
"text/plain": [
"array([859554.79452055])"
]
},
- "execution_count": 19,
+ "execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
@@ -415,7 +1196,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.3"
+ "version": "3.14.2"
}
},
"nbformat": 4,
diff --git a/ML/4_save_model/model_joblib b/ML/4_save_model/model_joblib
index 7f359b25..f5fc707d 100644
Binary files a/ML/4_save_model/model_joblib and b/ML/4_save_model/model_joblib differ
diff --git a/ML/4_save_model/model_pickle b/ML/4_save_model/model_pickle
index a46585e2..9d98c79e 100644
Binary files a/ML/4_save_model/model_pickle and b/ML/4_save_model/model_pickle differ
diff --git a/ML/5_one_hot_encoding/Exercise/exercise_one_hot_encoding.ipynb b/ML/5_one_hot_encoding/Exercise/exercise_one_hot_encoding.ipynb
deleted file mode 100644
index 53a78aab..00000000
--- a/ML/5_one_hot_encoding/Exercise/exercise_one_hot_encoding.ipynb
+++ /dev/null
@@ -1,1000 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Car Model \n",
- " Mileage \n",
- " Sell Price($) \n",
- " Age(yrs) \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " BMW X5 \n",
- " 69000 \n",
- " 18000 \n",
- " 6 \n",
- " \n",
- " \n",
- " 1 \n",
- " BMW X5 \n",
- " 35000 \n",
- " 34000 \n",
- " 3 \n",
- " \n",
- " \n",
- " 2 \n",
- " BMW X5 \n",
- " 57000 \n",
- " 26100 \n",
- " 5 \n",
- " \n",
- " \n",
- " 3 \n",
- " BMW X5 \n",
- " 22500 \n",
- " 40000 \n",
- " 2 \n",
- " \n",
- " \n",
- " 4 \n",
- " BMW X5 \n",
- " 46000 \n",
- " 31500 \n",
- " 4 \n",
- " \n",
- " \n",
- " 5 \n",
- " Audi A5 \n",
- " 59000 \n",
- " 29400 \n",
- " 5 \n",
- " \n",
- " \n",
- " 6 \n",
- " Audi A5 \n",
- " 52000 \n",
- " 32000 \n",
- " 5 \n",
- " \n",
- " \n",
- " 7 \n",
- " Audi A5 \n",
- " 72000 \n",
- " 19300 \n",
- " 6 \n",
- " \n",
- " \n",
- " 8 \n",
- " Audi A5 \n",
- " 91000 \n",
- " 12000 \n",
- " 8 \n",
- " \n",
- " \n",
- " 9 \n",
- " Mercedez Benz C class \n",
- " 67000 \n",
- " 22000 \n",
- " 6 \n",
- " \n",
- " \n",
- " 10 \n",
- " Mercedez Benz C class \n",
- " 83000 \n",
- " 20000 \n",
- " 7 \n",
- " \n",
- " \n",
- " 11 \n",
- " Mercedez Benz C class \n",
- " 79000 \n",
- " 21000 \n",
- " 7 \n",
- " \n",
- " \n",
- " 12 \n",
- " Mercedez Benz C class \n",
- " 59000 \n",
- " 33000 \n",
- " 5 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Car Model Mileage Sell Price($) Age(yrs)\n",
- "0 BMW X5 69000 18000 6\n",
- "1 BMW X5 35000 34000 3\n",
- "2 BMW X5 57000 26100 5\n",
- "3 BMW X5 22500 40000 2\n",
- "4 BMW X5 46000 31500 4\n",
- "5 Audi A5 59000 29400 5\n",
- "6 Audi A5 52000 32000 5\n",
- "7 Audi A5 72000 19300 6\n",
- "8 Audi A5 91000 12000 8\n",
- "9 Mercedez Benz C class 67000 22000 6\n",
- "10 Mercedez Benz C class 83000 20000 7\n",
- "11 Mercedez Benz C class 79000 21000 7\n",
- "12 Mercedez Benz C class 59000 33000 5"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import pandas as pd\n",
- "df = pd.read_csv(\"carprices.csv\")\n",
- "df"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Audi A5 \n",
- " BMW X5 \n",
- " Mercedez Benz C class \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 2 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 3 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 4 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 6 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 7 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 8 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 9 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 10 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 11 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 12 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Audi A5 BMW X5 Mercedez Benz C class\n",
- "0 0 1 0\n",
- "1 0 1 0\n",
- "2 0 1 0\n",
- "3 0 1 0\n",
- "4 0 1 0\n",
- "5 1 0 0\n",
- "6 1 0 0\n",
- "7 1 0 0\n",
- "8 1 0 0\n",
- "9 0 0 1\n",
- "10 0 0 1\n",
- "11 0 0 1\n",
- "12 0 0 1"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "dummies = pd.get_dummies(df['Car Model'])\n",
- "dummies"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Car Model \n",
- " Mileage \n",
- " Sell Price($) \n",
- " Age(yrs) \n",
- " Audi A5 \n",
- " BMW X5 \n",
- " Mercedez Benz C class \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " BMW X5 \n",
- " 69000 \n",
- " 18000 \n",
- " 6 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 1 \n",
- " BMW X5 \n",
- " 35000 \n",
- " 34000 \n",
- " 3 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 2 \n",
- " BMW X5 \n",
- " 57000 \n",
- " 26100 \n",
- " 5 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 3 \n",
- " BMW X5 \n",
- " 22500 \n",
- " 40000 \n",
- " 2 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 4 \n",
- " BMW X5 \n",
- " 46000 \n",
- " 31500 \n",
- " 4 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 5 \n",
- " Audi A5 \n",
- " 59000 \n",
- " 29400 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 6 \n",
- " Audi A5 \n",
- " 52000 \n",
- " 32000 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 7 \n",
- " Audi A5 \n",
- " 72000 \n",
- " 19300 \n",
- " 6 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 8 \n",
- " Audi A5 \n",
- " 91000 \n",
- " 12000 \n",
- " 8 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 9 \n",
- " Mercedez Benz C class \n",
- " 67000 \n",
- " 22000 \n",
- " 6 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 10 \n",
- " Mercedez Benz C class \n",
- " 83000 \n",
- " 20000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 11 \n",
- " Mercedez Benz C class \n",
- " 79000 \n",
- " 21000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 12 \n",
- " Mercedez Benz C class \n",
- " 59000 \n",
- " 33000 \n",
- " 5 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Car Model Mileage Sell Price($) Age(yrs) Audi A5 BMW X5 \\\n",
- "0 BMW X5 69000 18000 6 0 1 \n",
- "1 BMW X5 35000 34000 3 0 1 \n",
- "2 BMW X5 57000 26100 5 0 1 \n",
- "3 BMW X5 22500 40000 2 0 1 \n",
- "4 BMW X5 46000 31500 4 0 1 \n",
- "5 Audi A5 59000 29400 5 1 0 \n",
- "6 Audi A5 52000 32000 5 1 0 \n",
- "7 Audi A5 72000 19300 6 1 0 \n",
- "8 Audi A5 91000 12000 8 1 0 \n",
- "9 Mercedez Benz C class 67000 22000 6 0 0 \n",
- "10 Mercedez Benz C class 83000 20000 7 0 0 \n",
- "11 Mercedez Benz C class 79000 21000 7 0 0 \n",
- "12 Mercedez Benz C class 59000 33000 5 0 0 \n",
- "\n",
- " Mercedez Benz C class \n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "5 0 \n",
- "6 0 \n",
- "7 0 \n",
- "8 0 \n",
- "9 1 \n",
- "10 1 \n",
- "11 1 \n",
- "12 1 "
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "merged = pd.concat([df,dummies],axis='columns')\n",
- "merged"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Mileage \n",
- " Sell Price($) \n",
- " Age(yrs) \n",
- " Audi A5 \n",
- " BMW X5 \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 69000 \n",
- " 18000 \n",
- " 6 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 1 \n",
- " 35000 \n",
- " 34000 \n",
- " 3 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 2 \n",
- " 57000 \n",
- " 26100 \n",
- " 5 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 3 \n",
- " 22500 \n",
- " 40000 \n",
- " 2 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 4 \n",
- " 46000 \n",
- " 31500 \n",
- " 4 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 5 \n",
- " 59000 \n",
- " 29400 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 6 \n",
- " 52000 \n",
- " 32000 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 7 \n",
- " 72000 \n",
- " 19300 \n",
- " 6 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 8 \n",
- " 91000 \n",
- " 12000 \n",
- " 8 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 9 \n",
- " 67000 \n",
- " 22000 \n",
- " 6 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 10 \n",
- " 83000 \n",
- " 20000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 11 \n",
- " 79000 \n",
- " 21000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 12 \n",
- " 59000 \n",
- " 33000 \n",
- " 5 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Mileage Sell Price($) Age(yrs) Audi A5 BMW X5\n",
- "0 69000 18000 6 0 1\n",
- "1 35000 34000 3 0 1\n",
- "2 57000 26100 5 0 1\n",
- "3 22500 40000 2 0 1\n",
- "4 46000 31500 4 0 1\n",
- "5 59000 29400 5 1 0\n",
- "6 52000 32000 5 1 0\n",
- "7 72000 19300 6 1 0\n",
- "8 91000 12000 8 1 0\n",
- "9 67000 22000 6 0 0\n",
- "10 83000 20000 7 0 0\n",
- "11 79000 21000 7 0 0\n",
- "12 59000 33000 5 0 0"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "final = merged.drop([\"Car Model\",\"Mercedez Benz C class\"],axis='columns')\n",
- "final"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Mileage \n",
- " Age(yrs) \n",
- " Audi A5 \n",
- " BMW X5 \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 69000 \n",
- " 6 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 1 \n",
- " 35000 \n",
- " 3 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 2 \n",
- " 57000 \n",
- " 5 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 3 \n",
- " 22500 \n",
- " 2 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 4 \n",
- " 46000 \n",
- " 4 \n",
- " 0 \n",
- " 1 \n",
- " \n",
- " \n",
- " 5 \n",
- " 59000 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 6 \n",
- " 52000 \n",
- " 5 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 7 \n",
- " 72000 \n",
- " 6 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 8 \n",
- " 91000 \n",
- " 8 \n",
- " 1 \n",
- " 0 \n",
- " \n",
- " \n",
- " 9 \n",
- " 67000 \n",
- " 6 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 10 \n",
- " 83000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 11 \n",
- " 79000 \n",
- " 7 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- " 12 \n",
- " 59000 \n",
- " 5 \n",
- " 0 \n",
- " 0 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Mileage Age(yrs) Audi A5 BMW X5\n",
- "0 69000 6 0 1\n",
- "1 35000 3 0 1\n",
- "2 57000 5 0 1\n",
- "3 22500 2 0 1\n",
- "4 46000 4 0 1\n",
- "5 59000 5 1 0\n",
- "6 52000 5 1 0\n",
- "7 72000 6 1 0\n",
- "8 91000 8 1 0\n",
- "9 67000 6 0 0\n",
- "10 83000 7 0 0\n",
- "11 79000 7 0 0\n",
- "12 59000 5 0 0"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X = final.drop('Sell Price($)',axis='columns')\n",
- "X"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0 18000\n",
- "1 34000\n",
- "2 26100\n",
- "3 40000\n",
- "4 31500\n",
- "5 29400\n",
- "6 32000\n",
- "7 19300\n",
- "8 12000\n",
- "9 22000\n",
- "10 20000\n",
- "11 21000\n",
- "12 33000\n",
- "Name: Sell Price($), dtype: int64"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y = final['Sell Price($)']\n",
- "y"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.linear_model import LinearRegression\n",
- "model = LinearRegression()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.fit(X,y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.94170509372810818"
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.score(X,y)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Price of mercedez benz that is 4 yr old with mileage 45000**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 36991.31721061])"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.predict([[45000,4,0,0]])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Price of BMW X5 that is 7 yr old with mileage 86000**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 11080.74313219])"
- ]
- },
- "execution_count": 17,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.predict([[86000,7,0,1]])"
- ]
- }
- ],
- "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.6.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/ML/5_one_hot_encoding/Exercise/solution.ipynb b/ML/5_one_hot_encoding/Exercise/solution.ipynb
new file mode 100644
index 00000000..1fdc3687
--- /dev/null
+++ b/ML/5_one_hot_encoding/Exercise/solution.ipynb
@@ -0,0 +1,2709 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "090478b0",
+ "metadata": {},
+ "source": [
+ "## Using the get_dummies method"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "74161224",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "from sklearn.preprocessing import OneHotEncoder\n",
+ "from sklearn.preprocessing import LabelEncoder\n",
+ "from sklearn.compose import ColumnTransformer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "de8f1462",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Car Model \n",
+ " Mileage \n",
+ " Sell Price($) \n",
+ " Age(yrs) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " BMW X5 \n",
+ " 69000 \n",
+ " 18000 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " BMW X5 \n",
+ " 35000 \n",
+ " 34000 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " BMW X5 \n",
+ " 57000 \n",
+ " 26100 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " BMW X5 \n",
+ " 22500 \n",
+ " 40000 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " BMW X5 \n",
+ " 46000 \n",
+ " 31500 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Audi A5 \n",
+ " 59000 \n",
+ " 29400 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Audi A5 \n",
+ " 52000 \n",
+ " 32000 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Audi A5 \n",
+ " 72000 \n",
+ " 19300 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Audi A5 \n",
+ " 91000 \n",
+ " 12000 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " Mercedez Benz C class \n",
+ " 67000 \n",
+ " 22000 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Mercedez Benz C class \n",
+ " 83000 \n",
+ " 20000 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Mercedez Benz C class \n",
+ " 79000 \n",
+ " 21000 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " Mercedez Benz C class \n",
+ " 59000 \n",
+ " 33000 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Car Model Mileage Sell Price($) Age(yrs)\n",
+ "0 BMW X5 69000 18000 6\n",
+ "1 BMW X5 35000 34000 3\n",
+ "2 BMW X5 57000 26100 5\n",
+ "3 BMW X5 22500 40000 2\n",
+ "4 BMW X5 46000 31500 4\n",
+ "5 Audi A5 59000 29400 5\n",
+ "6 Audi A5 52000 32000 5\n",
+ "7 Audi A5 72000 19300 6\n",
+ "8 Audi A5 91000 12000 8\n",
+ "9 Mercedez Benz C class 67000 22000 6\n",
+ "10 Mercedez Benz C class 83000 20000 7\n",
+ "11 Mercedez Benz C class 79000 21000 7\n",
+ "12 Mercedez Benz C class 59000 33000 5"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(\"carprices.csv\")\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "dad124e4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Audi A5 \n",
+ " BMW X5 \n",
+ " Mercedez Benz C class \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Audi A5 BMW X5 Mercedez Benz C class\n",
+ "0 False True False\n",
+ "1 False True False\n",
+ "2 False True False\n",
+ "3 False True False\n",
+ "4 False True False\n",
+ "5 True False False\n",
+ "6 True False False\n",
+ "7 True False False\n",
+ "8 True False False\n",
+ "9 False False True\n",
+ "10 False False True\n",
+ "11 False False True\n",
+ "12 False False True"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dummies = pd.get_dummies(df[\"Car Model\"])\n",
+ "dummies"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "eeadb9dd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Car Model \n",
+ " Mileage \n",
+ " Sell Price($) \n",
+ " Age(yrs) \n",
+ " Audi A5 \n",
+ " BMW X5 \n",
+ " Mercedez Benz C class \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " BMW X5 \n",
+ " 69000 \n",
+ " 18000 \n",
+ " 6 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " BMW X5 \n",
+ " 35000 \n",
+ " 34000 \n",
+ " 3 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " BMW X5 \n",
+ " 57000 \n",
+ " 26100 \n",
+ " 5 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " BMW X5 \n",
+ " 22500 \n",
+ " 40000 \n",
+ " 2 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " BMW X5 \n",
+ " 46000 \n",
+ " 31500 \n",
+ " 4 \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Audi A5 \n",
+ " 59000 \n",
+ " 29400 \n",
+ " 5 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Audi A5 \n",
+ " 52000 \n",
+ " 32000 \n",
+ " 5 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Audi A5 \n",
+ " 72000 \n",
+ " 19300 \n",
+ " 6 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Audi A5 \n",
+ " 91000 \n",
+ " 12000 \n",
+ " 8 \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " Mercedez Benz C class \n",
+ " 67000 \n",
+ " 22000 \n",
+ " 6 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Mercedez Benz C class \n",
+ " 83000 \n",
+ " 20000 \n",
+ " 7 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Mercedez Benz C class \n",
+ " 79000 \n",
+ " 21000 \n",
+ " 7 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " Mercedez Benz C class \n",
+ " 59000 \n",
+ " 33000 \n",
+ " 5 \n",
+ " False \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Car Model Mileage Sell Price($) Age(yrs) Audi A5 BMW X5 \\\n",
+ "0 BMW X5 69000 18000 6 False True \n",
+ "1 BMW X5 35000 34000 3 False True \n",
+ "2 BMW X5 57000 26100 5 False True \n",
+ "3 BMW X5 22500 40000 2 False True \n",
+ "4 BMW X5 46000 31500 4 False True \n",
+ "5 Audi A5 59000 29400 5 True False \n",
+ "6 Audi A5 52000 32000 5 True False \n",
+ "7 Audi A5 72000 19300 6 True False \n",
+ "8 Audi A5 91000 12000 8 True False \n",
+ "9 Mercedez Benz C class 67000 22000 6 False False \n",
+ "10 Mercedez Benz C class 83000 20000 7 False False \n",
+ "11 Mercedez Benz C class 79000 21000 7 False False \n",
+ "12 Mercedez Benz C class 59000 33000 5 False False \n",
+ "\n",
+ " Mercedez Benz C class \n",
+ "0 False \n",
+ "1 False \n",
+ "2 False \n",
+ "3 False \n",
+ "4 False \n",
+ "5 False \n",
+ "6 False \n",
+ "7 False \n",
+ "8 False \n",
+ "9 True \n",
+ "10 True \n",
+ "11 True \n",
+ "12 True "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "merged = pd.concat([df, dummies], axis=\"columns\")\n",
+ "merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "d534beb3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Mileage \n",
+ " Sell Price($) \n",
+ " Age(yrs) \n",
+ " BMW X5 \n",
+ " Mercedez Benz C class \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 69000 \n",
+ " 18000 \n",
+ " 6 \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 35000 \n",
+ " 34000 \n",
+ " 3 \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 57000 \n",
+ " 26100 \n",
+ " 5 \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 22500 \n",
+ " 40000 \n",
+ " 2 \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 46000 \n",
+ " 31500 \n",
+ " 4 \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 59000 \n",
+ " 29400 \n",
+ " 5 \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 52000 \n",
+ " 32000 \n",
+ " 5 \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 72000 \n",
+ " 19300 \n",
+ " 6 \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 91000 \n",
+ " 12000 \n",
+ " 8 \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 67000 \n",
+ " 22000 \n",
+ " 6 \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 83000 \n",
+ " 20000 \n",
+ " 7 \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 79000 \n",
+ " 21000 \n",
+ " 7 \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 59000 \n",
+ " 33000 \n",
+ " 5 \n",
+ " False \n",
+ " True \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Mileage Sell Price($) Age(yrs) BMW X5 Mercedez Benz C class\n",
+ "0 69000 18000 6 True False\n",
+ "1 35000 34000 3 True False\n",
+ "2 57000 26100 5 True False\n",
+ "3 22500 40000 2 True False\n",
+ "4 46000 31500 4 True False\n",
+ "5 59000 29400 5 False False\n",
+ "6 52000 32000 5 False False\n",
+ "7 72000 19300 6 False False\n",
+ "8 91000 12000 8 False False\n",
+ "9 67000 22000 6 False True\n",
+ "10 83000 20000 7 False True\n",
+ "11 79000 21000 7 False True\n",
+ "12 59000 33000 5 False True"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final = merged.drop([\"Car Model\", \"Audi A5\"], axis = \"columns\")\n",
+ "final"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "7edda3d2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept\n",
+ " fit_intercept: bool, default=True Whether to calculate the intercept for this model. If set to False, no intercept will be used in calculations (i.e. data is expected to be centered). \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " copy_X\n",
+ " copy_X: bool, default=True If True, X will be copied; else, it may be overwritten. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-6 The precision of the solution (`coef_`) is determined by `tol` which specifies a different convergence criterion for the `lsqr` solver. `tol` is set as `atol` and `btol` of :func:`scipy.sparse.linalg.lsqr` when fitting on sparse training data. This parameter has no effect when fitting on dense data. .. versionadded:: 1.7 \n",
+ " \n",
+ " \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None The number of jobs to use for the computation. This will only provide speedup in case of sufficiently large problems, that is if firstly `n_targets > 1` and secondly `X` is sparse or if `positive` is set to `True`. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` for more details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " positive\n",
+ " positive: bool, default=False When set to ``True``, forces the coefficients to be positive. This option is only supported for dense arrays. For a comparison between a linear regression model with positive constraints on the regression coefficients and a linear regression without such constraints, see :ref:`sphx_glr_auto_examples_linear_model_plot_nnls.py`. .. versionadded:: 0.24 \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = final.drop([\"Sell Price($)\"], axis=\"columns\")\n",
+ "y = final[\"Sell Price($)\"]\n",
+ "\n",
+ "model = LinearRegression()\n",
+ "model.fit(x, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "2ed408a8",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\utils\\validation.py:2691: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([36991.31721061])"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.predict([[45000, 4, 0, 1]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "bb3aa9fa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "c:\\Users\\HC\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\sklearn\\utils\\validation.py:2691: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([11080.74313219])"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.predict([[86000,7,1,0]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "4247e464",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9417050937281082"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.score(x,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94d96c39",
+ "metadata": {},
+ "source": [
+ "## Using the One Hot Encoder"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "3fb4ea2f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Car Model \n",
+ " Mileage \n",
+ " Sell Price($) \n",
+ " Age(yrs) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " BMW X5 \n",
+ " 69000 \n",
+ " 18000 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " BMW X5 \n",
+ " 35000 \n",
+ " 34000 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " BMW X5 \n",
+ " 57000 \n",
+ " 26100 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " BMW X5 \n",
+ " 22500 \n",
+ " 40000 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " BMW X5 \n",
+ " 46000 \n",
+ " 31500 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Audi A5 \n",
+ " 59000 \n",
+ " 29400 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Audi A5 \n",
+ " 52000 \n",
+ " 32000 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Audi A5 \n",
+ " 72000 \n",
+ " 19300 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Audi A5 \n",
+ " 91000 \n",
+ " 12000 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " Mercedez Benz C class \n",
+ " 67000 \n",
+ " 22000 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Mercedez Benz C class \n",
+ " 83000 \n",
+ " 20000 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Mercedez Benz C class \n",
+ " 79000 \n",
+ " 21000 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " Mercedez Benz C class \n",
+ " 59000 \n",
+ " 33000 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Car Model Mileage Sell Price($) Age(yrs)\n",
+ "0 BMW X5 69000 18000 6\n",
+ "1 BMW X5 35000 34000 3\n",
+ "2 BMW X5 57000 26100 5\n",
+ "3 BMW X5 22500 40000 2\n",
+ "4 BMW X5 46000 31500 4\n",
+ "5 Audi A5 59000 29400 5\n",
+ "6 Audi A5 52000 32000 5\n",
+ "7 Audi A5 72000 19300 6\n",
+ "8 Audi A5 91000 12000 8\n",
+ "9 Mercedez Benz C class 67000 22000 6\n",
+ "10 Mercedez Benz C class 83000 20000 7\n",
+ "11 Mercedez Benz C class 79000 21000 7\n",
+ "12 Mercedez Benz C class 59000 33000 5"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "ef406607",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1.00e+00, 0.00e+00, 6.90e+04, 1.80e+04, 6.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 3.50e+04, 3.40e+04, 3.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 5.70e+04, 2.61e+04, 5.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 2.25e+04, 4.00e+04, 2.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 4.60e+04, 3.15e+04, 4.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 5.90e+04, 2.94e+04, 5.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 5.20e+04, 3.20e+04, 5.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 7.20e+04, 1.93e+04, 6.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 9.10e+04, 1.20e+04, 8.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 6.70e+04, 2.20e+04, 6.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 8.30e+04, 2.00e+04, 7.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 7.90e+04, 2.10e+04, 7.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 5.90e+04, 3.30e+04, 5.00e+00]])"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ct = ColumnTransformer([(\"Model\", OneHotEncoder(drop=\"first\"), [0])], remainder=\"passthrough\")\n",
+ "x = ct.fit_transform(df)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "00912847",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1.00e+00, 0.00e+00, 6.90e+04, 6.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 3.50e+04, 3.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 5.70e+04, 5.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 2.25e+04, 2.00e+00],\n",
+ " [1.00e+00, 0.00e+00, 4.60e+04, 4.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 5.90e+04, 5.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 5.20e+04, 5.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 7.20e+04, 6.00e+00],\n",
+ " [0.00e+00, 0.00e+00, 9.10e+04, 8.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 6.70e+04, 6.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 8.30e+04, 7.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 7.90e+04, 7.00e+00],\n",
+ " [0.00e+00, 1.00e+00, 5.90e+04, 5.00e+00]])"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = x[:, [0, 1, 2, 4]]\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "801d0d49",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 18000\n",
+ "1 34000\n",
+ "2 26100\n",
+ "3 40000\n",
+ "4 31500\n",
+ "5 29400\n",
+ "6 32000\n",
+ "7 19300\n",
+ "8 12000\n",
+ "9 22000\n",
+ "10 20000\n",
+ "11 21000\n",
+ "12 33000\n",
+ "Name: Sell Price($), dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = df[\"Sell Price($)\"]\n",
+ "y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "6977136d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LinearRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept\n",
+ " fit_intercept: bool, default=True Whether to calculate the intercept for this model. If set to False, no intercept will be used in calculations (i.e. data is expected to be centered). \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " copy_X\n",
+ " copy_X: bool, default=True If True, X will be copied; else, it may be overwritten. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-6 The precision of the solution (`coef_`) is determined by `tol` which specifies a different convergence criterion for the `lsqr` solver. `tol` is set as `atol` and `btol` of :func:`scipy.sparse.linalg.lsqr` when fitting on sparse training data. This parameter has no effect when fitting on dense data. .. versionadded:: 1.7 \n",
+ " \n",
+ " \n",
+ " 1e-06 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None The number of jobs to use for the computation. This will only provide speedup in case of sufficiently large problems, that is if firstly `n_targets > 1` and secondly `X` is sparse or if `positive` is set to `True`. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` for more details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " positive\n",
+ " positive: bool, default=False When set to ``True``, forces the coefficients to be positive. This option is only supported for dense arrays. For a comparison between a linear regression model with positive constraints on the regression coefficients and a linear regression without such constraints, see :ref:`sphx_glr_auto_examples_linear_model_plot_nnls.py`. .. versionadded:: 0.24 \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modelohe = LinearRegression()\n",
+ "modelohe.fit(x,y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "8c0389b9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([51981.26203335])"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modelohe.predict([[0,1,4500,4]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "594e81ba",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([11080.74313219])"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modelohe.predict([[1,0,86000,7]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "d67ff510",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9417050937281082"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "modelohe.score(x,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07bbf366",
+ "metadata": {},
+ "source": [
+ "Answers Matched😎 "
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/8_logistic_reg_multiclass/Exercise/Solution.ipynb b/ML/8_logistic_reg_multiclass/Exercise/Solution.ipynb
new file mode 100644
index 00000000..a109a67d
--- /dev/null
+++ b/ML/8_logistic_reg_multiclass/Exercise/Solution.ipynb
@@ -0,0 +1,1270 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "0c112487",
+ "metadata": {},
+ "source": [
+ "### Imports and dataload"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "31beb396",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import seaborn as sns\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.datasets import load_iris\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.metrics import confusion_matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "b5650cef",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "iris = load_iris()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4436209e",
+ "metadata": {},
+ "source": [
+ "### Exploring the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "9545fd69",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['DESCR',\n",
+ " 'data',\n",
+ " 'data_module',\n",
+ " 'feature_names',\n",
+ " 'filename',\n",
+ " 'frame',\n",
+ " 'target',\n",
+ " 'target_names']"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dir(iris)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "c69ae022",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([5.1, 3.5, 1.4, 0.2])"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.data[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "31b4e2b8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['sepal length (cm)',\n",
+ " 'sepal width (cm)',\n",
+ " 'petal length (cm)',\n",
+ " 'petal width (cm)']"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.feature_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "7cacc24b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'iris.csv'"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.filename"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7d5f3f3",
+ "metadata": {},
+ "source": [
+ "iris.filename is of no use"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "1c8b6725",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
+ " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.target"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "c89ad2b4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['setosa', 'versicolor', 'virginica'], dtype='#sk-container-id-2 {\n",
+ " /* Definition of color scheme common for light and dark mode */\n",
+ " --sklearn-color-text: #000;\n",
+ " --sklearn-color-text-muted: #666;\n",
+ " --sklearn-color-line: gray;\n",
+ " /* Definition of color scheme for unfitted estimators */\n",
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
+ " /* Definition of color scheme for fitted estimators */\n",
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2.light {\n",
+ " /* Specific color for light theme */\n",
+ " --sklearn-color-text-on-default-background: black;\n",
+ " --sklearn-color-background: white;\n",
+ " --sklearn-color-border-box: black;\n",
+ " --sklearn-color-icon: #696969;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2.dark {\n",
+ " --sklearn-color-text-on-default-background: white;\n",
+ " --sklearn-color-background: #111;\n",
+ " --sklearn-color-border-box: white;\n",
+ " --sklearn-color-icon: #878787;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 pre {\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-hidden--visually {\n",
+ " border: 0;\n",
+ " clip: rect(1px 1px 1px 1px);\n",
+ " clip: rect(1px, 1px, 1px, 1px);\n",
+ " height: 1px;\n",
+ " margin: -1px;\n",
+ " overflow: hidden;\n",
+ " padding: 0;\n",
+ " position: absolute;\n",
+ " width: 1px;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-dashed-wrapped {\n",
+ " border: 1px dashed var(--sklearn-color-line);\n",
+ " margin: 0 0.4em 0.5em 0.4em;\n",
+ " box-sizing: border-box;\n",
+ " padding-bottom: 0.4em;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-container {\n",
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
+ " so we also need the `!important` here to be able to override the\n",
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
+ " display: inline-block !important;\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-text-repr-fallback {\n",
+ " display: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-parallel-item,\n",
+ "div.sk-serial,\n",
+ "div.sk-item {\n",
+ " /* draw centered vertical line to link estimators */\n",
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
+ " background-size: 2px 100%;\n",
+ " background-repeat: no-repeat;\n",
+ " background-position: center center;\n",
+ "}\n",
+ "\n",
+ "/* Parallel-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item::after {\n",
+ " content: \"\";\n",
+ " width: 100%;\n",
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
+ " flex-grow: 1;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel {\n",
+ " display: flex;\n",
+ " align-items: stretch;\n",
+ " justify-content: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
+ " align-self: flex-end;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
+ " align-self: flex-start;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
+ " width: 0;\n",
+ "}\n",
+ "\n",
+ "/* Serial-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-serial {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ " align-items: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " padding-right: 1em;\n",
+ " padding-left: 1em;\n",
+ "}\n",
+ "\n",
+ "\n",
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
+ "clickable and can be expanded/collapsed.\n",
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
+ "*/\n",
+ "\n",
+ "/* Pipeline and ColumnTransformer style (default) */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable {\n",
+ " /* Default theme specific background. It is overwritten whether we have a\n",
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable label */\n",
+ "#sk-container-id-2 label.sk-toggleable__label {\n",
+ " cursor: pointer;\n",
+ " display: flex;\n",
+ " width: 100%;\n",
+ " margin-bottom: 0;\n",
+ " padding: 0.5em;\n",
+ " box-sizing: border-box;\n",
+ " text-align: center;\n",
+ " align-items: center;\n",
+ " justify-content: center;\n",
+ " gap: 0.5em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 label.sk-toggleable__label .caption {\n",
+ " font-size: 0.6rem;\n",
+ " font-weight: lighter;\n",
+ " color: var(--sklearn-color-text-muted);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
+ " /* Arrow on the left of the label */\n",
+ " content: \"▸\";\n",
+ " float: left;\n",
+ " margin-right: 0.25em;\n",
+ " color: var(--sklearn-color-icon);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable content - dropdown */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content {\n",
+ " display: none;\n",
+ " text-align: left;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content pre {\n",
+ " margin: 0.2em;\n",
+ " border-radius: 0.25em;\n",
+ " color: var(--sklearn-color-text);\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
+ " /* Expand drop-down */\n",
+ " display: block;\n",
+ " width: 100%;\n",
+ " overflow: visible;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
+ " content: \"▾\";\n",
+ "}\n",
+ "\n",
+ "/* Pipeline/ColumnTransformer-specific style */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific style */\n",
+ "\n",
+ "/* Colorize estimator box */\n",
+ "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
+ "#sk-container-id-2 div.sk-label label {\n",
+ " /* The background is the default theme color */\n",
+ " color: var(--sklearn-color-text-on-default-background);\n",
+ "}\n",
+ "\n",
+ "/* On hover, darken the color of the background */\n",
+ "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Label box, darken color on hover, fitted */\n",
+ "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator label */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label label {\n",
+ " font-family: monospace;\n",
+ " font-weight: bold;\n",
+ " line-height: 1.2em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label-container {\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific */\n",
+ "#sk-container-id-2 div.sk-estimator {\n",
+ " font-family: monospace;\n",
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
+ " border-radius: 0.25em;\n",
+ " box-sizing: border-box;\n",
+ " margin-bottom: 0.5em;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "/* on hover */\n",
+ "#sk-container-id-2 div.sk-estimator:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
+ "\n",
+ "/* Common style for \"i\" and \"?\" */\n",
+ "\n",
+ ".sk-estimator-doc-link,\n",
+ "a:link.sk-estimator-doc-link,\n",
+ "a:visited.sk-estimator-doc-link {\n",
+ " float: right;\n",
+ " font-size: smaller;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ " border-radius: 1em;\n",
+ " height: 1em;\n",
+ " width: 1em;\n",
+ " text-decoration: none !important;\n",
+ " margin-left: 0.5em;\n",
+ " text-align: center;\n",
+ " /* unfitted */\n",
+ " border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
+ " color: var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted,\n",
+ "a:link.sk-estimator-doc-link.fitted,\n",
+ "a:visited.sk-estimator-doc-link.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
+ " color: var(--sklearn-color-unfitted-level-0);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ " border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-0);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "/* Span, style for the box shown on hovering the info icon */\n",
+ ".sk-estimator-doc-link span {\n",
+ " display: none;\n",
+ " z-index: 9999;\n",
+ " position: relative;\n",
+ " font-weight: normal;\n",
+ " right: .2ex;\n",
+ " padding: .5ex;\n",
+ " margin: .5ex;\n",
+ " width: min-content;\n",
+ " min-width: 20ex;\n",
+ " max-width: 50ex;\n",
+ " color: var(--sklearn-color-text);\n",
+ " box-shadow: 2pt 2pt 4pt #999;\n",
+ " /* unfitted */\n",
+ " background: var(--sklearn-color-unfitted-level-0);\n",
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted span {\n",
+ " /* fitted */\n",
+ " background: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link:hover span {\n",
+ " display: block;\n",
+ "}\n",
+ "\n",
+ "/* \"?\"-specific style due to the `` HTML tag */\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link {\n",
+ " float: right;\n",
+ " font-size: 1rem;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ " border-radius: 1rem;\n",
+ " height: 1rem;\n",
+ " width: 1rem;\n",
+ " text-decoration: none;\n",
+ " /* unfitted */\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "#sk-container-id-2 a.estimator_doc_link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".estimator-table {\n",
+ " font-family: monospace;\n",
+ "}\n",
+ "\n",
+ ".estimator-table summary {\n",
+ " padding: .5rem;\n",
+ " cursor: pointer;\n",
+ "}\n",
+ "\n",
+ ".estimator-table summary::marker {\n",
+ " font-size: 0.7rem;\n",
+ "}\n",
+ "\n",
+ ".estimator-table details[open] {\n",
+ " padding-left: 0.1rem;\n",
+ " padding-right: 0.1rem;\n",
+ " padding-bottom: 0.3rem;\n",
+ "}\n",
+ "\n",
+ ".estimator-table .parameters-table {\n",
+ " margin-left: auto !important;\n",
+ " margin-right: auto !important;\n",
+ " margin-top: 0;\n",
+ "}\n",
+ "\n",
+ ".estimator-table .parameters-table tr:nth-child(odd) {\n",
+ " background-color: #fff;\n",
+ "}\n",
+ "\n",
+ ".estimator-table .parameters-table tr:nth-child(even) {\n",
+ " background-color: #f6f6f6;\n",
+ "}\n",
+ "\n",
+ ".estimator-table .parameters-table tr:hover {\n",
+ " background-color: #e0e0e0;\n",
+ "}\n",
+ "\n",
+ ".estimator-table table td {\n",
+ " border: 1px solid rgba(106, 105, 104, 0.232);\n",
+ "}\n",
+ "\n",
+ "/*\n",
+ " `table td`is set in notebook with right text-align.\n",
+ " We need to overwrite it.\n",
+ "*/\n",
+ ".estimator-table table td.param {\n",
+ " text-align: left;\n",
+ " position: relative;\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ ".user-set td {\n",
+ " color:rgb(255, 94, 0);\n",
+ " text-align: left !important;\n",
+ "}\n",
+ "\n",
+ ".user-set td.value {\n",
+ " color:rgb(255, 94, 0);\n",
+ " background-color: transparent;\n",
+ "}\n",
+ "\n",
+ ".default td {\n",
+ " color: black;\n",
+ " text-align: left !important;\n",
+ "}\n",
+ "\n",
+ ".user-set td i,\n",
+ ".default td i {\n",
+ " color: black;\n",
+ "}\n",
+ "\n",
+ "/*\n",
+ " Styles for parameter documentation links\n",
+ " We need styling for visited so jupyter doesn't overwrite it\n",
+ "*/\n",
+ "a.param-doc-link,\n",
+ "a.param-doc-link:link,\n",
+ "a.param-doc-link:visited {\n",
+ " text-decoration: underline dashed;\n",
+ " text-underline-offset: .3em;\n",
+ " color: inherit;\n",
+ " display: block;\n",
+ " padding: .5em;\n",
+ "}\n",
+ "\n",
+ "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
+ "a.param-doc-link::before {\n",
+ " position: absolute;\n",
+ " content: \"\";\n",
+ " inset: 0;\n",
+ "}\n",
+ "\n",
+ ".param-doc-description {\n",
+ " display: none;\n",
+ " position: absolute;\n",
+ " z-index: 9999;\n",
+ " left: 0;\n",
+ " padding: .5ex;\n",
+ " margin-left: 1.5em;\n",
+ " color: var(--sklearn-color-text);\n",
+ " box-shadow: .3em .3em .4em #999;\n",
+ " width: max-content;\n",
+ " text-align: left;\n",
+ " max-height: 10em;\n",
+ " overflow-y: auto;\n",
+ "\n",
+ " /* unfitted */\n",
+ " background: var(--sklearn-color-unfitted-level-0);\n",
+ " border: thin solid var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ "/* Fitted state for parameter tooltips */\n",
+ ".fitted .param-doc-description {\n",
+ " /* fitted */\n",
+ " background: var(--sklearn-color-fitted-level-0);\n",
+ " border: thin solid var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".param-doc-link:hover .param-doc-description {\n",
+ " display: block;\n",
+ "}\n",
+ "\n",
+ ".copy-paste-icon {\n",
+ " background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
+ " background-repeat: no-repeat;\n",
+ " background-size: 14px 14px;\n",
+ " background-position: 0;\n",
+ " display: inline-block;\n",
+ " width: 14px;\n",
+ " height: 14px;\n",
+ " cursor: pointer;\n",
+ "}\n",
+ "LogisticRegression() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " penalty\n",
+ " penalty: {'l1', 'l2', 'elasticnet', None}, default='l2' Specify the norm of the penalty: - `None`: no penalty is added; - `'l2'`: add a L2 penalty term and it is the default choice; - `'l1'`: add a L1 penalty term; - `'elasticnet'`: both L1 and L2 penalty terms are added. .. warning:: Some penalties may not work with some solvers. See the parameter `solver` below, to know the compatibility between the penalty and solver. .. versionadded:: 0.19 l1 penalty with SAGA solver (allowing 'multinomial' + L1) .. deprecated:: 1.8 `penalty` was deprecated in version 1.8 and will be removed in 1.10. Use `l1_ratio` instead. `l1_ratio=0` for `penalty='l2'`, `l1_ratio=1` for `penalty='l1'` and `l1_ratio` set to any float between 0 and 1 for `'penalty='elasticnet'`. \n",
+ " \n",
+ " \n",
+ " 'deprecated' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " C\n",
+ " C: float, default=1.0 Inverse of regularization strength; must be a positive float. Like in support vector machines, smaller values specify stronger regularization. `C=np.inf` results in unpenalized logistic regression. For a visual example on the effect of tuning the `C` parameter with an L1 penalty, see: :ref:`sphx_glr_auto_examples_linear_model_plot_logistic_path.py`. \n",
+ " \n",
+ " \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " l1_ratio\n",
+ " l1_ratio: float, default=0.0 The Elastic-Net mixing parameter, with `0 <= l1_ratio <= 1`. Setting `l1_ratio=1` gives a pure L1-penalty, setting `l1_ratio=0` a pure L2-penalty. Any value between 0 and 1 gives an Elastic-Net penalty of the form `l1_ratio * L1 + (1 - l1_ratio) * L2`. .. warning:: Certain values of `l1_ratio`, i.e. some penalties, may not work with some solvers. See the parameter `solver` below, to know the compatibility between the penalty and solver. .. versionchanged:: 1.8 Default value changed from None to 0.0. .. deprecated:: 1.8 `None` is deprecated and will be removed in version 1.10. Always use `l1_ratio` to specify the penalty type. \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " dual\n",
+ " dual: bool, default=False Dual (constrained) or primal (regularized, see also :ref:`this equation `) formulation. Dual formulation is only implemented for l2 penalty with liblinear solver. Prefer `dual=False` when n_samples > n_features. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " tol\n",
+ " tol: float, default=1e-4 Tolerance for stopping criteria. \n",
+ " \n",
+ " \n",
+ " 0.0001 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " fit_intercept\n",
+ " fit_intercept: bool, default=True Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function. \n",
+ " \n",
+ " \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " intercept_scaling\n",
+ " intercept_scaling: float, default=1 Useful only when the solver `liblinear` is used and `self.fit_intercept` is set to `True`. In this case, `x` becomes `[x, self.intercept_scaling]`, i.e. a \"synthetic\" feature with constant value equal to `intercept_scaling` is appended to the instance vector. The intercept becomes ``intercept_scaling * synthetic_feature_weight``. .. note:: The synthetic feature weight is subject to L1 or L2 regularization as all other features. To lessen the effect of regularization on synthetic feature weight (and therefore on the intercept) `intercept_scaling` has to be increased. \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " class_weight\n",
+ " class_weight: dict or 'balanced', default=None Weights associated with classes in the form ``{class_label: weight}``. If not given, all classes are supposed to have weight one. The \"balanced\" mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as ``n_samples / (n_classes * np.bincount(y))``. Note that these weights will be multiplied with sample_weight (passed through the fit method) if sample_weight is specified. .. versionadded:: 0.17 *class_weight='balanced'* \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " random_state\n",
+ " random_state: int, RandomState instance, default=None Used when ``solver`` == 'sag', 'saga' or 'liblinear' to shuffle the data. See :term:`Glossary ` for details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " solver\n",
+ " solver: {'lbfgs', 'liblinear', 'newton-cg', 'newton-cholesky', 'sag', 'saga'}, default='lbfgs' Algorithm to use in the optimization problem. Default is 'lbfgs'. To choose a solver, you might want to consider the following aspects: - 'lbfgs' is a good default solver because it works reasonably well for a wide class of problems. - For :term:`multiclass` problems (`n_classes >= 3`), all solvers except 'liblinear' minimize the full multinomial loss, 'liblinear' will raise an error. - 'newton-cholesky' is a good choice for `n_samples` >> `n_features * n_classes`, especially with one-hot encoded categorical features with rare categories. Be aware that the memory usage of this solver has a quadratic dependency on `n_features * n_classes` because it explicitly computes the full Hessian matrix. - For small datasets, 'liblinear' is a good choice, whereas 'sag' and 'saga' are faster for large ones; - 'liblinear' can only handle binary classification by default. To apply a one-versus-rest scheme for the multiclass setting one can wrap it with the :class:`~sklearn.multiclass.OneVsRestClassifier`. .. warning:: The choice of the algorithm depends on the penalty chosen (`l1_ratio=0` for L2-penalty, `l1_ratio=1` for L1-penalty and `0 < l1_ratio < 1` for Elastic-Net) and on (multinomial) multiclass support: ================= ======================== ====================== solver l1_ratio multinomial multiclass ================= ======================== ====================== 'lbfgs' l1_ratio=0 yes 'liblinear' l1_ratio=1 or l1_ratio=0 no 'newton-cg' l1_ratio=0 yes 'newton-cholesky' l1_ratio=0 yes 'sag' l1_ratio=0 yes 'saga' 0<=l1_ratio<=1 yes ================= ======================== ====================== .. note:: 'sag' and 'saga' fast convergence is only guaranteed on features with approximately the same scale. You can preprocess the data with a scaler from :mod:`sklearn.preprocessing`. .. seealso:: Refer to the :ref:`User Guide ` for more information regarding :class:`LogisticRegression` and more specifically the :ref:`Table ` summarizing solver/penalty supports. .. versionadded:: 0.17 Stochastic Average Gradient (SAG) descent solver. Multinomial support in version 0.18. .. versionadded:: 0.19 SAGA solver. .. versionchanged:: 0.22 The default solver changed from 'liblinear' to 'lbfgs' in 0.22. .. versionadded:: 1.2 newton-cholesky solver. Multinomial support in version 1.6. \n",
+ " \n",
+ " \n",
+ " 'lbfgs' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_iter\n",
+ " max_iter: int, default=100 Maximum number of iterations taken for the solvers to converge. \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " verbose\n",
+ " verbose: int, default=0 For the liblinear and lbfgs solvers set verbose to any positive number for verbosity. \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " warm_start\n",
+ " warm_start: bool, default=False When set to True, reuse the solution of the previous call to fit as initialization, otherwise, just erase the previous solution. Useless for liblinear solver. See :term:`the Glossary `. .. versionadded:: 0.17 *warm_start* to support *lbfgs*, *newton-cg*, *sag*, *saga* solvers. \n",
+ " \n",
+ " \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " n_jobs\n",
+ " n_jobs: int, default=None Does not have any effect. .. deprecated:: 1.8 `n_jobs` is deprecated in version 1.8 and will be removed in 1.10. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LogisticRegression()"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, train_size=0.8)\n",
+ "\n",
+ "model = LogisticRegression()\n",
+ "model.fit(x_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "d8098877",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9666666666666667"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.score(x_test, y_test)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "49aea81d",
+ "metadata": {},
+ "source": [
+ "### Confusion Matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "b54f661d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y_predicted = model.predict(x_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "2390b059",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "cm = confusion_matrix(y_test, y_predicted)\n",
+ "sns.heatmap(cm, annot=True)"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/ML/9_decision_tree/Exercise/Solution_for_understanding.ipynb b/ML/9_decision_tree/Exercise/Solution_for_understanding.ipynb
new file mode 100644
index 00000000..f1443e60
--- /dev/null
+++ b/ML/9_decision_tree/Exercise/Solution_for_understanding.ipynb
@@ -0,0 +1,1745 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "9e1bc565",
+ "metadata": {},
+ "source": [
+ "# The Titanic Survival Prediction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e87270cb",
+ "metadata": {},
+ "source": [
+ "## Imports and Data Loading"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0f3b85cf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sklearn.compose import ColumnTransformer\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.preprocessing import OneHotEncoder\n",
+ "import seaborn as sns\n",
+ "from sklearn.tree import DecisionTreeClassifier"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "5e270d2b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PassengerId \n",
+ " Survived \n",
+ " Pclass \n",
+ " Name \n",
+ " Sex \n",
+ " Age \n",
+ " SibSp \n",
+ " Parch \n",
+ " Ticket \n",
+ " Fare \n",
+ " Cabin \n",
+ " Embarked \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 3 \n",
+ " Braund, Mr. Owen Harris \n",
+ " male \n",
+ " 22.0 \n",
+ " 1 \n",
+ " 0 \n",
+ " A/5 21171 \n",
+ " 7.2500 \n",
+ " NaN \n",
+ " S \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2 \n",
+ " 1 \n",
+ " 1 \n",
+ " Cumings, Mrs. John Bradley (Florence Briggs Th... \n",
+ " female \n",
+ " 38.0 \n",
+ " 1 \n",
+ " 0 \n",
+ " PC 17599 \n",
+ " 71.2833 \n",
+ " C85 \n",
+ " C \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3 \n",
+ " 1 \n",
+ " 3 \n",
+ " Heikkinen, Miss. Laina \n",
+ " female \n",
+ " 26.0 \n",
+ " 0 \n",
+ " 0 \n",
+ " STON/O2. 3101282 \n",
+ " 7.9250 \n",
+ " NaN \n",
+ " S \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4 \n",
+ " 1 \n",
+ " 1 \n",
+ " Futrelle, Mrs. Jacques Heath (Lily May Peel) \n",
+ " female \n",
+ " 35.0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 113803 \n",
+ " 53.1000 \n",
+ " C123 \n",
+ " S \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5 \n",
+ " 0 \n",
+ " 3 \n",
+ " Allen, Mr. William Henry \n",
+ " male \n",
+ " 35.0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 373450 \n",
+ " 8.0500 \n",
+ " NaN \n",
+ " S \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PassengerId Survived Pclass \\\n",
+ "0 1 0 3 \n",
+ "1 2 1 1 \n",
+ "2 3 1 3 \n",
+ "3 4 1 1 \n",
+ "4 5 0 3 \n",
+ "\n",
+ " Name Sex Age SibSp \\\n",
+ "0 Braund, Mr. Owen Harris male 22.0 1 \n",
+ "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
+ "2 Heikkinen, Miss. Laina female 26.0 0 \n",
+ "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
+ "4 Allen, Mr. William Henry male 35.0 0 \n",
+ "\n",
+ " Parch Ticket Fare Cabin Embarked \n",
+ "0 0 A/5 21171 7.2500 NaN S \n",
+ "1 0 PC 17599 71.2833 C85 C \n",
+ "2 0 STON/O2. 3101282 7.9250 NaN S \n",
+ "3 0 113803 53.1000 C123 S \n",
+ "4 0 373450 8.0500 NaN S "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(\"titanic.csv\")\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "963be91a",
+ "metadata": {},
+ "source": [
+ "## Preprocessing and Preparing x and y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "0b3c8359",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Pclass \n",
+ " Sex \n",
+ " Age \n",
+ " Fare \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3 \n",
+ " male \n",
+ " 22.0 \n",
+ " 7.2500 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1 \n",
+ " female \n",
+ " 38.0 \n",
+ " 71.2833 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3 \n",
+ " female \n",
+ " 26.0 \n",
+ " 7.9250 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 1 \n",
+ " female \n",
+ " 35.0 \n",
+ " 53.1000 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 3 \n",
+ " male \n",
+ " 35.0 \n",
+ " 8.0500 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Pclass Sex Age Fare\n",
+ "0 3 male 22.0 7.2500\n",
+ "1 1 female 38.0 71.2833\n",
+ "2 3 female 26.0 7.9250\n",
+ "3 1 female 35.0 53.1000\n",
+ "4 3 male 35.0 8.0500"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = df[[\"Pclass\",\"Sex\",\"Age\",\"Fare\"]]\n",
+ "x.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "a7062760",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Pclass \n",
+ " Age \n",
+ " Fare \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " count \n",
+ " 891.000000 \n",
+ " 714.000000 \n",
+ " 891.000000 \n",
+ " \n",
+ " \n",
+ " mean \n",
+ " 2.308642 \n",
+ " 29.699118 \n",
+ " 32.204208 \n",
+ " \n",
+ " \n",
+ " std \n",
+ " 0.836071 \n",
+ " 14.526497 \n",
+ " 49.693429 \n",
+ " \n",
+ " \n",
+ " min \n",
+ " 1.000000 \n",
+ " 0.420000 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 25% \n",
+ " 2.000000 \n",
+ " 20.125000 \n",
+ " 7.910400 \n",
+ " \n",
+ " \n",
+ " 50% \n",
+ " 3.000000 \n",
+ " 28.000000 \n",
+ " 14.454200 \n",
+ " \n",
+ " \n",
+ " 75% \n",
+ " 3.000000 \n",
+ " 38.000000 \n",
+ " 31.000000 \n",
+ " \n",
+ " \n",
+ " max \n",
+ " 3.000000 \n",
+ " 80.000000 \n",
+ " 512.329200 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Pclass Age Fare\n",
+ "count 891.000000 714.000000 891.000000\n",
+ "mean 2.308642 29.699118 32.204208\n",
+ "std 0.836071 14.526497 49.693429\n",
+ "min 1.000000 0.420000 0.000000\n",
+ "25% 2.000000 20.125000 7.910400\n",
+ "50% 3.000000 28.000000 14.454200\n",
+ "75% 3.000000 38.000000 31.000000\n",
+ "max 3.000000 80.000000 512.329200"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.describe()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "70079661",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(891, 4)"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "ff1db4db",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.Sex.count"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0fa55a7f",
+ "metadata": {},
+ "source": [
+ "Age column has some missing values, we have to fill it with suitable value"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "61207335",
+ "metadata": {},
+ "source": [
+ "### Checking the best value to fillna in Age"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "5c5d7166",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUatJREFUeJzt3Qd4VFX+PvB3Wia990qAAKFX6YqCoGBB1NX9gWJ37WDHuq4V/dtFWV0BXUEsK6goKALSey8BAgnpvU8mmSQz83/OmSQSBYUwk5m5836e5zI1k3vvhMmbc77nHJXVarWCiIiISKHUzt4BIiIiIkdi2CEiIiJFY9ghIiIiRWPYISIiIkVj2CEiIiJFY9ghIiIiRWPYISIiIkXTOnsHXIHFYkF+fj4CAgKgUqmcvTtERER0BsRUgTU1NYiNjYVaffr2G4YdQAadhISEMzmvRERE5GJycnIQHx9/2scZdgDZotNysgIDAzvu3SEiIqJ2q66ulo0VLb/HT4dhB2jtuhJBh2GHiIjIvfxVCQoLlImIiEjRGHaIiIhI0Rh2iIiISNEYdoiIiEjRnBp21q1bh8svv1yOjxfFRUuXLv3D+PlnnnkGMTEx8PHxwbhx45Cent7mOeXl5Zg6daosLA4ODsatt94Kg8HQwUdCRERErsqpYae2thb9+vXDnDlzTvn4q6++infeeQdz587F1q1b4efnhwkTJqC+vr71OSLoHDx4ECtXrsSyZctkgLrjjjs68CiIiIjIlamsovnEBYiWnSVLlmDy5Mnyttgt0eLz0EMP4eGHH5b3VVVVISoqCgsWLMD111+PtLQ09OzZE9u3b8fgwYPlc1asWIGJEyciNzdXfv2ZjtMPCgqSr8+h50RERO7hTH9/u2zNTmZmJgoLC2XXVQtxQEOHDsXmzZvlbXEpuq5ago4gni+mjBYtQadjMpnkCTp5IyIiImVy2bAjgo4gWnJOJm63PCYuIyMj2zyu1WoRGhra+pxTefnll2Vwatm4VAQREZFyuWzYcaRZs2bJJq+WTSwTQURERMrksmEnOjpaXhYVFbW5X9xueUxcFhcXt3m8qalJjtBqec6p6PX61qUhuEQEERGRsrls2ElOTpaBZdWqVa33idoaUYszfPhweVtcVlZWYufOna3PWb16NSwWi6ztISIiInLqQqBiPpxjx461KUres2ePrLlJTEzEjBkz8MILLyAlJUWGn6efflqOsGoZsZWamopLLrkEt99+uxye3tjYiHvvvVeO1DrTkVhERESkbE4NOzt27MCFF17YevvBBx+Ul9OnT5fDyx999FE5F4+YN0e04IwaNUoOLff29m79moULF8qAM3bsWDkK6+qrr5Zz8xARERG51Dw7zsR5dujPZGdno7S01O4nKTw8XLZgEhGRY39/O7Vlh8gdgk6P1FTUGY12f20fX18cTktj4CEicjCGHaI/IVp0RNCZ+thriErsYrdzVZR9HAtnPyJfn607RESOxbBDdAZE0IlP6cVzRUTkhlx26DkRERGRPTDsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRommdvQNEnqbMYMLxGjXCJs7AU6vLoN64Hk1mK6ICvREb7IMBCcEYmRKOuGAfZ+8qEZEiMOwQdQCLxYojRTXYl1uFwup6+V/Pv884HCptACA24HBhjbz8fFu2vEyNCcT/DU3EVQPi4K/nf1UiovbiJyiRg+VX1mHNkWKUGmyhRq0CwvUWHF31Bf710F3o0yMFarUKhVV1OFFmxNaMMuzNrUJaQTWeXnoAs5cfxh3nd8ato5Lhx9BDRHTWGHaIHNias+F4KXZnV8rb3lo1BiSGoFdsICqyj2D7hoUY9faDGNgj8g9fW2lswJLdefhsSxaOl9TijZVH8enmLDx9WSqu6BcLlUrF942I6Awx7BA5gKnJjOX7C5FVbpS3RcAZ2SUcPl4aebviL74+2NcLN49MxvThnfDD/gL8v5+PIKvMiAcW78H3ewvw0lW9ERnozfeOiOgMcDQWkZ3VNZrx1c5cGXS0ahUm9o7GuNSo1qBzNkT31uX9YrFy5gV46OJu0GlU+CWtCBPfWY9Nx0v53hERnQGGHSI7amiy4Ns9eSgzNMDXS4NrBsUj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wGN0f3wPlUHp76PSj8/RxyhadGpqahAb+1tt0Km4fdgRw9k0Gg2Kiora3C9uR0dHn/Jr9Hq93E4WHBxs930Tb6pSf3g94fgEHqP743uoDEp/H5V+fI48xqCgoL98jhpuzsvLC4MGDcKqVavatNSI28OHD3fqvhEREZHzuX3LjiC6pKZPn47BgwfLuXXE0PPa2trW0VlERETkuRQRdq677jqUlJTgmWeekZMK9u/fHytWrEBUlG1xtI4musieffbZP3SVKYXSj0/gMbo/vofKoPT3UenH5yrHqBJVyk777kREREQO5vY1O0RERER/hmGHiIiIFI1hh4iIiBSNYYeIiIgUjWHHzubMmYNOnTrB29tbrsC+bds2uKt169bh8ssvlzNTipmlly5d2uZxUdsuRsDFxMTAx8dHrkeWnp4Od/Hyyy9jyJAhCAgIQGRkJCZPnowjR460eU59fT3uueceObu2v78/rr766j9MYOnKPvjgA/Tt27d1Mi8x99Ty5csVc3y/98orr8if1RkzZijmGP/5z3/KYzp569Gjh2KOr0VeXh6mTZsmj0N8nvTp0wc7duxQzOeN+L3w+/dRbOK9U8L7aDab8fTTTyM5OVm+P126dMHzzz/fZs0qp76H9lynytMtXrzY6uXlZZ03b5714MGD1ttvv90aHBxsLSoqsrqjH3/80frkk09av/nmG7n2yJIlS9o8/sorr1iDgoKsS5cute7du9d6xRVXWJOTk611dXVWdzBhwgTr/PnzrQcOHLDu2bPHOnHiRGtiYqLVYDC0Pucf//iHNSEhwbpq1Srrjh07rMOGDbOOGDHC6i6+++476w8//GA9evSo9ciRI9YnnnjCqtPp5DEr4fhOtm3bNmunTp2sffv2tT7wwAOt97v7MYq1/Hr16mUtKCho3UpKShRzfEJ5ebk1KSnJetNNN1m3bt1qzcjIsP7000/WY8eOKebzpri4uM17uHLlSvm5umbNGkW8jy+++KI1LCzMumzZMmtmZqb1q6++svr7+1vffvttl3gPGXbsSCw8es8997TeNpvN1tjYWOvLL79sdXe/DzsWi8UaHR1tfe2111rvq6ystOr1euvnn39udUfiw0gc59q1a1uPRwQD8Z+2RVpamnzO5s2bre4qJCTE+p///EdRx1dTU2NNSUmRv0AuuOCC1rCjhGMUYadfv36nfEwJ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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.histplot(x.Age, kde=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d903de8b",
+ "metadata": {},
+ "source": [
+ "The data is normal, fine to fill with mean"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "9d6f439e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Pclass \n",
+ " Age \n",
+ " Fare \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " count \n",
+ " 891.000000 \n",
+ " 891.000000 \n",
+ " 891.000000 \n",
+ " \n",
+ " \n",
+ " mean \n",
+ " 2.308642 \n",
+ " 29.699118 \n",
+ " 32.204208 \n",
+ " \n",
+ " \n",
+ " std \n",
+ " 0.836071 \n",
+ " 13.002015 \n",
+ " 49.693429 \n",
+ " \n",
+ " \n",
+ " min \n",
+ " 1.000000 \n",
+ " 0.420000 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 25% \n",
+ " 2.000000 \n",
+ " 22.000000 \n",
+ " 7.910400 \n",
+ " \n",
+ " \n",
+ " 50% \n",
+ " 3.000000 \n",
+ " 29.699118 \n",
+ " 14.454200 \n",
+ " \n",
+ " \n",
+ " 75% \n",
+ " 3.000000 \n",
+ " 35.000000 \n",
+ " 31.000000 \n",
+ " \n",
+ " \n",
+ " max \n",
+ " 3.000000 \n",
+ " 80.000000 \n",
+ " 512.329200 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Pclass Age Fare\n",
+ "count 891.000000 891.000000 891.000000\n",
+ "mean 2.308642 29.699118 32.204208\n",
+ "std 0.836071 13.002015 49.693429\n",
+ "min 1.000000 0.420000 0.000000\n",
+ "25% 2.000000 22.000000 7.910400\n",
+ "50% 3.000000 29.699118 14.454200\n",
+ "75% 3.000000 35.000000 31.000000\n",
+ "max 3.000000 80.000000 512.329200"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.Age = x.Age.fillna(x.Age.mean())\n",
+ "x.describe()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7de16e02",
+ "metadata": {},
+ "source": [
+ "### Encoding the Sex column"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "cb332b65",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 1. , 3. , 22. , 7.25 ],\n",
+ " [ 0. , 1. , 38. , 71.2833 ],\n",
+ " [ 0. , 3. , 26. , 7.925 ],\n",
+ " ...,\n",
+ " [ 0. , 3. , 29.69911765, 23.45 ],\n",
+ " [ 1. , 1. , 26. , 30. ],\n",
+ " [ 1. , 3. , 32. , 7.75 ]],\n",
+ " shape=(891, 4))"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = df.Survived\n",
+ "\n",
+ "#encoding Sex with one hot encoder, this is better and using label encoder before it is depricated now\n",
+ "ct = ColumnTransformer([(\"Sex\", OneHotEncoder(drop=\"first\"), [1])], remainder=\"passthrough\")\n",
+ "x = ct.fit_transform(x)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "30d65fee",
+ "metadata": {},
+ "source": [
+ "### Making a dataframe with column names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "19a273c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Sex__Sex_male \n",
+ " remainder__Pclass \n",
+ " remainder__Age \n",
+ " remainder__Fare \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1.0 \n",
+ " 3.0 \n",
+ " 22.0 \n",
+ " 7.2500 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 38.0 \n",
+ " 71.2833 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 26.0 \n",
+ " 7.9250 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 35.0 \n",
+ " 53.1000 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1.0 \n",
+ " 3.0 \n",
+ " 35.0 \n",
+ " 8.0500 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Sex__Sex_male remainder__Pclass remainder__Age remainder__Fare\n",
+ "0 1.0 3.0 22.0 7.2500\n",
+ "1 0.0 1.0 38.0 71.2833\n",
+ "2 0.0 3.0 26.0 7.9250\n",
+ "3 0.0 1.0 35.0 53.1000\n",
+ "4 1.0 3.0 35.0 8.0500"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# to see the column name, i always do the following thing\n",
+ "feature_columns = ct.get_feature_names_out()\n",
+ "features = pd.DataFrame(x, columns=feature_columns)\n",
+ "features.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f5f0da0f",
+ "metadata": {},
+ "source": [
+ "## Training the model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f97f5b34",
+ "metadata": {},
+ "source": [
+ "### Train Test Split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "e830f752",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x_train, x_test, y_train, y_test = train_test_split(x, y , train_size=0.8)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "255a1893",
+ "metadata": {},
+ "source": [
+ "### Model fitting"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "199b2197",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "DecisionTreeClassifier() 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. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " criterion\n",
+ " criterion: {\"gini\", \"entropy\", \"log_loss\"}, default=\"gini\" The function to measure the quality of a split. Supported criteria are \"gini\" for the Gini impurity and \"log_loss\" and \"entropy\" both for the Shannon information gain, see :ref:`tree_mathematical_formulation`. \n",
+ " \n",
+ " \n",
+ " 'gini' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " splitter\n",
+ " splitter: {\"best\", \"random\"}, default=\"best\" The strategy used to choose the split at each node. Supported strategies are \"best\" to choose the best split and \"random\" to choose the best random split. \n",
+ " \n",
+ " \n",
+ " 'best' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_depth\n",
+ " max_depth: int, default=None The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_samples_split\n",
+ " min_samples_split: int or float, default=2 The minimum number of samples required to split an internal node: - If int, then consider `min_samples_split` as the minimum number. - If float, then `min_samples_split` is a fraction and `ceil(min_samples_split * n_samples)` are the minimum number of samples for each split. .. versionchanged:: 0.18 Added float values for fractions. \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_samples_leaf\n",
+ " min_samples_leaf: int or float, default=1 The minimum number of samples required to be at a leaf node. A split point at any depth will only be considered if it leaves at least ``min_samples_leaf`` training samples in each of the left and right branches. This may have the effect of smoothing the model, especially in regression. - If int, then consider `min_samples_leaf` as the minimum number. - If float, then `min_samples_leaf` is a fraction and `ceil(min_samples_leaf * n_samples)` are the minimum number of samples for each node. .. versionchanged:: 0.18 Added float values for fractions. \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_weight_fraction_leaf\n",
+ " min_weight_fraction_leaf: float, default=0.0 The minimum weighted fraction of the sum total of weights (of all the input samples) required to be at a leaf node. Samples have equal weight when sample_weight is not provided. \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_features\n",
+ " max_features: int, float or {\"sqrt\", \"log2\"}, default=None The number of features to consider when looking for the best split: - If int, then consider `max_features` features at each split. - If float, then `max_features` is a fraction and `max(1, int(max_features * n_features_in_))` features are considered at each split. - If \"sqrt\", then `max_features=sqrt(n_features)`. - If \"log2\", then `max_features=log2(n_features)`. - If None, then `max_features=n_features`. .. note:: The search for a split does not stop until at least one valid partition of the node samples is found, even if it requires to effectively inspect more than ``max_features`` features. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " random_state\n",
+ " random_state: int, RandomState instance or None, default=None Controls the randomness of the estimator. The features are always randomly permuted at each split, even if ``splitter`` is set to ``\"best\"``. When ``max_features < n_features``, the algorithm will select ``max_features`` at random at each split before finding the best split among them. But the best found split may vary across different runs, even if ``max_features=n_features``. That is the case, if the improvement of the criterion is identical for several splits and one split has to be selected at random. To obtain a deterministic behaviour during fitting, ``random_state`` has to be fixed to an integer. See :term:`Glossary ` for details. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " max_leaf_nodes\n",
+ " max_leaf_nodes: int, default=None Grow a tree with ``max_leaf_nodes`` in best-first fashion. Best nodes are defined as relative reduction in impurity. If None then unlimited number of leaf nodes. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " min_impurity_decrease\n",
+ " min_impurity_decrease: float, default=0.0 A node will be split if this split induces a decrease of the impurity greater than or equal to this value. The weighted impurity decrease equation is the following:: N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity) where ``N`` is the total number of samples, ``N_t`` is the number of samples at the current node, ``N_t_L`` is the number of samples in the left child, and ``N_t_R`` is the number of samples in the right child. ``N``, ``N_t``, ``N_t_R`` and ``N_t_L`` all refer to the weighted sum, if ``sample_weight`` is passed. .. versionadded:: 0.19 \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " class_weight\n",
+ " class_weight: dict, list of dict or \"balanced\", default=None Weights associated with classes in the form ``{class_label: weight}``. If None, all classes are supposed to have weight one. For multi-output problems, a list of dicts can be provided in the same order as the columns of y. Note that for multioutput (including multilabel) weights should be defined for each class of every column in its own dict. For example, for four-class multilabel classification weights should be [{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of [{1:1}, {2:5}, {3:1}, {4:1}]. The \"balanced\" mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as ``n_samples / (n_classes * np.bincount(y))`` For multi-output, the weights of each column of y will be multiplied. Note that these weights will be multiplied with sample_weight (passed through the fit method) if sample_weight is specified. \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " ccp_alpha\n",
+ " ccp_alpha: non-negative float, default=0.0 Complexity parameter used for Minimal Cost-Complexity Pruning. The subtree with the largest cost complexity that is smaller than ``ccp_alpha`` will be chosen. By default, no pruning is performed. See :ref:`minimal_cost_complexity_pruning` for details. See :ref:`sphx_glr_auto_examples_tree_plot_cost_complexity_pruning.py` for an example of such pruning. .. versionadded:: 0.22 \n",
+ " \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " monotonic_cst\n",
+ " monotonic_cst: array-like of int of shape (n_features), default=None Indicates the monotonicity constraint to enforce on each feature. - 1: monotonic increase - 0: no constraint - -1: monotonic decrease If monotonic_cst is None, no constraints are applied. Monotonicity constraints are not supported for: - multiclass classifications (i.e. when `n_classes > 2`), - multioutput classifications (i.e. when `n_outputs_ > 1`), - classifications trained on data with missing values. The constraints hold over the probability of the positive class. Read more in the :ref:`User Guide `. .. versionadded:: 1.4 \n",
+ " \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "DecisionTreeClassifier()"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = DecisionTreeClassifier()\n",
+ "model.fit(x_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b883285",
+ "metadata": {},
+ "source": [
+ "### Checking the Score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "89e3e334",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.8324022346368715"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.score(x_test, y_test)"
+ ]
+ }
+ ],
+ "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.14.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}