{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\n\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.preprocessing import scale\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.model_selection import GridSearchCV","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-13T22:27:26.209290Z","iopub.execute_input":"2023-11-13T22:27:26.209620Z","iopub.status.idle":"2023-11-13T22:27:26.214626Z","shell.execute_reply.started":"2023-11-13T22:27:26.209595Z","shell.execute_reply":"2023-11-13T22:27:26.213692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EnableGridSearch = False\nUseRF = False\nUseSVC = False\nUseKNC = True","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:26.233587Z","iopub.execute_input":"2023-11-13T22:27:26.234206Z","iopub.status.idle":"2023-11-13T22:27:26.238699Z","shell.execute_reply.started":"2023-11-13T22:27:26.234169Z","shell.execute_reply":"2023-11-13T22:27:26.237982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trd = pd.read_csv('../input/digit-recognizer/train.csv')\ntsd = pd.read_csv('../input/digit-recognizer/test.csv')\ntd = pd.concat([trd, tsd], ignore_index=True, sort  = False)","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-11-13T22:27:26.264223Z","iopub.execute_input":"2023-11-13T22:27:26.264908Z","iopub.status.idle":"2023-11-13T22:27:28.872644Z","shell.execute_reply.started":"2023-11-13T22:27:26.264854Z","shell.execute_reply":"2023-11-13T22:27:28.871935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Исследование данных","metadata":{}},{"cell_type":"code","source":"display(td)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:28.874298Z","iopub.execute_input":"2023-11-13T22:27:28.874776Z","iopub.status.idle":"2023-11-13T22:27:28.901396Z","shell.execute_reply.started":"2023-11-13T22:27:28.874747Z","shell.execute_reply":"2023-11-13T22:27:28.899998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"td.info()","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-11-13T22:27:28.902748Z","iopub.execute_input":"2023-11-13T22:27:28.903174Z","iopub.status.idle":"2023-11-13T22:27:28.945072Z","shell.execute_reply.started":"2023-11-13T22:27:28.903134Z","shell.execute_reply":"2023-11-13T22:27:28.944091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"td.nunique()","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-11-13T22:27:28.947672Z","iopub.execute_input":"2023-11-13T22:27:28.948313Z","iopub.status.idle":"2023-11-13T22:27:29.218629Z","shell.execute_reply.started":"2023-11-13T22:27:28.948260Z","shell.execute_reply":"2023-11-13T22:27:29.217688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Функции для преобразования данных","metadata":{}},{"cell_type":"code","source":"def dropColumns(df, min_spread):\n    ret = df.copy()\n    dropping = []\n    for name, values in ret.items():\n        if ((values.max() - values.min()) <= min_spread):\n            dropping.append(name)\n    if dropping.__contains__('label'):\n        dropping.remove('label')\n    ret.drop(columns = dropping, axis = 1, inplace = True)\n    return ret","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.219794Z","iopub.execute_input":"2023-11-13T22:27:29.220135Z","iopub.status.idle":"2023-11-13T22:27:29.227430Z","shell.execute_reply.started":"2023-11-13T22:27:29.220112Z","shell.execute_reply":"2023-11-13T22:27:29.226360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def getTrainData(df, test_size, normalizeData = False, scaleData = False):\n    train_data = df.copy()\n    train_data = train_data.dropna()\n    labelInt = train_data.label.astype(int)\n    train_data = train_data.drop('label', axis = 1)\n    train_data.insert(loc = 0, column = 'label', value = labelInt)\n    X  = train_data.drop(['label'], axis = 1)\n    y = train_data['label']\n    \n    if normalizeData:\n        X = X / 255.0\n    if scaleData:\n        X = scale(X)\n    \n    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = test_size)\n    return x_train, x_test, y_train, y_test","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.228754Z","iopub.execute_input":"2023-11-13T22:27:29.229394Z","iopub.status.idle":"2023-11-13T22:27:29.239584Z","shell.execute_reply.started":"2023-11-13T22:27:29.229364Z","shell.execute_reply":"2023-11-13T22:27:29.238953Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Функции для выбора и обучения модели","metadata":{}},{"cell_type":"code","source":"def getBestModel(df, test_size, model, params, normalizeData = False, scaleData = False):\n    x_train, x_test, y_train, y_test = getTrainData(df, test_size, normalizeData, scaleData)\n    GS = GridSearchCV(estimator = model,\n                      param_grid = params,\n                      cv = 4,\n                      n_jobs = -1,\n                      verbose = 1,\n                      scoring = \"accuracy\")\n    GS.fit(x_train,y_train)\n    return GS.best_estimator_","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.240802Z","iopub.execute_input":"2023-11-13T22:27:29.241179Z","iopub.status.idle":"2023-11-13T22:27:29.252768Z","shell.execute_reply.started":"2023-11-13T22:27:29.241149Z","shell.execute_reply":"2023-11-13T22:27:29.252177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def trainModel(df, model, test_size, normalizeData = False, scaleData = False):\n    x_train, x_test, y_train, y_test = getTrainData(df, test_size, normalizeData, scaleData)\n    model.fit(x_train,  np.ravel(y_train))\n    print('Score: ', model.score(x_test, y_test))\n    y_pred = model.predict(x_test)\n    print(confusion_matrix(y_test, y_pred), \"\\n\")","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.254073Z","iopub.execute_input":"2023-11-13T22:27:29.254672Z","iopub.status.idle":"2023-11-13T22:27:29.262700Z","shell.execute_reply.started":"2023-11-13T22:27:29.254642Z","shell.execute_reply":"2023-11-13T22:27:29.262114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Random Forest","metadata":{}},{"cell_type":"code","source":"if EnableGridSearch and UseRF:\n    df = dropColumns(td, 70)\n    RF = RandomForestClassifier(n_jobs = -1)\n    params = {'n_estimators': [150, 200, 250]}\n    RF = getBestModel(df, 0.1, RF, params, False, False)\nelif UseRF:\n    RF = RandomForestClassifier(n_estimators = 200, n_jobs = -1)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.263795Z","iopub.execute_input":"2023-11-13T22:27:29.264303Z","iopub.status.idle":"2023-11-13T22:27:29.273785Z","shell.execute_reply.started":"2023-11-13T22:27:29.264274Z","shell.execute_reply":"2023-11-13T22:27:29.272486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if UseRF:\n    df = dropColumns(td, 50)\n    trainModel(df, RF, 0.1, False, False)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.277299Z","iopub.execute_input":"2023-11-13T22:27:29.277572Z","iopub.status.idle":"2023-11-13T22:27:29.283492Z","shell.execute_reply.started":"2023-11-13T22:27:29.277549Z","shell.execute_reply":"2023-11-13T22:27:29.282879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# SVC","metadata":{}},{"cell_type":"code","source":"if EnableGridSearch and UseSVC:\n    df = dropColumns(td, 50)\n    SVM = SVC()\n    params = [ {'gamma': [1e-2, 1e-3, 1e-4],'C': [0.5,1,1.5]}]\n    SVM = getBestModel(df, 0.1, SVM, params, False, True)\nelif UseSVC:\n    SVM = SVC()","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.284732Z","iopub.execute_input":"2023-11-13T22:27:29.285265Z","iopub.status.idle":"2023-11-13T22:27:29.292542Z","shell.execute_reply.started":"2023-11-13T22:27:29.285218Z","shell.execute_reply":"2023-11-13T22:27:29.291929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if UseSVC:\n    df = dropColumns(td, 50)\n    trainModel(df, SVM, 0.1, False, True)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.293596Z","iopub.execute_input":"2023-11-13T22:27:29.294163Z","iopub.status.idle":"2023-11-13T22:27:29.306535Z","shell.execute_reply.started":"2023-11-13T22:27:29.294133Z","shell.execute_reply":"2023-11-13T22:27:29.305558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Nearest Neighbors","metadata":{}},{"cell_type":"code","source":"if EnableGridSearch and UseKNC:\n    df = dropColumns(td, 30)\n    KNC = KNeighborsClassifier(n_jobs = -1)\n    params = { 'n_neighbors': [2, 3, 4, 5] }\n    KNC = getBestModel(df, 0.1, KNC, params, False, False)\nelif UseKNC:\n    KNC = KNeighborsClassifier(n_jobs = -1, n_neighbors = 3)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.307878Z","iopub.execute_input":"2023-11-13T22:27:29.309328Z","iopub.status.idle":"2023-11-13T22:27:29.316975Z","shell.execute_reply.started":"2023-11-13T22:27:29.309211Z","shell.execute_reply":"2023-11-13T22:27:29.316232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if UseKNC:\n    df = dropColumns(td, 30)\n    trainModel(df, KNC, 0.1, False, False)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:29.317954Z","iopub.execute_input":"2023-11-13T22:27:29.318256Z","iopub.status.idle":"2023-11-13T22:27:40.981448Z","shell.execute_reply.started":"2023-11-13T22:27:29.318222Z","shell.execute_reply":"2023-11-13T22:27:40.980438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if UseKNC:\n    X_predict = df[df.label.isnull()]\n    X_predict = X_predict.drop(['label'], axis = 1)\n    result = KNC.predict(X_predict)\n    result = pd.Series(result, name = \"Label\")\n    submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),result],axis = 1)\n    submission.Label = submission.Label.astype(int)\n    submission.to_csv(\"submission.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2023-11-13T22:27:40.982804Z","iopub.execute_input":"2023-11-13T22:27:40.983162Z","iopub.status.idle":"2023-11-13T22:28:17.930692Z","shell.execute_reply.started":"2023-11-13T22:27:40.983134Z","shell.execute_reply":"2023-11-13T22:28:17.929677Z"},"trusted":true},"execution_count":null,"outputs":[]}]}