{"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.10.11"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Digit Recognizer\nLearn computer vision fundamentals with the famous MNIST data    \n\nData: https://www.kaggle.com/competitions/digit-recognizer/data","metadata":{}},{"cell_type":"markdown","source":"1. Load data and Preprocessing","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\nfrom sklearn.datasets import load_digits\nfrom sklearn.model_selection import train_test_split, GridSearchCV\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import PCA\nfrom sklearn.svm import SVC\nfrom sklearn.ensemble import RandomForestClassifier, VotingClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\ndigits = load_digits()\nX, y = digits.data, digits.target","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X,y, test_size= 0.2)\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Principal Component Analysis (PCA) reduce dimension","metadata":{}},{"cell_type":"code","source":"pca = PCA(n_components=0.95)\nX_train_pca = pca.fit_transform(X_train_scaled)\nX_test_pca = pca.transform(X_test_scaled)\n\npca_2d = PCA(n_components=2)\nX_train_pca_2d = pca_2d.fit_transform(X_train_scaled)\nX_test_pca_2d = pca_2d.transform(X_test_scaled)\n\nplt.figure()\nfor i in np.unique(y_train):\n    plt.scatter(X_train_pca_2d[y_train == i, 0], X_train_pca_2d[y_train == i, 1], label=i)\n\nplt.xlabel(\"PC 1\")\nplt.ylabel(\"PC 2\")\nplt.title(\"PCA 2D\")\nplt.legend(title=\"Digits\", loc=\"best\")\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Model Training and Grid Search","metadata":{}},{"cell_type":"code","source":"# svm\nsvm_params = {\"C\":[0.1,1,10], \"kernel\": [\"linear\", \"rbf\"]}\nsvm = SVC()\nsvm_grid = GridSearchCV(svm, svm_params, cv = 5)\nsvm_grid.fit(X_train_pca, y_train)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# rf\nrf_params = {\"n_estimators\": [50,100,200]}\nrf = RandomForestClassifier(random_state = 42)\nrf_grid = GridSearchCV(rf, rf_params, cv = 5)\nrf_grid.fit(X_train_pca, y_train)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# knn\nknn_params = {\"n_neighbors\": [3,5,7]}\nknn = KNeighborsClassifier()\nknn_grid = GridSearchCV(knn, knn_params, cv = 5)\nknn_grid.fit(X_train_pca, y_train)\n\n# best paramaters\nbest_svm = svm_grid.best_estimator_\nbest_rf = rf_grid.best_estimator_\nbest_knn = knn_grid.best_estimator_","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# voting classifier\nvoting_clf = VotingClassifier(\n    estimators=[('svm', best_svm), ('rf', best_rf), ('knn', best_knn)],\n    voting='hard'\n)\nvoting_clf.fit(X_train_pca, y_train)\ny_pred = voting_clf.predict(X_test_pca)\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# evaluate\n\ncm = confusion_matrix(y_test, y_pred)\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=digits.target_names)\ndisp.plot(cmap=plt.cm.Blues)\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"best svm params: {svm_grid.best_params_}\")\nprint(f\"best rf params: {rf_grid.best_params_}\")\nprint(f\"best knn params: {knn_grid.best_params_}\")\nprint(f\"voting classifier accuracy: {voting_clf.score(X_test_pca, y_test)}\")\n","metadata":{},"outputs":[],"execution_count":null}]}