{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "3505f1d1-44c4-1bf2-e108-a4d08901e4bc"
      },
      "source": [
        " "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "f53a90fb-2076-63d1-9118-53d507da373d"
      },
      "outputs": [],
      "source": [
        "from sklearn.ensemble import ExtraTreesRegressor\n",
        "from sklearn.metrics import mean_squared_error\n",
        "from multiprocessing import Pool, cpu_count\n",
        "from PIL import Image, ImageStat\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import glob, os\n",
        "\n",
        "def im_multi(path):\n",
        "    im_stats_im_ = Image.open(path)\n",
        "    return [path, {'Stats': ImageStat.Stat(im_stats_im_), 'Size': im_stats_im_.size}]\n",
        "\n",
        "def im_stats(im_stats_df):\n",
        "    im_stats_d = {}\n",
        "    p = Pool(cpu_count())\n",
        "    ret = p.map(im_multi, im_stats_df['path'])\n",
        "    for i in range(len(ret)):\n",
        "        im_stats_d[ret[i][0]] = ret[i][1]\n",
        "    im_stats_df['size_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Size'][0])\n",
        "    im_stats_df['size_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Size'][1])\n",
        "    print('size...')\n",
        "    im_stats_df['sum_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].sum[0])\n",
        "    im_stats_df['sum_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].sum[1])\n",
        "    im_stats_df['sum_2'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].sum[2])\n",
        "    print('sum...')\n",
        "    im_stats_df['mean_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].mean[0])\n",
        "    im_stats_df['mean_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].mean[1])\n",
        "    im_stats_df['mean_2'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].mean[2])\n",
        "    print('mean...')\n",
        "    im_stats_df['rms_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].rms[0])\n",
        "    im_stats_df['rms_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].rms[1])\n",
        "    im_stats_df['rms_2'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].rms[2])\n",
        "    print('var...')\n",
        "    im_stats_df['var_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].var[0])\n",
        "    im_stats_df['var_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].var[1])\n",
        "    im_stats_df['var_2'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].var[2])\n",
        "    print('stddev...')\n",
        "    im_stats_df['stddev_0'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].stddev[0])\n",
        "    im_stats_df['stddev_1'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].stddev[1])\n",
        "    im_stats_df['stddev_2'] = im_stats_df['path'].map(lambda x: im_stats_d[x]['Stats'].stddev[2])\n",
        "    print(len(im_stats_df))\n",
        "    #add fun features here\n",
        "    return im_stats_df\n",
        "\n",
        "train = pd.read_csv('../input/Train/train.csv')\n",
        "train['path'] = train.train_id.map(lambda x: '../input/Train/' + str(x) + '.jpg')\n",
        "train['dpath'] = train.train_id.map(lambda x: '../input/TrainDotted/' + str(x) + '.jpg')\n",
        "train = train[train.path.isin(glob.glob('../input/Train/*.jpg'))] #restrict\n",
        "test = pd.read_csv('../input/sample_submission.csv')\n",
        "test['path'] = test.test_id.map(lambda x: '../input/Test/' + str(x) + '.jpg')\n",
        "\n",
        "print(len(train),len(test))\n",
        "\n",
        "train = im_stats(train)\n",
        "#test = im_stats(test)\n",
        "\n",
        "colx = [c for c in train.columns if c not in ['train_id', 'path', 'dpath','adult_males', 'subadult_males', 'adult_females', 'juveniles', 'pups']]\n",
        "coly = ['adult_males', 'subadult_males', 'adult_females', 'juveniles', 'pups']\n",
        "\n",
        "dmean = train[colx].mean(axis=0)\n",
        "dmedian = train[colx].mean(axis=0)\n",
        "for c in colx:\n",
        "    test[c] = int((dmean[c] + dmedian[c]) / 2)\n",
        "    \n",
        "rfr = ExtraTreesRegressor(n_estimators=100, max_depth=6, n_jobs=-1, random_state=0, verbose=0)\n",
        "rfr.fit(train[colx], train[coly])\n",
        "print(mean_squared_error(train[coly], rfr.predict(train[colx]))**0.5)\n",
        "\n",
        "pred = pd.DataFrame(rfr.predict(test[colx])).astype(int)\n",
        "test[coly[0]] = pred[0]\n",
        "test[coly[1]] = pred[1]\n",
        "test[coly[2]] = pred[2]\n",
        "test[coly[3]] = pred[3]\n",
        "test[coly[4]] = pred[4]\n",
        "\n",
        "test[['test_id','adult_males', 'subadult_males', 'adult_females', 'juveniles', 'pups']].to_csv('z01_submission01.csv', index=False)\n",
        "\n",
        "img = glob.glob('../input/Train/*.jpg') + glob.glob('../input/TrainDotted/*.jpg')\n",
        "plt.rcParams['figure.figsize'] = (12.0, 10.0)\n",
        "for i in range(20):\n",
        "        plt.subplot(5, 4, i+1)\n",
        "        im = Image.open(img[i])\n",
        "        plt.imshow(im); plt.axis('off')\n",
        "        \n",
        "        \n",
        "        "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "3400a271-c270-4b70-111b-c6c90263d352"
      },
      "outputs": [],
      "source": [
        ""
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}