{"cells":[
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "from __future__ import division\nimport string\nimport numpy as np\nfrom numpy.random import randn\nfrom pandas import Series, DataFrame\nimport pandas as pd\nimport csv\nimport os\nimport matplotlib\nimport matplotlib.pyplot as plt\nfrom scipy import stats\nimport time\nimport datetime\nfrom sklearn.ensemble import GradientBoostingClassifier\n%matplotlib inline\n\n        \nfile = open(\"../input/train.csv\")\nfout = open('subset_datatest.csv','w')\nn = 0\nfor line in file:\n    if n == 0:\n        fout.write(line)\n    if n <400000*5:\n        n +=1\n    elif 400000*5<=n <400000*10:\n        n +=1\n        fout.write(line)\n    else:\n        break\nfout.close()\nfile.close()\nfile = open(\"../input/train.csv\")\nfout = open('subset_datatrain.csv','w')\nn = 0\nfor line in file:\n    if n <400000*5:\n        n +=1\n        fout.write(line)\n    else:\n        break\nfout.close()\nfile.close()\n\n\nfeaturelist = ['user_id','user_location_city','orig_destination_distance','srch_destination_id','hotel_market','srch_ci']\nwhlist = ['user_id','user_location_city','orig_destination_distance','srch_destination_id','hotel_market','srch_ci','hotel_cluster']\n\n\ntrainpart = pd.read_csv('subset_datatrain.csv',na_values=['--  '],usecols = whlist)\ntraindata = trainpart[featurelist].fillna(0).values\ntrainpara = {'data':traindata,'feature_names':featurelist,'target':trainpart['hotel_cluster'].values,\n'target_names':np.arange(100)}\n\ntestpart = pd.read_csv('subset_datatest.csv',na_values=['--  '],usecols = featurelist)\ntestdata = testpart[featurelist].fillna(0).values\n\n\n\ntrainerror = []\n\ndef geterror(clf, test, truth):\n    precluster = clf.predict(test)\n    return (sum(precluster!=truth))/len(test)\n\n\n\n"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "featurelist = ['user_location_city','orig_destination_distance','srch_destination_id','hotel_market']\nwhlist = ['user_location_city','orig_destination_distance','srch_destination_id','hotel_market','hotel_cluster']\n\ntrainpart = pd.read_csv('subset_datatrain.csv',na_values=['--  '],usecols = whlist)\ntraindata = trainpart[featurelist].fillna(0).values\ntrainpara = {'data':traindata,'feature_names':featurelist,'target':trainpart['hotel_cluster'].values,\n'target_names':np.arange(100)}\n\ntestpart = pd.read_csv('subset_datatest.csv',na_values=['--  '],usecols = whlist)\ntestdata = testpart[featurelist].fillna(0).values"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "testerror = []\nfrom sklearn import tree\nDTclf = tree.DecisionTreeClassifier()\nEDTclf = tree.ExtraTreeClassifier()\nDTclf = DTclf.fit(trainpara['data'], trainpara['target'],)\nEDTclf = EDTclf.fit(trainpara['data'], trainpara['target'],)\n\n\nprecluster = DTclf.predict(traindata)\nerr  = (sum(precluster!=trainpart['hotel_cluster'].values))/len(traindata)\ntrainerror.append(err)\nprint(\"DTclf train error: {}\".format(err))\nprecluster = DTclf.predict(testdata)\nerr  = (sum(precluster!=testpart['hotel_cluster'].values))/len(testdata)\ntesterror.append(err)\nprint(\"DTclf test error: {}\".format(err))\n\n\nprecluster = EDTclf.predict(traindata)\nerr  = (sum(precluster!=trainpart['hotel_cluster'].values))/len(traindata)\ntrainerror.append(err)\nprint(\"EDTclf train error: {}\".format(err))\nprecluster = EDTclf.predict(testdata)\nerr  = (sum(precluster!=testpart['hotel_cluster'].values))/len(testdata)\ntesterror.append(err)\nprint(\"EDTclf test error: {}\".format(err))"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "from sklearn.ensemble import RandomForestClassifier\nRFclf = RandomForestClassifier(n_estimators=30,\n    max_depth=20, random_state=0).fit(traindata, trainpara['target'])\nprint('RFclf OK!')\ntesterror = []\n"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "testerror = []\nmn = divmod(len(traindata),40000)\nm = mn[0]\nn = mn[1]\nerr1 = 0\nerr2 = 0\nfor i in range(m+1):\n    if i<m:\n        a = RFclf.predict(testdata[(i*40000):(i+1)*40000,:])\n        b = RFclf.predict(traindata[(i*40000):(i+1)*40000,:])\n        err1 += (sum(a!=testpart['hotel_cluster'].values[(i*40000):(i+1)*40000]))/len(testdata)\n        err2 += (sum(b!=trainpart['hotel_cluster'].values[(i*40000):(i+1)*40000]))/len(traindata)\n    else:\n        a = RFclf.predict(testdata[(i*40000):len(testdata),:])\n        b = RFclf.predict(traindata[(i*40000):len(traindata),:])\n        err1 += (sum(a!=testpart['hotel_cluster'].values[(i*40000):len(testdata)]))/len(testdata)\n        err2 += (sum(b!=trainpart['hotel_cluster'].values[(i*40000):len(traindata)]))/len(traindata)\n\ntrainerror.append(err1)\nprint(\"RFclf test error: {}\".format(err1))\n\ntesterror.append(err2)\nprint(\"RFclf test error: {}\".format(err2))"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "mn = divmod(len(traindata),40000)\nm = mn[0]\nn = mn[1]\ntestpre = np.array([])\ntrainpre = np.array([])\nfor i in range(m+1):\n    if i<m:\n        testpre = np.hstack( (testpre,RFclf.predict(testdata[(i*40000):(i+1)*40000,:])) )\n        trainpre = np.hstack( (trainpre,RFclf.predict(traindata[(i*40000):(i+1)*40000,:])) )\n    else:\n        testpre = np.hstack( (testpre,RFclf.predict(testdata[(i*40000):len(testdata),:])) )\n        trainpre = np.hstack( (trainpre,RFclf.predict(traindata[(i*40000):len(traindata),:])) )\n"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "testerr = []\nclusnuma= []\ntrainerr = []\nclusnumb = []\nfor i in range(100):\n    if i%10 == 0:\n        print(\"cluster:{}\".format(i))\n    indexa = testpart['hotel_cluster'].values == i\n    tmpre = testpre[indexa]\n    clusnuma.append(len(tmpre))\n    testerr.append(sum(tmpre!=i)/ len(tmpre)) \n    indexb = trainpart['hotel_cluster'].values == i\n    tmpre = trainpre[indexb]\n    clusnumb.append(len(tmpre))\n    trainerr.append(sum(tmpre!=i)/ len(tmpre)) "
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "testerr = Series(testerr)\nclusnuma= Series(clusnuma)\ntrainerr = Series(trainerr)\nclusnumb = Series(clusnumb)\nfig=plt.figure(figsize=(20,10))\nax = fig.add_subplot(1,1,1)\nax.plot(testerr,'bo--')\nax.plot(trainerr,'ro--')"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "fig=plt.figure(figsize=(20,10))\nax = fig.add_subplot(1,1,1)\nax.plot(testerr,'bo--')\nax.plot(trainerr,'ro--')"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "\nmn = divmod(len(testdata),40000)\nm = mn[0]\nn = mn[1]\neventid = 0\nfor i in range(m+1):\n    clus = []\n    if i<m:\n        a = RFclf.predict(testdata[(i*40000):(i+1)*40000,:])\n        b=np.argsort(a)[:,-5:]\n        for ind in b:\n            clus = []\n            for ix in ind:\n                clus.append(str(ix))\n            out.write(str(eventid)+\",\"+\" \".join(clus)+\"\\n\")\n            eventid += 1\n    else:\n        a = RFclf.predict(testdata[(i*40000):len(testdata),:])\n        b=np.argsort(a)[:,-5:]\n        for ind in b:\n            clus = []\n            for ix in ind:\n                clus.append(str(ix))\n            out.write(str(eventid)+\",\"+\" \".join(clus)+\"\\n\")\n            eventid += 1\n\nprecluster = RFclf.predict(traindata)\nerr  = (sum(precluster!=trainpart['hotel_cluster'].values))/len(traindata)\ntrainerror.append(err)\nprint(\"RFclf test error: {}\".format(err))\n\nprecluster = RFclf.predict(testdata)\nerr  = (sum(precluster!=testpart['hotel_cluster'].values))/len(testdata)\ntesterror.append(err)\nprint(\"RFclf test error: {}\".format(err))"
 },
 {
  "cell_type": "code",
  "execution_count": null,
  "metadata": {
   "collapsed": false
  },
  "outputs": [],
  "source": "from sklearn.ensemble import GradientBoostingClassifier\ndef bicluster(i,j):\n    tix = np.array(trainpart['hotel_cluster'].values==i)+np.array(trainpart['hotel_cluster'].values==j)\n    tGBtraintarget = (trainpart['hotel_cluster'].values==i)*1\n    tGBpara = {'data':GBdata,'feature_names':featurelist,'target':tGBtraintarget,\n    'target_names':np.arange(100)}\n    tmp = tGBpara['target'][tix]\n    if sum(tmp==0)==0:\n        tmp[-1] = 0\n    tclf = GradientBoostingClassifier(n_estimators=20, learning_rate=1,\n    max_depth=2, random_state=0).fit(GBdata[tix], tmp)\n    return tclf\n\ndef oneclus(n):\n    if n<99:\n        return bicluster(n,n+1)\n    else:\n        return bicluster(n,0)\n    \ndef getvoter():\n    voterlist = []\n    for i in range(100):\n        accuracy = []\n        clflist = []\n        clf  = oneclus(i)\n        clflist.append(clf)\n        for j in range(100):\n            tix = np.array(testpart1['hotel_cluster'].values==i)+np.array(testpart1['hotel_cluster'].values==j)\n            accuracy.append( clf.score(testdata1[tix], 1*(testpart1['hotel_cluster'][tix].values==i)) )  \n            #must use a testdata that contains true clusters\n        accuracy = DataFrame([accuracy],index = ['accuracy']).T\n        clusix = accuracy.sort_values( by ='accuracy',ascending = True).index[:2]\n        tclf = clf\n        for ind in clusix:\n            tclf = bicluster(i,ind)    \n            clflist.append(tclf)\n        voterlist.append(clflist)\n    return voterlist\ndef GBvote(testdata,voterlist):\n    clusprob = []\n    now = datetime.datetime.now()\n    path = 'submission_GB_' + str(now.strftime(\"%Y-%m-%d-%H-%M\")) + '.csv'\n    out = open(path, \"w\")\n    out.write(\"id,hotel_cluster\\n\")\n    m = len(voterlist[0])\n    for i in range(100):\n#        print('1----'+str(i))\n        clflist = voterlist[i]\n        tmp = np.zeros([len(testdata),2])\n        for j in range(m):    #compute the probability given by evevey clf\n            clf = clflist[j]\n            tmp = tmp + clf.predict_proba(testdata)\n        tmp = tmp/m    \n        tmp = (tmp[:,1]>0.5)*tmp[:,1]    #total probability for belonging to cluster i\n        clusprob.append(tmp)\n    clusprob = np.array(clusprob)\n    for i in range(len(testdata)):\n#        if i%20000 == 0:\n#            print('2----'+str(i))\n        clus = []\n        a = clusprob[:,i]\n        b=np.argsort(a)[-5:]\n        #clusprob.drop(i,axis = 1)\n        for ind in b:\n            clus.append(str(ind))\n        out.write(str(i)+\",\"+\"\\t\".join(clus)+\"\\n\")"
 }
],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}}, "nbformat": 4, "nbformat_minor": 0}