{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "1d42dc1c-d83a-8809-abec-e191e67873fe"
      },
      "outputs": [],
      "source": [
        "# THis is a simple SGD classifier example\n",
        "# for details of SGD go to http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier\n",
        "import numpy as np\n",
        "from sklearn import linear_model\n",
        "import pandas as pd\n",
        "X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])\n",
        "Y = np.array([1, 1, 2, 2])\n",
        "linear_model.SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
        "        eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
        "        learning_rate='optimal', loss='log', n_iter=5, n_jobs=1,\n",
        "        penalty='l2', power_t=0.5, random_state=None, shuffle=True,\n",
        "        verbose=0, warm_start=False)\n",
        "\n",
        "clf.fit(X, Y)\n",
        "\n",
        "print(clf.predict([[0.8, 1]]))\n",
        "print(clf.predict([[-0.8, -1]]))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "4eed53ae-844b-b9f0-7de9-098b825dece5"
      },
      "outputs": [],
      "source": [
        "#This cell proves that all displayid in ClickTrain are in Events\n",
        "df_ct = pd.read_csv('~/outbrain_data/clicks_train.csv',usecols=['display_id'] )\n",
        "df_events = pd.read_csv('~/outbrain_data/events.csv' ,usecols=['display_id']  )\n",
        "\n",
        "X= pd.DataFrame(df_ct.display_id.unique())\n",
        "Y= pd.DataFrame(df_events.display_id.unique())\n",
        "Z= pd.DataFrame(X.isin(Y))\n",
        "Z[0].unique()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "1a541b3d-7c48-ee61-7b8b-41b8b7aa6dd7"
      },
      "outputs": [],
      "source": [
        "#This is a code from someone on Kaggle for a weak learner  to make prediction and create file in format for kaggle submission\n",
        "#The algorithm doesnt does not use any standard ML algorithm, just how often a particular ad was clicked\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "\n",
        "dtypes = {'ad_id': np.float32, 'clicked': np.int8}\n",
        "\n",
        "train = pd.read_csv(\"~/outbrain_data/clicks_train.csv\", usecols=['ad_id','clicked'], dtype=dtypes )\n",
        "\n",
        "ad_likelihood = train.groupby('ad_id').clicked.agg(['count','sum','mean']).reset_index()\n",
        "M = train.clicked.mean()\n",
        "print(M)\n",
        "del train\n",
        "\n",
        "ad_likelihood['likelihood'] = (ad_likelihood['sum'] + 12*M) / (12 + ad_likelihood['count'])\n",
        "\n",
        "test = pd.read_csv(\"~/outbrain_data/clicks_test.csv\")\n",
        "test = test.merge(ad_likelihood, how='left')\n",
        "test.likelihood.fillna(M, inplace=True)\n",
        "\n",
        "test.sort_values(['display_id','likelihood'], inplace=True, ascending=False)\n",
        "subm = test.groupby('display_id').ad_id.apply(lambda x: \" \".join(map(str,x))).reset_index()\n",
        "\n",
        "subm.to_csv(\"subm.csv\", index=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ee2fb1e6-b86f-4f9a-f07d-869f12b13191"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import gc\n",
        "from sklearn import linear_model\n",
        "import pandas as pd\n",
        "pc=pd.read_csv('~/outbrain_data/promoted_content.csv')\n",
        "df_ct = pd.read_csv('~/outbrain_data/clicks_train.csv')\n",
        "print(df_ct.size)\n",
        "print((pd.DataFrame(pc['document_id'].unique())).count())\n",
        "print(pc.size)\n",
        "M = df_ct.clicked.mean()\n",
        "pc.groupby('document_id',as_index=False).count()['advertiser_id'].unique()\n",
        "\n",
        "df_mrg=df_ct.merge(pc,on='ad_id' ,how='left')\n",
        "\n",
        "df_cmpg= df_mrg.groupby('campaign_id').clicked.agg(['count' ,'sum']).reset_index()\n",
        "df_cmpg['cmpg_Score']= (df_cmpg['sum'] + M) / (1 + df_cmpg['count'])\n",
        "df_cmpg=df_cmpg.drop('count',1)\n",
        "df_cmpg=df_cmpg.drop('sum',1)\n",
        "\n",
        "df_adv= df_mrg.groupby('advertiser_id').clicked.agg(['count' ,'sum']).reset_index()\n",
        "df_adv['adv_Score']= (df_adv['sum'] + M) / (1 + df_adv['count'])\n",
        "df_adv=df_adv.drop('count',1)\n",
        "df_adv=df_adv.drop('sum',1)\n",
        "df_adv\n",
        "\n",
        "pc=pc.merge(df_adv).merge(df_cmpg)\n",
        "pc=pc.drop('campaign_id',1)\n",
        "pc=pc.drop('advertiser_id',1)\n",
        "pc=pc.drop('document_id',1)\n",
        "\n",
        "X=df_ct.merge(pc)\n",
        "\n",
        "Y=np.array(X['clicked'])\n",
        "X= X.drop('clicked',1)\n",
        "X= X.drop('display_id',1)\n",
        "X= X.drop('ad_id',1)\n",
        "X=np.array (X)\n",
        "\n",
        "from sklearn import datasets\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.linear_model import SGDClassifier\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "from sklearn.cross_validation import KFold\n",
        "from sklearn.metrics import accuracy_score\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "\n",
        "X_test= pd.read_csv('~/outbrain_data/clicks_test.csv' )\n",
        "X_test=X_test.merge(pc,how='left')\n",
        "adv_score_mean = pc.adv_Score.mean()\n",
        "cmpg_score_mean = pc.cmpg_Score.mean()\n",
        "X_test.adv_Score.fillna(adv_score_mean, inplace=True)\n",
        "X_test.cmpg_Score.fillna(cmpg_score_mean, inplace=True)\n",
        "X_test= X_test.drop('display_id',1)\n",
        "X_test= X_test.drop('ad_id',1)\n",
        "X_test=np.array (X_test)\n",
        "\n",
        "reg=SGDClassifier(loss= 'log', penalty= 'l2')\n",
        "reg.fit(X,Y)\n",
        "a=accuracy_score(Y, reg.predict(X))\n",
        "print(a)\n",
        "output= reg.decision_function(X_test)\n",
        "plt.hist(output)   \n",
        "plt.show()\n",
        "\n",
        "output=pd.read_csv('~/outbrain_data/clicks_test.csv').merge(pd.DataFrame(output,columns=['prediction']), left_index=True,right_index=True)\n",
        "output.sort_values(['display_id','prediction'], inplace=True, ascending=False)\n",
        "subm = output.groupby('display_id').ad_id.apply(lambda x: \" \".join(map(str,x))).reset_index()\n",
        "\n",
        "subm.to_csv(\"subm_22_11_2016_21_45.csv\", index=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5bac780c-d421-f0ed-67f3-24e38bf3d6ad"
      },
      "outputs": [],
      "source": [
        "print(reg.coef_)\n",
        "print(reg.intercept_)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "7a47b71b-c07b-8e8a-7170-b0cdc82c8869"
      },
      "outputs": [],
      "source": [
        "output= reg.decision_function(X_test)\n",
        "\n",
        "output=pd.read_csv('clicks_test.csv').merge(pd.DataFrame(output,columns=['prediction']), left_index=True,right_index=True)\n",
        "output.sort_values(['display_id','prediction'], inplace=True, ascending=False)\n",
        "subm = output.groupby('display_id').ad_id.apply(lambda x: \" \".join(map(str,x))).reset_index()\n",
        "subm.to_csv(\"subm2.csv\", index=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e658150f-3006-3916-6ddb-db365aeeca3c"
      },
      "outputs": [],
      "source": [
        "\n",
        "X_test_orig= pd.read_csv('clicks_test.csv' )\n",
        "print(X_test_orig.size)\n",
        "\n",
        "X_test=X_test_orig.join(pc ,how='left',lsuffix='_left',rsuffix='_right')\n",
        "print(X_test.size)\n",
        "\n",
        "X_test= X_test.drop('display_id',1)\n",
        "X_test=X_test.drop('ad_id_left',1)\n",
        "X_test=X_test.drop('ad_id_right',1)\n",
        "print(X_test.size)\n",
        "\n",
        "X_test=np.array (X_test)\n",
        "\n",
        "output= reg.decision_function(X_test)\n",
        "output=pd.DataFrame(output,columns=['prediction'])\n",
        "print(output.size)\n",
        "\n",
        "\n",
        "output2=X_test_orig.join(output)\n",
        "print(output2.size)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "154ad0d1-6ae5-64fb-3e28-c185e334ddb5"
      },
      "outputs": [],
      "source": [
        "numFolds = 10\n",
        "kf = KFold(len(X), numFolds, shuffle=True)\n",
        "\n",
        "# These are \"Class objects\". For each Class, find the AUC through\n",
        "# 10 fold cross validation.\n",
        "Models = [LogisticRegression, SGDClassifier]\n",
        "params = [{}, {\"loss\": \"log\", \"penalty\": \"l2\"}]\n",
        "for param, Model in zip(params, Models):\n",
        "    total = 0\n",
        "    for train_indices, test_indices in kf:\n",
        "\n",
        "        train_X = X[train_indices, :]; train_Y = Y[train_indices]\n",
        "        test_X = X[test_indices, :]; test_Y = Y[test_indices]\n",
        "\n",
        "        reg = Model(**param)\n",
        "        reg.fit(train_X, train_Y)\n",
        "        predictions = reg.predict(test_X)\n",
        "        total += accuracy_score(test_Y, predictions)\n",
        "    accuracy = total / numFolds\n",
        "    print (\"Accuracy score of {0}: {1}\".format(Model.__name__, accuracy))\n"
      ]
    }
  ],
  "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.5.2"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}