tahamajs's picture
download
raw
45.2 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load Dataset"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "41ByKBEm2FFE"
},
"outputs": [],
"source": [
"from sklearn.base import BaseEstimator, ClassifierMixin, clone\n",
"from sklearn.datasets import load_iris\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.preprocessing import LabelEncoder\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"iris = load_iris()\n",
"X = iris.data\n",
"y = iris.target_names[iris.target]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AdaBoostClassifier"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "80eGYDq72Icw"
},
"outputs": [],
"source": [
"class SimpleMultiClassBoosting(BaseEstimator, ClassifierMixin):\n",
" def __init__(self, base_estimator=None, n_estimators=50):\n",
" self.base_estimator = base_estimator if base_estimator is not None else DecisionTreeClassifier(max_depth=1)\n",
" self.n_estimators = n_estimators\n",
" self.learners = []\n",
" self.learner_weights = []\n",
" self.label_encoder = LabelEncoder()\n",
"\n",
" def fit(self, X, y):\n",
" \n",
" # Convert labels to [0, n_classes-1]\n",
" y = self.label_encoder.fit_transform(y)\n",
" n_classes = len(self.label_encoder.classes_)\n",
" n_samples = X.shape[0]\n",
" \n",
" # Initialize weights uniformly\n",
" sample_weight = np.full(n_samples, 1/n_samples)\n",
"\n",
" for _ in range(self.n_estimators):\n",
" \n",
" choosen_samples = np.random.choice(\n",
" np.arange(0, n_samples), \n",
" size=n_samples,\n",
" p=sample_weight\n",
" )\n",
" learner = clone(self.base_estimator)\n",
" learner.fit(X[choosen_samples], y[choosen_samples], sample_weight=sample_weight)\n",
"\n",
" # Compute weighted error rate (misclassification rate)\n",
" y_pred = learner.predict(X)\n",
" correct_pred = np.array([1 if a == b else 0 for a, b in zip(y, y_pred)])\n",
" miss_pred = 1 - correct_pred\n",
" learner_error = np.sum(miss_pred * sample_weight) / np.sum(sample_weight)\n",
" \n",
" # Compute learner weight using SAMME algorithm\n",
" if learner_error >= 1 - (1 / n_classes):\n",
" break # Stop if the learner is no better than random guessing\n",
" learner_weight = 0.5 * np.log((1.0 - learner_error)/1.0) + np.log(n_classes - 1)\n",
" \n",
" # Increase the weights of misclassified samples\n",
" sample_weight = self._normalize(sample_weight * np.exp((miss_pred - correct_pred) * learner_weight))\n",
" \n",
" # Save the current learner\n",
" self.learners.append(learner)\n",
" self.learner_weights.append(learner_weight)\n",
"\n",
" def predict(self, X):\n",
" n_samples = X.shape[0]\n",
" n_classes = len(self.label_encoder.classes_)\n",
" \n",
" # Collect predictions from each learner\n",
" y_pred = np.array([learner.predict(X) for learner in self.learners])\n",
"\n",
" # Weighted vote for each sample's prediction across all learners\n",
" votes = np.zeros((n_samples, n_classes))\n",
" for i in range(n_samples):\n",
" for vote, weight in zip(y_pred[:, i], self.learner_weights):\n",
" votes[i][vote] += weight\n",
" \n",
" # Final prediction is the one with the highest weighted vote\n",
" majority_vote = np.argmax(votes, axis=1)\n",
"\n",
" # Convert back to original class labels\n",
" return self.label_encoder.inverse_transform(majority_vote)\n",
" \n",
" def _normalize(self, probs):\n",
" return probs / np.sum(probs)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def plt_confusion_matrix(y_true, y_pred, labels, title):\n",
" \n",
" cm = confusion_matrix(y_true, y_pred, labels=labels)\n",
" sns.heatmap(\n",
" cm.T, \n",
" square=True, \n",
" annot=True, \n",
" fmt='d', \n",
" cbar=True,\n",
" xticklabels=labels, \n",
" yticklabels=labels, \n",
" cmap=plt.cm.Blues\n",
" )\n",
" plt.xlabel('Predicted Label')\n",
" plt.ylabel('True Label')\n",
" plt.title(title + \" - Confusion Matrix\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: 1.0\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ada_Boost = SimpleMultiClassBoosting(n_estimators=3)\n",
"ada_Boost.fit(X_train, y_train)\n",
"y_pred = ada_Boost.predict(X_test)\n",
" \n",
"accuracy = accuracy_score(y_test, y_pred)\n",
"print(\"Accuracy:\", accuracy)\n",
"plt_confusion_matrix(y_test, y_pred, iris.target_names, \"AdaBoostClassifier\")\n",
"plt.savefig(\"../assets/Q4_cm.png\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"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.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

Xet Storage Details

Size:
45.2 kB
·
Xet hash:
6cd97bedf55cbf5e3e1d5f89d4040495531764de7b1fd7f3deff21fef2b8125e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.