{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30839,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom sklearn.decomposition import PCA\nimport tensorflow as tf\nfrom tensorflow import keras\n\n# Load and Preprocess Data\ndef load_and_preprocess_data():\n    # Simulated data loading - replace with actual Kaggle dataset path\n    train_data = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\n    X = train_data.drop('label', axis=1).values\n    y = train_data['label'].values\n\n    # Normalize pixel values\n    X = X / 255.0\n\n    # Split data\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n    return X_train, X_test, y_train, y_test\n\n# Gradient Descent Variants\nclass GradientDescentVariants:\n    @staticmethod\n    def stochastic_gradient_descent(X, y, X_test, y_test):\n        # Use SGDClassifier for Stochastic Gradient Descent\n        sgd_clf = SGDClassifier(loss='log_loss', max_iter=1000, tol=1e-3, random_state=42)\n        sgd_clf.fit(X, y)\n        return sgd_clf.score(X_test, y_test)\n\n    @staticmethod\n    def batch_gradient_descent(X, y, X_test, y_test):\n        # Use SGDClassifier with large batch size\n        batch_clf = SGDClassifier(loss='log_loss', max_iter=1000, tol=1e-3, random_state=42,\n                                  learning_rate='constant', eta0=0.01)\n        batch_clf.fit(X, y)\n        return batch_clf.score(X_test, y_test)\n\n    @staticmethod\n    def mini_batch_gradient_descent(X, y, X_test, y_test):\n        # Use SGDClassifier with default mini-batch behavior\n        mini_batch_clf = SGDClassifier(loss='log_loss', max_iter=1000, tol=1e-3, random_state=42)\n        mini_batch_clf.fit(X, y)\n        return mini_batch_clf.score(X_test, y_test)\n\n# Model Comparison Class\nclass DigitRecognizerModelComparison:\n    def __init__(self, X_train, X_test, y_train, y_test):\n        self.X_train = X_train\n        self.X_test = X_test\n        self.y_train = y_train\n        self.y_test = y_test\n        self.results = {}\n\n    def gradient_descent_comparisons(self):\n        # Compare different gradient descent approaches\n        self.results['SGD (Stochastic)'] = GradientDescentVariants.stochastic_gradient_descent(\n            self.X_train, self.y_train, self.X_test, self.y_test)\n\n        self.results['SGD (Batch)'] = GradientDescentVariants.batch_gradient_descent(\n            self.X_train, self.y_train, self.X_test, self.y_test)\n\n        self.results['SGD (Mini-Batch)'] = GradientDescentVariants.mini_batch_gradient_descent(\n            self.X_train, self.y_train, self.X_test, self.y_test)\n\n    def neural_network_models(self):\n        # Multi-layer Perceptron\n        mlp = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=1000, random_state=42)\n        mlp.fit(self.X_train, self.y_train)\n        self.results['Neural Network (MLP)'] = mlp.score(self.X_test, self.y_test)\n\n        # TensorFlow/Keras Neural Network\n        model = keras.Sequential([\n            keras.layers.Dense(128, activation='relu', input_shape=(self.X_train.shape[1],)),\n            keras.layers.Dense(64, activation='relu'),\n            keras.layers.Dense(10, activation='softmax')\n        ])\n        model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n        model.fit(self.X_train, self.y_train, epochs=10, batch_size=32, verbose=0)\n        _, keras_accuracy = model.evaluate(self.X_test, self.y_test, verbose=0)\n        self.results['Neural Network (Keras)'] = keras_accuracy\n\n    def support_vector_machines(self):\n        # SVM with different kernels\n        svm_rbf = SVC(kernel='rbf')\n        svm_rbf.fit(self.X_train, self.y_train)\n        self.results['SVM (RBF Kernel)'] = svm_rbf.score(self.X_test, self.y_test)\n\n        svm_linear = SVC(kernel='linear')\n        svm_linear.fit(self.X_train, self.y_train)\n        self.results['SVM (Linear Kernel)'] = svm_linear.score(self.X_test, self.y_test)\n\n    def visualize_results(self):\n        plt.figure(figsize=(10, 6))\n        plt.bar(list(self.results.keys()), list(self.results.values()))\n        plt.title('Model Accuracy Comparison')\n        plt.xlabel('Models')\n        plt.ylabel('Accuracy')\n        plt.xticks(rotation=45, ha='right')\n        plt.tight_layout()\n        plt.show()\n\n    def detailed_comparison(self):\n        # Print detailed results\n        print(\"Model Performance Comparison:\")\n        for model, accuracy in self.results.items():\n            print(f\"{model}: {accuracy * 100:.2f}%\")\n\n# Main Execution\ndef main():\n    X_train, X_test, y_train, y_test = load_and_preprocess_data()\n\n    # Dimensionality Reduction (Optional)\n    pca = PCA(n_components=100)\n    X_train_pca = pca.fit_transform(X_train)\n    X_test_pca = pca.transform(X_test)\n\n    # Model Comparison\n    comparison = DigitRecognizerModelComparison(X_train_pca, X_test_pca, y_train, y_test)\n    comparison.gradient_descent_comparisons()\n    comparison.neural_network_models()\n    comparison.support_vector_machines()\n\n    # Visualizations\n    comparison.visualize_results()\n    comparison.detailed_comparison()\n\nif __name__ == '__main__':\n    main()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-25T12:18:33.784256Z","iopub.execute_input":"2025-01-25T12:18:33.784529Z","iopub.status.idle":"2025-01-25T12:20:32.372455Z","shell.execute_reply.started":"2025-01-25T12:18:33.784504Z","shell.execute_reply":"2025-01-25T12:20:32.371276Z"}},"outputs":[],"execution_count":null}]}