{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom PIL import Image\nimport cv2\nfrom subprocess import check_output\n#from sklearn.neural_network import MLPClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nimport pprint\nfrom numpy import genfromtxt, savetxt\nimport csv\nimport time\nstart_time = round(time.time())\ntag = str(start_time)\n\ndef img_as_array(image_id, test_indicator, new_img_size):\n    # returns a 1-d numpy array\n    if not test_indicator:\n        imagepath = '../input/train_photos/'+str(image_id)+'.jpg'\n    else:\n        imagepath = '../input/test_photos/'+str(image_id)+'.jpg'\n    img = cv2.imread(imagepath)\n    resized_image = cv2.resize(img, new_img_size)\n    #print(resized_image.size)\n    resized_image = resized_image.reshape(3*new_img_size[0]*new_img_size[1])\n    more_features = other_features(resized_image,new_img_size)\n    avg = averages(resized_image,new_img_size)\n    tmp = np.append(resized_image,more_features)\n    return np.append(tmp,avg)\n\ndef averages(arr,img_size):\n    img = np.reshape(arr,(img_size[0],img_size[1],3))\n    uAvg = np.average(img,axis=0).tolist()\n    vAvg = np.average(img,axis=1).tolist()\n    wAvg = np.average(img,axis=2).tolist()\n    #print(len(uAvg),len(vAvg),len(wAvg))\n    out = []\n    for x in uAvg+vAvg+wAvg:\n        out += x\n    return np.array(out)\n        \ndef other_features(arr,img_size):\n    img = np.reshape(arr,(img_size[0],img_size[1],3))\n    u = np.sum(img,axis=0).tolist()\n    v = np.sum(img,axis=1).tolist()\n    w = np.sum(img,axis=2).tolist()\n    out = []\n    for x in u+v+w:\n        out += x\n    return np.array(out)\n\n\nprint('Reading data...')\ntrain_photos = pd.read_csv('../input/train_photo_to_biz_ids.csv')\ntrain_photos.sort_values(['business_id'],inplace=True)\ntrain_photos.set_index(['business_id'])\n\ntest_photos = pd.read_csv('../input/test_photo_to_biz.csv')\ntest_photos.sort_values(['business_id'],inplace=True)\ntest_photos.set_index(['business_id'])\n\ntrain = pd.read_csv(\"../input/train.csv\")\ntrain.sort_values(['business_id'],inplace=True)\ntrain.reset_index(drop=True)\nprint('number of training examples:',train.shape[0])\nprint('number of test examples:',len(set(test_photos['business_id'])))\nprint('Finished reading data...')\n\nprint('Reading/modifying images...')\nimg_size  = (20,20)\nimgs_per_loc = 1 # we only use one image for each restaurant\narr_size = 3*img_size[0]*img_size[1]\n\n\n"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"i = 0\nmax_images = 1200\nimgs_per_loc = 1\npLoc = -1\ncount = 0\nX = []\nXtest = []\narr = []\nY = []\nYpred = []\nlocs = []\nprint('\\tpreparing train data...')\nfor row in train_photos.itertuples():\n    image_id = row[1]\n    loc = row[2]\n    #print(row)\n    #print(loc,pLoc)\n    if loc == pLoc:\n        count += 1\n        if count < imgs_per_loc: #never satisfied\n            arr += list(img_as_array(image_id,False,img_size))    \n            #print(row(1))\n            i += 1\n        else:\n            continue\n    else:\n        if arr:\n            locs.append(loc)\n            X.append([int(x) for x in arr])\n            #print(loc,type(loc))\n            y_vals = train[train['business_id'] == loc]\n            y = [0]*9\n            for r in y_vals.itertuples():\n                try:\n                    for u in [int(x) for x in r[2].split(' ')]:\n                        y[u] = 1\n                except:\n                    print(r)\n            Y.append(y)\n            #print(len(X),len(Y))\n        #print(len(arr))\n        #print(arr)\n        pLoc = loc\n        arr = list(img_as_array(image_id,False,img_size))    \n        count = 1\n        i += 1\n\nprint('\\tpreparing test data...')\ntest_ids = []\nfor row in test_photos.itertuples():\n    image_id = row[1]\n    loc = row[2]\n    #print(row)\n    #print(loc,pLoc)\n    if loc == pLoc:\n        count += 1\n        if count < imgs_per_loc: #never satisfied\n            arr += list(img_as_array(image_id,True,img_size))    \n            #print(row(1))\n            i += 1\n        else:\n            continue\n    else:\n        if arr:\n            #locs.append(loc)\n            Xtest.append([int(x) for x in arr])\n            test_ids.append(loc)\n        pLoc = loc\n        arr = list(img_as_array(image_id,True,img_size))    \n        count = 1\n        i += 1\n\nprint(\"converting data...\")\nX = np.array(X)\nY = np.array(Y)\nXtest = np.array(Xtest)\nnum_classes = len(Y[1,:])\nclf = [None]*num_classes\n\nprint(X.shape)\nprint(Y.shape)\nprint(Xtest.shape)"},{"cell_type":"code","execution_count":null,"metadata":{"collapsed":false},"outputs":[],"source":"for i in range(num_classes):\n    print(\"creating classifier:\",i)\n    rf = RandomForestClassifier(n_estimators=300,max_depth=2*img_size[0],n_jobs=-1,oob_score=True,verbose=2,criterion=\"entropy\")\n    print(\"fitting classifier:\",i)\n    rf.fit(X, Y[:,i])\n    print(\"getting predictions for attribute:\",i)\n    y_pred = rf.predict(Xtest)\n    Ypred.append(y_pred)\nprint(\"preparing output...\")\nYpred = np.vstack(Ypred)\nYpred = np.transpose(Ypred)\nYpred = Ypred.tolist() #why not? it's only your own time you're wasting\nwith open(\"predictions_\"+tag+\".csv\", \"w\", newline='') as f:\n    writer = csv.writer(f)\n    writer.writerow(['business_id','labels'])\n    for i,r in enumerate(zip(test_ids,Ypred)):\n        output = ' '.join([str(j) if x > 0 else '' for j,x in enumerate(r[1])]).strip()\n        line = [r[0],output]\n        writer.writerow(line)\n"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":0}