{"cells":[
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "#This code helps to find out feature multipliers for KNN.\n#This is shown using some features derived by me but this method can be extended for other features as well.\n#One needs to derive his own features and then apply similar approach to get the correct weights.\n\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom sklearn.linear_model import LogisticRegression\nlr = LogisticRegression()\n\nrecent_train = pd.read_csv(\"../input/train.csv\")\n\n#select a single x_y_grid at random\nrecent_train = recent_train[(recent_train[\"x\"]>4.5) &(recent_train[\"x\"]<5) &(recent_train[\"y\"]>2) &(recent_train[\"y\"]<2.3)]\n\n#derive some features\ndef time_trig(max_time):\n    time_array = np.linspace(0, 2*np.pi, max_time)\n    sin_values = np.sin(time_array)\n    cos_values = np.cos(time_array)\n    return (sin_values, cos_values)\ndef feature_engineering(df):\n    minute =(df[\"time\"]//5)%288\n    trig_arrays = time_trig(288)\n    df['minute_sin'] = trig_arrays[0][minute]\n    df['minute_cos'] = trig_arrays[1][minute]\n    del minute\n    day = (df['time']//1440)%365\n    trig_arrays = time_trig(365)\n    df['day_of_year_sin'] = trig_arrays[0][day]\n    df['day_of_year_cos'] = trig_arrays[1][day]\n    del day\n    weekday = (df['time']//1440)%7\n    trig_arrays = time_trig(7)\n    df['weekday_sin'] = trig_arrays[0][weekday]\n    df['weekday_cos'] = trig_arrays[1][weekday]\n    del weekday\n    df['month'] = (((df['time'])/43800)%12) * 2.4\n    df['year'] = (df['time']//525600).astype(float)\n    df.drop(['time'], axis=1, inplace=True)\n    df['accuracy'] = np.log10(df['accuracy']).astype(float)\n    return df\nrecent_train = feature_engineering(recent_train)\n\nprint(\"recent_train created\")"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "#creating arbitrary test\ntest = recent_train.sample(axis = 0,frac = 0.05)\nprint (\"selected_part and test created\")\nfeatures = ['x', 'y', 'minute_sin', 'minute_cos', 'accuracy',\n           'day_of_year_sin', 'day_of_year_cos', \n           'weekday_sin', 'weekday_cos', 'year']\n#fw = np.ones(len(features))\nfw = [ 1., 0.73704615, -0.04374113, -0.02376629, -0.02240783, -0.00821462,\n  0.00900225, -0.00434318, -0.01833968, -0.00208674]\nprint (len(test))"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "colname = str(features)\ntest[colname] = list\nindex = iter(test.index)\ntest[\"done\"] = 0\ncount = 0\nfinal_index = test.tail(1).index.values[0]\nfor i in index:\n    new_ld = pd.DataFrame(columns = features)\n    for j in range(15):\n        new_ld1 = abs(recent_train[features] - test.loc[i][features])\n        new_ld1 = new_ld1.drop(i)\n        new_ld1[\"target\"] = (recent_train[\"place_id\"] != test.loc[i][\"place_id\"]) + 0\n        new_ld1[\"x+y\"] = np.sum(new_ld1[features]*fw,axis = 1)#(new_ld1[\"x\"])+(new_ld1[\"y\"])#\n        new_ld1 = new_ld1.sort_values(\"x+y\")[0:50]\n        count += 1\n        if i != final_index:\n            i = next(index)\n        else:\n            continue\n        true = new_ld1[new_ld1[\"target\"] == 0]\n        false = new_ld1[new_ld1[\"target\"] != 0]\n        if (len(true)< 10) | (len(false)< 10):\n            continue\n        new_ld = new_ld.append(new_ld1)\n    if len(new_ld) > 0:\n        lr.fit(new_ld[features],new_ld[\"target\"])\n        test.set_value(i,colname,lr.coef_.ravel())\n        test.set_value(i,\"done\",1)\n        print (\"current status: sample number\",count) \n    else:\n        print(\"Failed at\", i)"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "#average or sum all the multipliers to get overall multiplier\nactual_test2 = test[test[\"done\"]==1]\nfinal_weights = np.zeros(len(fw))\nfor lists in actual_test2[colname]:\n    final_weights = final_weights + lists\n\n\nprint (features) \nprint (\"corresponding weights\")\nprint (final_weights/final_weights[0])"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": ""
 }
],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}}, "nbformat": 4, "nbformat_minor": 0}