{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","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"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Neural Networks with Scikit Learn","metadata":{}},{"cell_type":"markdown","source":"## 0. Upgrade Scikit-Learn","metadata":{}},{"cell_type":"code","source":"%%bash\n\npip install --upgrade scikit-learn","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:14:23.611348Z","iopub.execute_input":"2025-10-29T16:14:23.611689Z","iopub.status.idle":"2025-10-29T16:14:34.993309Z","shell.execute_reply.started":"2025-10-29T16:14:23.611663Z","shell.execute_reply":"2025-10-29T16:14:34.992284Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Loading the Data","metadata":{}},{"cell_type":"code","source":"import pathlib\n\n\nINPUT_DIR = pathlib.Path(\"/kaggle/input/digit-recognizer\")\nWORKING_DIR = pathlib.Path(\"/kaggle/working\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n\nTRAIN_DF = pd.read_csv(\n    INPUT_DIR / \"train.csv\",\n    dtype=np.uint8\n)\n\nTRAIN_FEATURES_DF = TRAIN_DF.drop(\"label\", axis=1)\nTRAIN_LABEL = TRAIN_DF.loc[:, \"label\"]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:15:53.781429Z","iopub.execute_input":"2025-10-29T16:15:53.781743Z","iopub.status.idle":"2025-10-29T16:15:57.121860Z","shell.execute_reply.started":"2025-10-29T16:15:53.781719Z","shell.execute_reply":"2025-10-29T16:15:57.120749Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. SGDClassifier","metadata":{}},{"cell_type":"code","source":"from sklearn import decomposition, linear_model, pipeline, preprocessing\n\n\nRANDOM_STATE = np.random.RandomState(42)\n\nCOMMON_CLASSIFIER_HYPERPARAMETERS = {\n    \"early_stopping\": True,\n    \"validation_fraction\": 0.1,\n    \"n_iter_no_change\": 10,\n    \"tol\": 1e-4,\n    \"random_state\": RANDOM_STATE\n}\n\n\nbenchmark_classifier = pipeline.make_pipeline(\n    preprocessing.StandardScaler(\n        with_mean=False\n    ),\n    decomposition.PCA(\n        n_components=0.95,\n        whiten=True,\n        random_state=RANDOM_STATE,\n    ),\n    linear_model.SGDClassifier(\n        loss=\"log_loss\",\n        **COMMON_CLASSIFIER_HYPERPARAMETERS\n    )\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:20:40.333963Z","iopub.execute_input":"2025-10-29T16:20:40.334741Z","iopub.status.idle":"2025-10-29T16:20:40.343027Z","shell.execute_reply.started":"2025-10-29T16:20:40.334708Z","shell.execute_reply":"2025-10-29T16:20:40.341776Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Training","metadata":{}},{"cell_type":"code","source":"_ = benchmark_classifier.fit(\n    TRAIN_FEATURES_DF,\n    TRAIN_LABEL\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:20:43.690500Z","iopub.execute_input":"2025-10-29T16:20:43.690850Z","iopub.status.idle":"2025-10-29T16:20:55.979026Z","shell.execute_reply.started":"2025-10-29T16:20:43.690819Z","shell.execute_reply":"2025-10-29T16:20:55.978122Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Evaluation","metadata":{}},{"cell_type":"code","source":"from sklearn import metrics\n\n\n_train_prediction = benchmark_classifier.predict(\n    TRAIN_FEATURES_DF\n)\n\n_report = metrics.classification_report(\n    TRAIN_LABEL,\n    _train_prediction\n)\nprint(_report)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:22:39.256874Z","iopub.execute_input":"2025-10-29T16:22:39.257216Z","iopub.status.idle":"2025-10-29T16:22:40.055508Z","shell.execute_reply.started":"2025-10-29T16:22:39.257191Z","shell.execute_reply":"2025-10-29T16:22:40.054041Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn import model_selection\n\n\n_cv_train_prediction = model_selection.cross_val_predict(\n    benchmark_classifier,\n    TRAIN_FEATURES_DF,\n    TRAIN_LABEL,\n    cv=5,\n    n_jobs=-1,\n)\n\n_report = metrics.classification_report(\n    TRAIN_LABEL,\n    _cv_train_prediction\n)\nprint(_report)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:24:20.092604Z","iopub.execute_input":"2025-10-29T16:24:20.092976Z","iopub.status.idle":"2025-10-29T16:24:50.352597Z","shell.execute_reply.started":"2025-10-29T16:24:20.092949Z","shell.execute_reply":"2025-10-29T16:24:50.351301Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. MLPClassifier","metadata":{}},{"cell_type":"code","source":"from sklearn import neural_network\n\n\nmlp_classifier = pipeline.make_pipeline(\n    preprocessing.MinMaxScaler(\n        feature_range=(-1, 1)\n    ),\n    neural_network.MLPClassifier(\n        hidden_layer_sizes=(100,),\n        activation=\"tanh\",\n        solver=\"sgd\",\n        batch_size=\"auto\",\n        shuffle=True,\n        max_iter=200,\n        verbose=True,\n        **COMMON_CLASSIFIER_HYPERPARAMETERS\n    )\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:28:57.100019Z","iopub.execute_input":"2025-10-29T16:28:57.100475Z","iopub.status.idle":"2025-10-29T16:28:57.107654Z","shell.execute_reply.started":"2025-10-29T16:28:57.100449Z","shell.execute_reply":"2025-10-29T16:28:57.106395Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Training","metadata":{}},{"cell_type":"code","source":"_ = mlp_classifier.fit(\n    TRAIN_FEATURES_DF,\n    TRAIN_LABEL\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:29:02.491148Z","iopub.execute_input":"2025-10-29T16:29:02.491502Z","iopub.status.idle":"2025-10-29T16:30:31.713342Z","shell.execute_reply.started":"2025-10-29T16:29:02.491477Z","shell.execute_reply":"2025-10-29T16:30:31.711904Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Evaluation","metadata":{}},{"cell_type":"code","source":"_train_prediction = mlp_classifier.predict(\n    TRAIN_FEATURES_DF\n)\n\n_report = metrics.classification_report(\n    TRAIN_LABEL,\n    _train_prediction\n)\nprint(_report)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:30:36.611588Z","iopub.execute_input":"2025-10-29T16:30:36.612790Z","iopub.status.idle":"2025-10-29T16:30:37.086333Z","shell.execute_reply.started":"2025-10-29T16:30:36.612752Z","shell.execute_reply":"2025-10-29T16:30:37.085061Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# disable verbose prior to CV\n_ = mlp_classifier[-1].set_params(verbose=False)\n\n_cv_train_prediction = model_selection.cross_val_predict(\n    mlp_classifier,\n    TRAIN_FEATURES_DF,\n    TRAIN_LABEL,\n    cv=5,\n    n_jobs=-1,\n)\n\n_report = metrics.classification_report(\n    TRAIN_LABEL,\n    _cv_train_prediction\n)\nprint(_report)","metadata":{"trusted":true,"execution":{"iopub.status.idle":"2025-10-29T16:44:15.543369Z","shell.execute_reply.started":"2025-10-29T16:39:19.816490Z","shell.execute_reply":"2025-10-29T16:44:15.542078Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Submit Predictions","metadata":{}},{"cell_type":"code","source":"TEST_FEATURES_DF = pd.read_csv(\n    INPUT_DIR / \"test.csv\",\n    dtype=np.uint8,\n)\n\n_test_predictions = mlp_classifier.predict(TEST_FEATURES_DF)\n\n_ = (\n    pd.read_csv(\n        INPUT_DIR / \"sample_submission.csv\",\n        index_col=\"ImageId\"\n    ).assign(\n        Label=_test_predictions\n    ).to_csv(\"submission.csv\", index=True)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:44:17.726997Z","iopub.execute_input":"2025-10-29T16:44:17.728175Z","iopub.status.idle":"2025-10-29T16:44:19.201511Z","shell.execute_reply.started":"2025-10-29T16:44:17.728126Z","shell.execute_reply":"2025-10-29T16:44:19.200287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%bash\n\ncat submission.csv | head -n 5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-29T16:44:19.202462Z","iopub.execute_input":"2025-10-29T16:44:19.202836Z","iopub.status.idle":"2025-10-29T16:44:19.216574Z","shell.execute_reply.started":"2025-10-29T16:44:19.202783Z","shell.execute_reply":"2025-10-29T16:44:19.215119Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}