{
  "id": 6635,
  "title": "After Action Report",
  "url": "/competitions/facebook-recruiting-iii-keyword-extraction/discussion/6635",
  "author_name": "",
  "post_date": "2013-12-19T19:17:34.360Z",
  "votes": 1,
  "comment_count": 5,
  "views": 2460,
  "content": "<p>Thought I should share what my areas of improvement are and what happened with the methods I employed, in case, some of you find it helpful for the next time we have a recruiting competition:</p>\n<p>&nbsp;</p>\n<p>In summary, I couldn't get into the .40s and I think it comes from my using Porter Stemming which pruned a lot of coding terms important in driving significant variation to the tags from the training sample.&nbsp; I could've have traced the stemmed terms back to the original, but that would've have made my computing load even worse, so all that traceability info&nbsp;got lost.&nbsp; In addition to that, I used R. Admittiingly, I started this with the primary intention of &quot;trying&quot; R out to understand better any limitations with large data sets. Quickly, that intention became secondary as I wished I used a compiled language as the R issues became pretty clear (i.e. in-memory limitations, little support for distributed computing, bad hash performance over iterations, etc.) and my time investment became more than I originally wanted, but it was alreadly too late to throw away what I had already done.&nbsp; My path eventually had a speed limit that I simply couldn't overcome.</p>\n<p>Next time, I want to try using Erlang as I feel its native support for concurrency would have been much better and although its still interpreted, I believe, the concurrency of execution across several old laptops and logical cores would've have overcome the overhead of the interpreted layer.&nbsp;</p>\n<p>My computation was kept to basic rules and also the derivation of mutual information sample distributions between tags and terms which were clustered into 5 character clusters which&nbsp;provided&nbsp;the only method I used to score ranking.&nbsp; I didn't think using svms or even&nbsp;decision trees across 42K tags would be feasible&nbsp;with&nbsp;only a quad-core processor and&nbsp;only 8 G ram, although I had&nbsp;3 laptops to use.&nbsp;&nbsp;Also, keeping the algo to basic rules allows me to better chunk out tasks to&nbsp;Erlang&nbsp;workers, for next time.</p>\n<p>I'm really impressed with&nbsp;the&nbsp;many folks getting in the 60s and above.&nbsp; Any insights from you folks to the larger community would be very much appreciated and big THANKS to Facebook&nbsp;for&nbsp;continuing this trend of&nbsp;recruiting.&nbsp; This way of recruiting is a no-brainer.</p>\n<p>Peace Out Folks.</p>",
  "messages": [
    {
      "id": "36371",
      "postDate": "12/19/2013 19:17:34",
      "content": "<p>Thought I should share what my areas of improvement are and what happened with the methods I employed, in case, some of you find it helpful for the next time we have a recruiting competition:</p>\n<p>&nbsp;</p>\n<p>In summary, I couldn't get into the .40s and I think it comes from my using Porter Stemming which pruned a lot of coding terms important in driving significant variation to the tags from the training sample.&nbsp; I could've have traced the stemmed terms back to the original, but that would've have made my computing load even worse, so all that traceability info&nbsp;got lost.&nbsp; In addition to that, I used R. Admittiingly, I started this with the primary intention of &quot;trying&quot; R out to understand better any limitations with large data sets. Quickly, that intention became secondary as I wished I used a compiled language as the R issues became pretty clear (i.e. in-memory limitations, little support for distributed computing, bad hash performance over iterations, etc.) and my time investment became more than I originally wanted, but it was alreadly too late to throw away what I had already done.&nbsp; My path eventually had a speed limit that I simply couldn't overcome.</p>\n<p>Next time, I want to try using Erlang as I feel its native support for concurrency would have been much better and although its still interpreted, I believe, the concurrency of execution across several old laptops and logical cores would've have overcome the overhead of the interpreted layer.&nbsp;</p>\n<p>My computation was kept to basic rules and also the derivation of mutual information sample distributions between tags and terms which were clustered into 5 character clusters which&nbsp;provided&nbsp;the only method I used to score ranking.&nbsp; I didn't think using svms or even&nbsp;decision trees across 42K tags would be feasible&nbsp;with&nbsp;only a quad-core processor and&nbsp;only 8 G ram, although I had&nbsp;3 laptops to use.&nbsp;&nbsp;Also, keeping the algo to basic rules allows me to better chunk out tasks to&nbsp;Erlang&nbsp;workers, for next time.</p>\n<p>I'm really impressed with&nbsp;the&nbsp;many folks getting in the 60s and above.&nbsp; Any insights from you folks to the larger community would be very much appreciated and big THANKS to Facebook&nbsp;for&nbsp;continuing this trend of&nbsp;recruiting.&nbsp; This way of recruiting is a no-brainer.</p>\n<p>Peace Out Folks.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "36379",
      "postDate": "12/19/2013 20:18:36",
      "content": "<p>The best advice I can give is to read the forum. I'm sure you'll find the &quot;insight&quot; you seek.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "36394",
      "postDate": "12/20/2013 07:56:11",
      "content": "<p>@David Cho,</p>\n<p>Does your score of 0.40 include the use of the duplicates in training\\test?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "36403",
      "postDate": "12/20/2013 14:37:47",
      "content": "<p>Hi Rudi,</p>\n<p>Thanks for the suggestion and yes, I did account for the duplicates of which I became aware after reading the forum. &nbsp;I counted over 320K duplicates, but my score only jumped up to 39 from 26. &nbsp;I read bigger improvements from other folks, so my rules appear to have worked better on the duplicate records than the non-duplicates. &nbsp;I did spot-check my submission.</p>\n<p>Good luck to all.</p>\n<p>&nbsp;</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "36412",
      "postDate": "12/20/2013 16:27:03",
      "content": "<p>I started really basic by simply looking for popular(top 10 000 or so) tags in the title. I added some logic to join tokens like 'windows' and '8' and remove subtags where it seemed appropriate. This all got me a score of ~0.32. All done in C#. Runs in about an hour, no pre-processing required. I left it there.</p>\n<p>After hearing about the free lunch aka the duplicates, I got 0.69</p>\n<p>Did you rebuild\\retrain your model without using any of the duplicate data? And then at prediction time only use the model if the test case isn't part of the duplicate set?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "36420",
      "postDate": "12/20/2013 17:59:49",
      "content": "<p>Great job Rudi, hope you get a call from FB. &nbsp;My lessons learned were not to use R and not to use Porter Stemming. &nbsp;I think if I had used any other language even Visual Basic , I would've done much better, but I got invested in R, plus I felt I didn't have time. &nbsp;This kind of competition, mistakes are costly since my model did do some computation (i.e. mutual information distribution sampling between tags and 5 -char clusters) combined with basic rules, obviously different than yours. &nbsp;Once you chose a computation model, it's difficult to go back since R took forever to re-compute based on changes. &nbsp;Your predictions on the non-dups look pretty terrific based on &nbsp;your improvement using the dups. &nbsp;I'm not sure how I got such a dup bias before I knew about the dups, since I only had a fractional improvement below yours. So, I didn't re-train on a smaller training set, but I am with the side that argues more training data is never a bad thing. More data in general should always be more preferable than a more complicated data model, in my opinion.</p>\n<p>&nbsp;</p>\n<p>Good luck with your future data science goals.</p>",
      "rawMarkdown": "",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 36379,
      "author_name": "pvkooten",
      "author_url": "",
      "post_date": "12/19/2013 20:18:36",
      "content": "<p>The best advice I can give is to read the forum. I'm sure you'll find the &quot;insight&quot; you seek.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 36394,
      "author_name": "rudikruger",
      "author_url": "",
      "post_date": "12/20/2013 07:56:11",
      "content": "<p>@David Cho,</p>\n<p>Does your score of 0.40 include the use of the duplicates in training\\test?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 36403,
      "author_name": "davidcho0",
      "author_url": "",
      "post_date": "12/20/2013 14:37:47",
      "content": "<p>Hi Rudi,</p>\n<p>Thanks for the suggestion and yes, I did account for the duplicates of which I became aware after reading the forum. &nbsp;I counted over 320K duplicates, but my score only jumped up to 39 from 26. &nbsp;I read bigger improvements from other folks, so my rules appear to have worked better on the duplicate records than the non-duplicates. &nbsp;I did spot-check my submission.</p>\n<p>Good luck to all.</p>\n<p>&nbsp;</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 36412,
      "author_name": "rudikruger",
      "author_url": "",
      "post_date": "12/20/2013 16:27:03",
      "content": "<p>I started really basic by simply looking for popular(top 10 000 or so) tags in the title. I added some logic to join tokens like 'windows' and '8' and remove subtags where it seemed appropriate. This all got me a score of ~0.32. All done in C#. Runs in about an hour, no pre-processing required. I left it there.</p>\n<p>After hearing about the free lunch aka the duplicates, I got 0.69</p>\n<p>Did you rebuild\\retrain your model without using any of the duplicate data? And then at prediction time only use the model if the test case isn't part of the duplicate set?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 36420,
      "author_name": "davidcho0",
      "author_url": "",
      "post_date": "12/20/2013 17:59:49",
      "content": "<p>Great job Rudi, hope you get a call from FB. &nbsp;My lessons learned were not to use R and not to use Porter Stemming. &nbsp;I think if I had used any other language even Visual Basic , I would've done much better, but I got invested in R, plus I felt I didn't have time. &nbsp;This kind of competition, mistakes are costly since my model did do some computation (i.e. mutual information distribution sampling between tags and 5 -char clusters) combined with basic rules, obviously different than yours. &nbsp;Once you chose a computation model, it's difficult to go back since R took forever to re-compute based on changes. &nbsp;Your predictions on the non-dups look pretty terrific based on &nbsp;your improvement using the dups. &nbsp;I'm not sure how I got such a dup bias before I knew about the dups, since I only had a fractional improvement below yours. So, I didn't re-train on a smaller training set, but I am with the side that argues more training data is never a bad thing. More data in general should always be more preferable than a more complicated data model, in my opinion.</p>\n<p>&nbsp;</p>\n<p>Good luck with your future data science goals.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "36371": "",
    "36379": "",
    "36394": "",
    "36403": "",
    "36412": "",
    "36420": ""
  },
  "source": "meta"
}