{"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":"markdown","source":"This notebook uses machine learning (kNN) to predict the Open-Sky/Highway, Open-Sky/Tree-lined street, and Downtown  described in [this discussion](https://www.kaggle.com/c/google-smartphone-decimeter-challenge/discussion/245160) by hand labeling for training data.\nWe think that hand labels for training data are allowed, and there is no problem in using the labels obtained by machine learning with them, but what do you think, [@sohier](https://www.kaggle.com/sohier) ?","metadata":{}},{"cell_type":"markdown","source":"## Method\n1. Hand label on train ( [KML files for Train, Test, and Ground Truth](https://www.kaggle.com/c/google-smartphone-decimeter-challenge/discussion/245160) )\n1. Extract the value of latDeg and lngDeg per collectionName and predict it with KNeighborsClassifier","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom pathlib import Path\nfrom glob import glob\nfrom sklearn.neighbors import KNeighborsClassifier\n\n\n###READ DATA###\nBASE_DIR = Path('../input/google-smartphone-decimeter-challenge')\ntrain_base = pd.read_csv(BASE_DIR / 'baseline_locations_train.csv')\ntrain_base = train_base.sort_values([\n    \"collectionName\", \"phoneName\", \"millisSinceGpsEpoch\"\n]).reset_index(drop=True)\ntest_base = pd.read_csv(BASE_DIR / 'baseline_locations_test.csv')\ntest_base = test_base.sort_values([\n    \"collectionName\", \"phoneName\", \"millisSinceGpsEpoch\"\n]).reset_index(drop=True)\n\n\n\n###ADD AREA###\ntrain_base['area'] = train_base['collectionName'].map(lambda x: x.split('-')[4])\ntest_base['area'] = test_base['collectionName'].map(lambda x: x.split('-')[4])\n\n###TRAIN AREA TARGET!!!###\ntrain_name = np.array(\n    sorted(path.split('/')[-1] for path in glob(f'{BASE_DIR}/train/*')))\ntrain_highway = train_name[\n    np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]) - 1]\ntrain_tree = train_name[\n    np.array([22,23,25,26,28]) - 1]\ntrain_downtown = train_name[\n    np.array([24,27,29]) - 1]\n\ntrain_base['area_target'] = -1\ntrain_base.loc[train_base['collectionName'].isin(train_highway), 'area_target'] = 0\ntrain_base.loc[train_base['collectionName'].isin(train_tree), 'area_target'] = 1\ntrain_base.loc[train_base['collectionName'].isin(train_downtown), 'area_target'] = 2\n\n###TEST AREA TARGET!!!###\ntest_name = np.array(\n    sorted(path.split('/')[-1] for path in glob(f'{BASE_DIR}/test/*')))\ntest_highway = test_name[\n    np.array([1,2,3,4,5,6,7,8,9]) - 1]\ntest_tree = test_name[\n    np.array([10,11,12,13,14,16,17,18]) - 1]\ntest_downtown = test_name[\n    np.array([15,19]) - 1]\n\ntest_base.loc[test_base['collectionName'].isin(test_highway), 'area_target'] = 0\ntest_base.loc[test_base['collectionName'].isin(test_tree), 'area_target'] = 1\ntest_base.loc[test_base['collectionName'].isin(test_downtown), 'area_target'] = 2\n\n\n###PREDICT DOWNTOWN###\ndef processing_downtown(input_df: pd.DataFrame):\n    output_df = input_df.groupby('collectionName')[['latDeg', 'lngDeg']].std()\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')[['area_target']].first(),\n        on='collectionName')\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')['area'].first(),\n        on='collectionName')\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')['phoneName'].unique().apply(list),\n        on='collectionName')\n    return output_df\n\ntrain = processing_downtown(train_base)\ntest = processing_downtown(test_base)\ntrain['downtown_target'] = (train['area_target']==2).astype(int)\n\nmodel_knn = KNeighborsClassifier(n_neighbors=1)\nmodel_knn.fit(\n    train[['latDeg', 'lngDeg']],\n    train['downtown_target'])\n\ndowntown_pred = model_knn.predict(test[['latDeg', 'lngDeg']])\n\n\n###PREDICT HIGHWAY & TREE###\ndef processing_highway_tree(input_df: pd.DataFrame):\n    output_df = input_df.groupby('collectionName')[['latDeg', 'lngDeg']].min()\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')[['area_target']].first(),\n        on='collectionName')\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')['area'].first(),\n        on='collectionName')\n    output_df = output_df.merge(\n        input_df.groupby('collectionName')['phoneName'].unique().apply(list),\n        on='collectionName')\n    return output_df\n\ntrain = processing_highway_tree(train_base)\ntest = processing_highway_tree(test_base)\ntest.loc[downtown_pred==1, 'area_pred'] = 2\n\nmodel_knn = KNeighborsClassifier(n_neighbors=1)\nmodel_knn.fit(\n    train.loc[train['area_target']!=2, ['latDeg', 'lngDeg']],\n    train.loc[train['area_target']!=2, 'area_target'])\n\npred = model_knn.predict(\n    test.loc[test['area_pred'].isnull(), ['latDeg', 'lngDeg']])\ntest.loc[test['area_pred'].isnull(), 'area_pred'] = pred\n\ntest[['area_pred', 'area_target']] = test[['area_pred', 'area_target']].astype(int)\ntest = test[['latDeg', 'lngDeg', 'area', 'phoneName', 'area_pred', 'area_target']]\ntest # 100% !!!","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-30T14:58:37.783692Z","iopub.execute_input":"2021-07-30T14:58:37.784303Z","iopub.status.idle":"2021-07-30T14:58:40.701539Z","shell.execute_reply.started":"2021-07-30T14:58:37.784191Z","shell.execute_reply":"2021-07-30T14:58:40.700681Z"},"trusted":true},"execution_count":null,"outputs":[]}]}