{
  "id": 10178,
  "title": "Congrats Barisumog & Giulio",
  "url": "/competitions/avito-prohibited-content/discussion/10178",
  "author_name": "",
  "post_date": "2014-09-01T00:22:48.823Z",
  "votes": 4,
  "comment_count": 38,
  "views": 14978,
  "content": "<p>Congrats guys! You deserved it!!!</p>\n<p>Special congrats to Barisumog for becoming a Master!!!</p>\n<p>Looking forward to reading about your approach!</p>",
  "messages": [
    {
      "id": "52795",
      "postDate": "09/01/2014 00:22:48",
      "content": "<p>Congrats guys! You deserved it!!!</p>\n<p>Special congrats to Barisumog for becoming a Master!!!</p>\n<p>Looking forward to reading about your approach!</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52798",
      "postDate": "09/01/2014 00:31:07",
      "content": "<p>Congratulations!&nbsp;</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52800",
      "postDate": "09/01/2014 00:42:28",
      "content": "<p>Grats all. Grats to Abhishek for becoming top 10 Kaggler!</p>\n<p>And grats to Barisumog for becoming Master Kaggler. That's absolutely what that impressive profile deserved!</p>\n<p>Grats to my team members Phil Culliton and Jules, for reaching top 10 position together, and getting Master Kaggler status.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52802",
      "postDate": "09/01/2014 00:59:48",
      "content": "<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52806",
      "postDate": "09/01/2014 01:21:00",
      "content": "<p>Congrat winners! Congrat Barisumog with Master Tier!</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52807",
      "postDate": "09/01/2014 01:33:31",
      "content": "<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>Jules found two ways: train a VW model where the positive class is samples where is_blocked ==1 AND is_proved == 1.</p>\n<p>Also as part of an illicit score to use for (quantile) regression: Something like: is_blocked + 0.4*is_proved + close_hours_score.</p>\n<p>This improved ensembles where we simply averaged the ranks of the submission files.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52809",
      "postDate": "09/01/2014 02:33:55",
      "content": "<p>Congrat winners! It's a wonderful game,i also learned a lot,Thanks to the organizers</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52810",
      "postDate": "09/01/2014 02:41:44",
      "content": "<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>I trained two models, with all the blocked ads (mixed model) and only blocked ads labeled by experienced moderator (proved model). This improve my results by 0.001~0.002. My best private score is&nbsp;0.98589 which is simple averaging by 2 mixed models and 2 proved models of 2 different set of features.</p>\n<p>This is the first time I come so close to top3!</p>\n<p>Congrats to everyone! Congrats to&nbsp;Barisumog &amp; Giulio! Well done!</p>\n<p>Update:&nbsp;I&nbsp;initially entered this competition to familiarize myself with VW and Linux &amp; Shell (I used to be a Windows user).&nbsp;If anyone interested in how to get to 0.985x using VW, I have put all my code&nbsp;<a href=\"https://github.com/ChenglongChen/Kaggle_The_Hunt_for_Prohibited_Content\">here</a>.&nbsp;</p>\n<p>Finally, I would also&nbsp;want to thank&nbsp;@Triskelion and @Foxtrot for introducing me to VW :)</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52811",
      "postDate": "09/01/2014 02:51:14",
      "content": "<p>[quote=Triskelion;52807]</p>\n<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>Jules found two ways: train a VW model where the positive class is samples where is_blocked ==1 AND is_proved == 1.</p>\n<p>Also as part of an illicit score to use for (quantile) regression: Something like: is_blocked + 0.4*is_proved + close_hours_score.</p>\n<p>This improved ensembles where we simply averaged the ranks of the submission files.</p>\n<p>[/quote]</p>\n\n<p>Very interesting. Just curious, did you use VW exclusively for model building ? And, re: training for examples where is_blocked and is_blocked == 1, did you use any method to find this. Thanks.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52812",
      "postDate": "09/01/2014 02:58:03",
      "content": "<p>Great competition, lots of fun and awesome learning opportunity! Thanks Kaggle and Avito!</p>\n<p>I&#8217;ve got to first congratulate everyone who fought hard throughout this competition, other winners, top-10, and new Masters! Well done everyone!&nbsp;<br>As for the approach, I think that what we did will not come as a shocker to anyone.</p>\n<p>My model was essentially a series of SGD on pieces of the text data (one for title, one for description, one for title+description, one for attrs). This alone gets you around .97 on the public LB. By adding to the tfidf matrices one-hot-encoded category and subcategory the models score well above .97.<br>The outputs from all the SGDs were then fed into a tree model (RF worked better than GBM) along with some other features, most importantly category and subcategory, but also email, url and phone number counts. This piece really helped the model re-learn the differences among categories and subcategories and re-sort the original SGD predictions. This added another .002-3ish and takes you in .983 territory.<br>Since plain accuracy was so high across the dataset, semi-supervised test data added in the order of .003 to the train data alone bringing my best model around .986.<br>All of this was built on the entire data minus real estate, which barisimug found out could be removed not only without any loss, but with a sizeable increase in performance.</p>\n<p>I'll let barisumog describe his models but in his approach he modelled each category and subcategory independently, later stacking results.</p>\n<p>Our winner model is a simple rank based weighed average of my best RF&nbsp;andGBM, and barisumog's ensemble of SVMs.</p>\n<p>We used ranks to blend our models mostly because, from a practical perspective, our model outputs were on different scales (mine were probabilities, barisumog&#8217;s were distances from the SVM separating hyperplane). In reality I have observed that even amongst my models (who all produced probabilities) ranks were still as good as if not better than probabilities for blends.<br>My intuition, with no scientific evidence for it, is that when using semi-supervised learning you end up getting many extreme predictions for the test set, with lots of observations clustering around 1 and 0. That makes intuitive sense since you&#8217;re predicting observations the algorithm has already seen in training. With these big clusters of 1&#8217;s, .9995&#8217;s, .9993&#8217;s&#8230; ranking is introducing some (admittedly arbitrary) randomization, which might act as a good counterweight to the extreme decisiveness of semi-supervised approaches.</p>\n<p>Another surprising thing for me was the fact I was getting much less than in other competitions out of ensembles. It really took two very distinct approaches to get decent value out of our team ensemble. And that was also, the key to our success. I'm really curious to see what other approaches folks have come up with, but essentially we had two very good models covering two very different approaches.</p>\n<p><strong>Things that did not work for me</strong>:<br>-is_proven added no value to our models <br>-feature engineering has provided little to no value. I tried a bunch of features derived from text (i.e. count of !, ?, mixed words, length of text,...) and none seemed to add much.<br>-for the attributes feature, anything more fancy that running it through a tfidf added nothing.<br>-I tried a second level model where I&#8217;d take the top 20% observations and re-model those alone to see if it could help further minimize false positives. Even at different cutoffs, that did not help.</p>\n<p><strong>Things that did work for me</strong>:<br>-no need to do anything fancy with the russian text. Just feed it into a tfidf vectorizer and you&#8217;re already in better shape than the benchmark code.<br>-simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>One part of the competition that was a first, and very interesting for someone like me who enjoys the competitive aspect of Kaggle, was the strategic aspect of managing a high LB rank. This is where machine learning becomes strategic/competitive machine learning. :-)</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52813",
      "postDate": "09/01/2014 03:24:43",
      "content": "<p>Nice work. It sounds like my method&nbsp;was similar to bariusmog's approach.</p>\n\n<p>I used the title + description, and also just title on it's own and blended them together. For both of these I trained with all category data, then separated into single models by category, and also single models based on subcategory in order to get some sort of diversity.</p>\n\n<p>With combining in this way, it gave me an extra ~.002 &nbsp;above any on their own. I also used some semi-supervised learning with the test set, but it only gave me ~.001.&nbsp; I tried some feature engineering as well, but it gave little value.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52814",
      "postDate": "09/01/2014 04:08:08",
      "content": "<p>And congrats David T. on becoming&nbsp;Kaggle's new #2 overall. Seattle should be pretty proud these days :-)</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52815",
      "postDate": "09/01/2014 04:20:31",
      "content": "<p>My 2 cents on&nbsp;text features:</p>\n<p>Other than unigrams, bigrams were also helpful,&nbsp;but not trigrams.&nbsp;Stemming and correcting words didn't help.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52818",
      "postDate": "09/01/2014 04:49:24",
      "content": "<p>Congratulations to Giulio and Barisumog for winning this interesting competition! And for Abhishek for entering the top 10! Very interesting competition, after a long time I had to use VW again.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52820",
      "postDate": "09/01/2014 05:44:27",
      "content": "<p>Thank you all for the work done! We are carefully watching the competition process and the results are really impressive! We hope that the competition was interesting and honest. Now it's our turn to work hard to implement something like that in our production models...</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52824",
      "postDate": "09/01/2014 06:40:26",
      "content": "<p>Congrats winners! Congrat Barisumog for becoming&nbsp;Master!</p>\n<p>Congrats&nbsp;Abhishek&nbsp;for entering&nbsp;&nbsp;into&nbsp;the top 10!</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52825",
      "postDate": "09/01/2014 07:28:42",
      "content": "<p>I&#8217;ve got to congratulate everyone who&nbsp;participate and especially everyone who break 0.984 =)</p>\n<p>Our approach is quite similar to discribed by Giulio. We use different pieces of data (title, title+description, title+description+attrs, title+attrs) and made 3 levels of details for each (top100k word, all word, all pair of words). For all of this features-sets was trained SVM, for some - additional LibFM models. Solely they give 0.97 - 0.983.</p>\n<p>All this models was blended by RF, so it gave 0.986.</p>\n<p>[quote=Giulio;52812]</p>\n<p>simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>[/quote]</p>\n<p>Can you explain this in details?&nbsp;It is thing I want to learn! =)</p>\n<p>I've tried to use SSL, but got no profit.&nbsp;You predict whole test set, added it to the train, learn from concatenation and again&nbsp;predict test set?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52828",
      "postDate": "09/01/2014 08:38:48",
      "content": "<p>Congrats to everyone who fought hard to the end! And thanks to Kaggle and Avito, it was a fun competition.</p>\n<p>About my approach: I don't speak Russian, but running numerous data through Google translate, I could see that some categories used very different language than others. Also the ratio of illicit content varied widely between categories (and subcategories). So I decided to tackle the problem on a category / subcategory basis.</p>\n<p>This is what I did, in steps:</p>\n<ol>\n<li><span style=\"line-height: 1.4\">separate the raw data into categories and subcategories</span></li>\n<li><span style=\"line-height: 1.4\">ignore the Real Estate category and related subcategories (vastly different language than other categories, and very tiny ratio of illicit content)</span></li>\n<li><span style=\"line-height: 1.4\">extract</span><span style=\"line-height: 1.4\">&nbsp;raw text from each post by concatenating the title, description and attributes sections (We tried many other features, some worked for Giulio, but none for me. I used only textual features)</span></li>\n<li><span style=\"line-height: 1.4\">for each category and subcategory, create 3 tf-idf matrices: one with raw text, one with stemming, and one with stop words (separately, they gave similar results, but I noticed they improved the score a bit and became more stable when combined)</span></li>\n<li><span style=\"line-height: 1.4\">for each category and subcategory, train 2 sets of SVCs with different C parameters on each tf-idf (again, similar results separately, but</span><span style=\"line-height: 1.4\">&nbsp;slightly&nbsp;</span><span style=\"line-height: 1.4\">better when combined)</span></li>\n<li><span style=\"line-height: 1.4\">so now I have 2 x 3 SVCs for every category, and 2 x 3 SVCs for every subcategory (12 models to use for every data point)</span></li>\n<li><span style=\"line-height: 1.4\">apply semi-supervised learning, which was Giulio's idea and worked quite well. Use the trained models on test data to predict classes. Concatenate train+test, and labels+prediction. Retrain all models on this new merged data set.</span></li>\n<li><span style=\"line-height: 1.4\">finally, use the models to make predictions on the test data. use the SVC output of distance from hyperplane to rank the individual posts</span></li>\n</ol>\n<p>Then Giulio did some of his magic to combine my ranks with his own models. As he already pointed out, the difference of approach between our models resulted in a nice boost when ensembled.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52834",
      "postDate": "09/01/2014 11:44:21",
      "content": "<p>Thanks to the organisers and congrats to all the top finishers!</p>\n<p>Special congratulations to winners who avoided overfitting.</p>\n<p>&#1055;&#1086;&#1079;&#1076;&#1088;&#1072;&#1074;&#1083;&#1103;&#1102; &#1083;&#1091;&#1095;&#1096;&#1091;&#1102; &#1056;&#1086;&#1089;&#1089;&#1080;&#1081;&#1089;&#1082;&#1091;&#1102; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1091; &#1052;&#1080;&#1093;&#1072;&#1080;&#1083;&#1072; &#1080; &#1044;&#1084;&#1080;&#1090;&#1088;&#1080;&#1103;!&nbsp;&nbsp;</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52836",
      "postDate": "09/01/2014 12:14:22",
      "content": "<p>[quote=xbsd;52811]</p>\n<p>Very interesting. Just curious, did you use VW exclusively for model building ? And, re: training for examples where is_blocked and is_blocked == 1, did you use any method to find this. Thanks.</p>\n<p>[/quote]</p>\n<p>Yes. Single VW models gave around 97.7, with a lot of tuning single VW models became around 98. Averaging the ranks of a hinge and logloss model improved the score to well over 98, etc. Reading through yr's code (very well done on the VW!) it's possible to get a very high score with very little memory resources and time. So for us no elaborate complex GBM or RF models (though we very much would have used them if we managed or saw improvement).</p>\n<p>So for implementation, I think VW could be a solid and fast choice, with simple model introspection. But it's not like these models need retraining every minute, so more complex models are possible too.</p>\n<p>I believe Jules found that trick through a hunch. It makes sense that a model trained on different features/samples or labels will hold different information for an ensemble to use.</p>\n<p>Vowpal Wabbit eats Russian spam for breakfast. But just to make sure we latinized all Russian characters, so we could dream to avoid further encoding issues on Windows.</p>\n<p>The semi-supervised trick from Giulio is interesting. Makes perfect sense to try it out, but I was thinking about this for other competitions, not this one. I think it has its own risks associated with it (I call it over-learning).</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52837",
      "postDate": "09/01/2014 12:26:03",
      "content": "<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52838",
      "postDate": "09/01/2014 12:46:26",
      "content": "<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow, that is really good. Do I understand you correctly in that you did not use the text at all?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52841",
      "postDate": "09/01/2014 12:55:22",
      "content": "<p>[quote=Triskelion;52838]</p>\n<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow, that is really good. Do I understand you correctly in that you did not use the text at all?</p>\n<p>[/quote]</p>\n<p>I checked my&nbsp;feature generation code (several weeks ago), and yes sorry I forgot to mentioned the tokens in these 3 cols: title,description,attr. So yes I used this text tokens.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52843",
      "postDate": "09/01/2014 13:03:20",
      "content": "<p>I used vw exclusively, experimenting with the parameters, especially --passes and --decay_learning_rate. Surprisingly, the number of passes had a large effect, even with a very steep decay. For example, the difference between 15 and 16 passes, with the decay at 0.5, could be as much as .002. Also, the average variance between the LB and PB scores was about .002 and was quite erratic. My final two choices were my best LB model (.98461), which scored only .98200 on the PB, and an ensemble of 10 vw models, which scored .98404 on the LB and .98291 on the PB. My best PB score was the same ensemble, but mixed based on rank instead of raw scores, which scored .98431 on the PB but only .98317 on the LB.</p>\n<p>All in all, I had a great time learning about vw, which is an incredibly powerful and fast tool. It is difficult, however, to set up a robust cross-validation system with vw. For example, I found that the &nbsp;built-in stopping mechanism on passes tended to underestimate the optimal number of passes. For example, my models generally stopped after 8, or sometimes 9, passes, but I found that letting it run for 14-16 passes on the full data achieved better results. I didn't think to try semi-supervised learning and I wonder how that would work within the vw framework. Did anyone else try ss with vw?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52844",
      "postDate": "09/01/2014 13:11:13",
      "content": "<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52847",
      "postDate": "09/01/2014 13:17:57",
      "content": "<p>[quote=yr;52844]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>\n<p>[/quote]</p>\n<p>I did. It looks very promising (also with the results it got for KDD-cup 2012 Ad click prediction). Would love to see a benchmark in LibFM.</p>\n<p>Can't get it to build to hold more than 2GB of memory though, is 64-bit LibFM on Windows possible?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52848",
      "postDate": "09/01/2014 13:19:47",
      "content": "<p>[quote=yr;52844]</p>\n<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>\n<p>[/quote]</p>\n<p>yep - works on display ad challenge, one part of my solution there ;)</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52856",
      "postDate": "09/01/2014 14:53:37",
      "content": "<p>Congratulations to Giulio and Barisumog. After posting my solution I trained a separate model for each category, following sergiu's suggestion: 0.971 -&gt; 0.978.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52862",
      "postDate": "09/01/2014 16:13:45",
      "content": "<p>[quote=Mikhail Trofimov;52825]</p>\n<p>[quote=Giulio;52812]</p>\n<p>simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>[/quote]</p>\n<p>Can you explain this in details?&nbsp;It is thing I want to learn! =)</p>\n<p>I've tried to use SSL, but got no profit.&nbsp;You predict whole test set, added it to the train, learn from concatenation and again&nbsp;predict test set?</p>\n<p>[/quote]</p>\n<p>In my case I had a two stage model. In the first stage I used several SGD as initial predictions. I fed those into a RF. I used the RF to predict test (as in 0/1, not probabilities). I then stacked train and test, target and predictions and retrained on the whole set. That improved my RF from .982-ish to .9859.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52871",
      "postDate": "09/01/2014 17:47:20",
      "content": "<p>What were the engineered features like for everyone?</p>\n<p>title_char_length,&nbsp;body_char_length,&nbsp;category_count, sub_category_count,&nbsp;and numerous char frequencies.</p>\n<p>all seemed informative features.</p>\n<p>We tried building an RF model with no text tokens, but word_frequencies of words like: gun, pistol, knife, diploma, thesis, medical, m2, massage. This did ok for so few features ~80%.</p>\n<p>We got these words by studying duplicates or near-duplicates in test and train set. Could have been more gain there, as there where a lot of title-duplicates and even more near duplicates. Perhaps that is why KNN worked well on this challenge.</p>\n<p>Also dreamed about training opensource spamfilters like CRM114 on both train and test data, to generate features this way. Maybe another time.&nbsp;</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>I am a bit bummed I could not understand Russian, and had to rely on translate. What were the funny illicit advertisements you found in the dataset? I think I saw some&nbsp;military equipment advertised like sniper rifles and war medals.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52873",
      "postDate": "09/01/2014 18:04:50",
      "content": "<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>Top:</p>\n<p>id<br>99997125<br>99996057<br>99994331<br>99989755<br>99989702<br>99983497<br>99982520<br>99981089<br>99975380<br>99974721<br>99962972<br>Bottom:</p>\n<p>10000998<br>10000962<br>10000930<br>10000831<br>10000816<br>10000612<br>10000395<br>10000387<br>10000196<br>10000175<br>10000124<br>10000074</p>\n<p>with public LB:&nbsp;0.97625 and private LB: 0.97812. It is generated when I used squared loss in VW but with -p arg for prediction.</p>\n<p>With -r arg instead, the corresponding (corrected) version yields&nbsp;public LB: 0.98104 and private LB:&nbsp;0.97953 (The second attachment with &quot;r&quot;). Not that different.&nbsp;I am curious why it is so.&nbsp;</p>\n<p>Edited: Upload the file twice... Pls ignore the .rar file.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52874",
      "postDate": "09/01/2014 18:26:24",
      "content": "<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52875",
      "postDate": "09/01/2014 18:28:50",
      "content": "<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52877",
      "postDate": "09/01/2014 19:01:05",
      "content": "<p>[quote=Triskelion;52875]</p>\n<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>\n<p>[/quote]</p>\n<p>I just checked my own rankings, and also the combined rankings with Giulio, but I can't see a similar pattern. The first digits of the top 1000 seem pretty random.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52878",
      "postDate": "09/01/2014 19:06:50",
      "content": "<p>[quote=barisumog;52877]</p>\n<p>[quote=Triskelion;52875]</p>\n<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>\n<p>[/quote]</p>\n<p>I just checked my own rankings, and also the combined rankings with Giulio, but I can't see a similar pattern. The first digits of the top 1000 seem pretty random.</p>\n<p>[/quote]</p>\n<p>Yes. Most of my submissions seem random too. But the one I attached with weird ID order can yield high score 0.97x. That I can't understand.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52880",
      "postDate": "09/01/2014 19:09:35",
      "content": "<p>Pretty weird then. Something specific to VW being very good at remembering duplicates?</p>\n<p>The effect slowly appears, but is quite evident:</p>\n<p>Id<br>89473945<br>94127948<br>99606052<br>94989648<br>79129076<br>99849589<br>98818087<br>82182051<br>95990314<br>86040175</p>\n<p>...</p>\n<p>12564162<br>13689647<br>15085030<br>15669423<br>12604276<br>10813971<br>12198103<br>11358305<br>15096447<br>10287928</p>\n<p>Or even almost fully sorted, like yr's submission shows. Since the solution files were still well performing on both public and private leaderboard, I don't think it's a sorting/ensembling bug.</p>\n<p>There could however be small leakage: find high ID's like&nbsp;99997125 that are ranked below line 35k and put them back on top. Perhaps we dodged a bullet?</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52881",
      "postDate": "09/01/2014 19:20:47",
      "content": "<p>I noticed that in this competition RFs tend to produce that type of distribution when you let the full tree grow. In my case, I was feeding prediction from SGD into forests,&nbsp;and that was by far the most important feature. Since there were so few features in the RF model, even the full grown tree produces a very &quot;discrete&quot; solution. If I recall correctly, I was getting something like 1000 distinct leaves. That means, you'll get few clusters of probabilities. Depending on how you create your submission, the id could end up being sorted in each cluster of probabilities, thus giving the impression that 9xxxx ids are ranked higher. But if you look further down you'll see 9x, 8x, 7x,..1x repeat in cycles.</p>\n<p>I solved this by using a high min_sample_leaf, which stopped the tree much earlier and provided more &quot;continuous&quot; outcomes.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52902",
      "postDate": "09/02/2014 06:01:39",
      "content": "<p>Congrats to barisumog &amp; Giulio, Mikhail &amp; Dmitry and Feng &amp; Hang &amp; Jeong-Yoon.</p>\n<p>I used vw, trying several different parameter combinations particularly quadratic (cat/subcat with title / description / attrib), learning_rate and ngram (2 and 3 were beneficial beyond that it tended to overfit). Like Silogram, I found the number of passes could make a difference but found the auto stop kicked in at 20-30 passes. One of my earlier submissions, I tested beyond the auto stop and ended up with a submission that badly overfit, so I avoided the technique. Sounds like I should investigate that more. I did find a small amount of l1 regularisation helped.</p>\n<p>A substantial portion of my time was spent trying to get a system for cross-validating and learning vw and python.</p>",
      "rawMarkdown": "",
      "votes": null
    },
    {
      "id": "52927",
      "postDate": "09/02/2014 18:09:02",
      "content": "<p>Congrats to Barisumog &amp; Giulio for keeping a lead within a tight margin.</p>\n\n<p>Like many others, I decided to learn vw when starting this competition.</p>\n<p>I ended up blending vw logistic, neural network and 2 gram.</p>\n\n<p>What setting did you use for l1?</p>\n<p>Setting regularization only seemed to lower my score.</p>",
      "rawMarkdown": "",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 52798,
      "author_name": "kevinandhu",
      "author_url": "",
      "post_date": "09/01/2014 00:31:07",
      "content": "<p>Congratulations!&nbsp;</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52800,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 00:42:28",
      "content": "<p>Grats all. Grats to Abhishek for becoming top 10 Kaggler!</p>\n<p>And grats to Barisumog for becoming Master Kaggler. That's absolutely what that impressive profile deserved!</p>\n<p>Grats to my team members Phil Culliton and Jules, for reaching top 10 position together, and getting Master Kaggler status.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52802,
      "author_name": "dkaylor",
      "author_url": "",
      "post_date": "09/01/2014 00:59:48",
      "content": "<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52806,
      "author_name": "mikhailtrofimov",
      "author_url": "",
      "post_date": "09/01/2014 01:21:00",
      "content": "<p>Congrat winners! Congrat Barisumog with Master Tier!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52807,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 01:33:31",
      "content": "<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>Jules found two ways: train a VW model where the positive class is samples where is_blocked ==1 AND is_proved == 1.</p>\n<p>Also as part of an illicit score to use for (quantile) regression: Something like: is_blocked + 0.4*is_proved + close_hours_score.</p>\n<p>This improved ensembles where we simply averaged the ranks of the submission files.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52809,
      "author_name": "magicjin",
      "author_url": "",
      "post_date": "09/01/2014 02:33:55",
      "content": "<p>Congrat winners! It's a wonderful game,i also learned a lot,Thanks to the organizers</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52810,
      "author_name": "chenglongchen",
      "author_url": "",
      "post_date": "09/01/2014 02:41:44",
      "content": "<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>I trained two models, with all the blocked ads (mixed model) and only blocked ads labeled by experienced moderator (proved model). This improve my results by 0.001~0.002. My best private score is&nbsp;0.98589 which is simple averaging by 2 mixed models and 2 proved models of 2 different set of features.</p>\n<p>This is the first time I come so close to top3!</p>\n<p>Congrats to everyone! Congrats to&nbsp;Barisumog &amp; Giulio! Well done!</p>\n<p>Update:&nbsp;I&nbsp;initially entered this competition to familiarize myself with VW and Linux &amp; Shell (I used to be a Windows user).&nbsp;If anyone interested in how to get to 0.985x using VW, I have put all my code&nbsp;<a href=\"https://github.com/ChenglongChen/Kaggle_The_Hunt_for_Prohibited_Content\">here</a>.&nbsp;</p>\n<p>Finally, I would also&nbsp;want to thank&nbsp;@Triskelion and @Foxtrot for introducing me to VW :)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52811,
      "author_name": "dasgupta",
      "author_url": "",
      "post_date": "09/01/2014 02:51:14",
      "content": "<p>[quote=Triskelion;52807]</p>\n<p>[quote=dkay;52802]</p>\n<p>Great work&nbsp;guys! Very&nbsp;curious to see what you found that led to the separation.</p>\n<p>Did anyone&nbsp;find a good way to use the&nbsp;is_proved targets? I couldn't get them to add any value to my models.</p>\n<p>[/quote]</p>\n<p>Jules found two ways: train a VW model where the positive class is samples where is_blocked ==1 AND is_proved == 1.</p>\n<p>Also as part of an illicit score to use for (quantile) regression: Something like: is_blocked + 0.4*is_proved + close_hours_score.</p>\n<p>This improved ensembles where we simply averaged the ranks of the submission files.</p>\n<p>[/quote]</p>\n\n<p>Very interesting. Just curious, did you use VW exclusively for model building ? And, re: training for examples where is_blocked and is_blocked == 1, did you use any method to find this. Thanks.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52812,
      "author_name": "adjgiulio",
      "author_url": "",
      "post_date": "09/01/2014 02:58:03",
      "content": "<p>Great competition, lots of fun and awesome learning opportunity! Thanks Kaggle and Avito!</p>\n<p>I&#8217;ve got to first congratulate everyone who fought hard throughout this competition, other winners, top-10, and new Masters! Well done everyone!&nbsp;<br>As for the approach, I think that what we did will not come as a shocker to anyone.</p>\n<p>My model was essentially a series of SGD on pieces of the text data (one for title, one for description, one for title+description, one for attrs). This alone gets you around .97 on the public LB. By adding to the tfidf matrices one-hot-encoded category and subcategory the models score well above .97.<br>The outputs from all the SGDs were then fed into a tree model (RF worked better than GBM) along with some other features, most importantly category and subcategory, but also email, url and phone number counts. This piece really helped the model re-learn the differences among categories and subcategories and re-sort the original SGD predictions. This added another .002-3ish and takes you in .983 territory.<br>Since plain accuracy was so high across the dataset, semi-supervised test data added in the order of .003 to the train data alone bringing my best model around .986.<br>All of this was built on the entire data minus real estate, which barisimug found out could be removed not only without any loss, but with a sizeable increase in performance.</p>\n<p>I'll let barisumog describe his models but in his approach he modelled each category and subcategory independently, later stacking results.</p>\n<p>Our winner model is a simple rank based weighed average of my best RF&nbsp;andGBM, and barisumog's ensemble of SVMs.</p>\n<p>We used ranks to blend our models mostly because, from a practical perspective, our model outputs were on different scales (mine were probabilities, barisumog&#8217;s were distances from the SVM separating hyperplane). In reality I have observed that even amongst my models (who all produced probabilities) ranks were still as good as if not better than probabilities for blends.<br>My intuition, with no scientific evidence for it, is that when using semi-supervised learning you end up getting many extreme predictions for the test set, with lots of observations clustering around 1 and 0. That makes intuitive sense since you&#8217;re predicting observations the algorithm has already seen in training. With these big clusters of 1&#8217;s, .9995&#8217;s, .9993&#8217;s&#8230; ranking is introducing some (admittedly arbitrary) randomization, which might act as a good counterweight to the extreme decisiveness of semi-supervised approaches.</p>\n<p>Another surprising thing for me was the fact I was getting much less than in other competitions out of ensembles. It really took two very distinct approaches to get decent value out of our team ensemble. And that was also, the key to our success. I'm really curious to see what other approaches folks have come up with, but essentially we had two very good models covering two very different approaches.</p>\n<p><strong>Things that did not work for me</strong>:<br>-is_proven added no value to our models <br>-feature engineering has provided little to no value. I tried a bunch of features derived from text (i.e. count of !, ?, mixed words, length of text,...) and none seemed to add much.<br>-for the attributes feature, anything more fancy that running it through a tfidf added nothing.<br>-I tried a second level model where I&#8217;d take the top 20% observations and re-model those alone to see if it could help further minimize false positives. Even at different cutoffs, that did not help.</p>\n<p><strong>Things that did work for me</strong>:<br>-no need to do anything fancy with the russian text. Just feed it into a tfidf vectorizer and you&#8217;re already in better shape than the benchmark code.<br>-simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>One part of the competition that was a first, and very interesting for someone like me who enjoys the competitive aspect of Kaggle, was the strategic aspect of managing a high LB rank. This is where machine learning becomes strategic/competitive machine learning. :-)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52813,
      "author_name": "dkaylor",
      "author_url": "",
      "post_date": "09/01/2014 03:24:43",
      "content": "<p>Nice work. It sounds like my method&nbsp;was similar to bariusmog's approach.</p>\n\n<p>I used the title + description, and also just title on it's own and blended them together. For both of these I trained with all category data, then separated into single models by category, and also single models based on subcategory in order to get some sort of diversity.</p>\n\n<p>With combining in this way, it gave me an extra ~.002 &nbsp;above any on their own. I also used some semi-supervised learning with the test set, but it only gave me ~.001.&nbsp; I tried some feature engineering as well, but it gave little value.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52814,
      "author_name": "adjgiulio",
      "author_url": "",
      "post_date": "09/01/2014 04:08:08",
      "content": "<p>And congrats David T. on becoming&nbsp;Kaggle's new #2 overall. Seattle should be pretty proud these days :-)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52815,
      "author_name": "apophenia",
      "author_url": "",
      "post_date": "09/01/2014 04:20:31",
      "content": "<p>My 2 cents on&nbsp;text features:</p>\n<p>Other than unigrams, bigrams were also helpful,&nbsp;but not trigrams.&nbsp;Stemming and correcting words didn't help.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52818,
      "author_name": "lucamassaron",
      "author_url": "",
      "post_date": "09/01/2014 04:49:24",
      "content": "<p>Congratulations to Giulio and Barisumog for winning this interesting competition! And for Abhishek for entering the top 10! Very interesting competition, after a long time I had to use VW again.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52820,
      "author_name": "vasilyleksin",
      "author_url": "",
      "post_date": "09/01/2014 05:44:27",
      "content": "<p>Thank you all for the work done! We are carefully watching the competition process and the results are really impressive! We hope that the competition was interesting and honest. Now it's our turn to work hard to implement something like that in our production models...</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52824,
      "author_name": "dixitgaurav",
      "author_url": "",
      "post_date": "09/01/2014 06:40:26",
      "content": "<p>Congrats winners! Congrat Barisumog for becoming&nbsp;Master!</p>\n<p>Congrats&nbsp;Abhishek&nbsp;for entering&nbsp;&nbsp;into&nbsp;the top 10!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52825,
      "author_name": "mikhailtrofimov",
      "author_url": "",
      "post_date": "09/01/2014 07:28:42",
      "content": "<p>I&#8217;ve got to congratulate everyone who&nbsp;participate and especially everyone who break 0.984 =)</p>\n<p>Our approach is quite similar to discribed by Giulio. We use different pieces of data (title, title+description, title+description+attrs, title+attrs) and made 3 levels of details for each (top100k word, all word, all pair of words). For all of this features-sets was trained SVM, for some - additional LibFM models. Solely they give 0.97 - 0.983.</p>\n<p>All this models was blended by RF, so it gave 0.986.</p>\n<p>[quote=Giulio;52812]</p>\n<p>simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>[/quote]</p>\n<p>Can you explain this in details?&nbsp;It is thing I want to learn! =)</p>\n<p>I've tried to use SSL, but got no profit.&nbsp;You predict whole test set, added it to the train, learn from concatenation and again&nbsp;predict test set?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52828,
      "author_name": "barisumog",
      "author_url": "",
      "post_date": "09/01/2014 08:38:48",
      "content": "<p>Congrats to everyone who fought hard to the end! And thanks to Kaggle and Avito, it was a fun competition.</p>\n<p>About my approach: I don't speak Russian, but running numerous data through Google translate, I could see that some categories used very different language than others. Also the ratio of illicit content varied widely between categories (and subcategories). So I decided to tackle the problem on a category / subcategory basis.</p>\n<p>This is what I did, in steps:</p>\n<ol>\n<li><span style=\"line-height: 1.4\">separate the raw data into categories and subcategories</span></li>\n<li><span style=\"line-height: 1.4\">ignore the Real Estate category and related subcategories (vastly different language than other categories, and very tiny ratio of illicit content)</span></li>\n<li><span style=\"line-height: 1.4\">extract</span><span style=\"line-height: 1.4\">&nbsp;raw text from each post by concatenating the title, description and attributes sections (We tried many other features, some worked for Giulio, but none for me. I used only textual features)</span></li>\n<li><span style=\"line-height: 1.4\">for each category and subcategory, create 3 tf-idf matrices: one with raw text, one with stemming, and one with stop words (separately, they gave similar results, but I noticed they improved the score a bit and became more stable when combined)</span></li>\n<li><span style=\"line-height: 1.4\">for each category and subcategory, train 2 sets of SVCs with different C parameters on each tf-idf (again, similar results separately, but</span><span style=\"line-height: 1.4\">&nbsp;slightly&nbsp;</span><span style=\"line-height: 1.4\">better when combined)</span></li>\n<li><span style=\"line-height: 1.4\">so now I have 2 x 3 SVCs for every category, and 2 x 3 SVCs for every subcategory (12 models to use for every data point)</span></li>\n<li><span style=\"line-height: 1.4\">apply semi-supervised learning, which was Giulio's idea and worked quite well. Use the trained models on test data to predict classes. Concatenate train+test, and labels+prediction. Retrain all models on this new merged data set.</span></li>\n<li><span style=\"line-height: 1.4\">finally, use the models to make predictions on the test data. use the SVC output of distance from hyperplane to rank the individual posts</span></li>\n</ol>\n<p>Then Giulio did some of his magic to combine my ranks with his own models. As he already pointed out, the difference of approach between our models resulted in a nice boost when ensembled.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52834,
      "author_name": "dyakonov",
      "author_url": "",
      "post_date": "09/01/2014 11:44:21",
      "content": "<p>Thanks to the organisers and congrats to all the top finishers!</p>\n<p>Special congratulations to winners who avoided overfitting.</p>\n<p>&#1055;&#1086;&#1079;&#1076;&#1088;&#1072;&#1074;&#1083;&#1103;&#1102; &#1083;&#1091;&#1095;&#1096;&#1091;&#1102; &#1056;&#1086;&#1089;&#1089;&#1080;&#1081;&#1089;&#1082;&#1091;&#1102; &#1082;&#1086;&#1084;&#1072;&#1085;&#1076;&#1091; &#1052;&#1080;&#1093;&#1072;&#1080;&#1083;&#1072; &#1080; &#1044;&#1084;&#1080;&#1090;&#1088;&#1080;&#1103;!&nbsp;&nbsp;</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52836,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 12:14:22",
      "content": "<p>[quote=xbsd;52811]</p>\n<p>Very interesting. Just curious, did you use VW exclusively for model building ? And, re: training for examples where is_blocked and is_blocked == 1, did you use any method to find this. Thanks.</p>\n<p>[/quote]</p>\n<p>Yes. Single VW models gave around 97.7, with a lot of tuning single VW models became around 98. Averaging the ranks of a hinge and logloss model improved the score to well over 98, etc. Reading through yr's code (very well done on the VW!) it's possible to get a very high score with very little memory resources and time. So for us no elaborate complex GBM or RF models (though we very much would have used them if we managed or saw improvement).</p>\n<p>So for implementation, I think VW could be a solid and fast choice, with simple model introspection. But it's not like these models need retraining every minute, so more complex models are possible too.</p>\n<p>I believe Jules found that trick through a hunch. It makes sense that a model trained on different features/samples or labels will hold different information for an ensemble to use.</p>\n<p>Vowpal Wabbit eats Russian spam for breakfast. But just to make sure we latinized all Russian characters, so we could dream to avoid further encoding issues on Windows.</p>\n<p>The semi-supervised trick from Giulio is interesting. Makes perfect sense to try it out, but I was thinking about this for other competitions, not this one. I think it has its own risks associated with it (I call it over-learning).</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52837,
      "author_name": "mjahrer",
      "author_url": "",
      "post_date": "09/01/2014 12:26:03",
      "content": "<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52838,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 12:46:26",
      "content": "<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow, that is really good. Do I understand you correctly in that you did not use the text at all?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52841,
      "author_name": "mjahrer",
      "author_url": "",
      "post_date": "09/01/2014 12:55:22",
      "content": "<p>[quote=Triskelion;52838]</p>\n<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow, that is really good. Do I understand you correctly in that you did not use the text at all?</p>\n<p>[/quote]</p>\n<p>I checked my&nbsp;feature generation code (several weeks ago), and yes sorry I forgot to mentioned the tokens in these 3 cols: title,description,attr. So yes I used this text tokens.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52843,
      "author_name": "psilogram",
      "author_url": "",
      "post_date": "09/01/2014 13:03:20",
      "content": "<p>I used vw exclusively, experimenting with the parameters, especially --passes and --decay_learning_rate. Surprisingly, the number of passes had a large effect, even with a very steep decay. For example, the difference between 15 and 16 passes, with the decay at 0.5, could be as much as .002. Also, the average variance between the LB and PB scores was about .002 and was quite erratic. My final two choices were my best LB model (.98461), which scored only .98200 on the PB, and an ensemble of 10 vw models, which scored .98404 on the LB and .98291 on the PB. My best PB score was the same ensemble, but mixed based on rank instead of raw scores, which scored .98431 on the PB but only .98317 on the LB.</p>\n<p>All in all, I had a great time learning about vw, which is an incredibly powerful and fast tool. It is difficult, however, to set up a robust cross-validation system with vw. For example, I found that the &nbsp;built-in stopping mechanism on passes tended to underestimate the optimal number of passes. For example, my models generally stopped after 8, or sometimes 9, passes, but I found that letting it run for 14-16 passes on the full data achieved better results. I didn't think to try semi-supervised learning and I wonder how that would work within the vw framework. Did anyone else try ss with vw?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52844,
      "author_name": "chenglongchen",
      "author_url": "",
      "post_date": "09/01/2014 13:11:13",
      "content": "<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52847,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 13:17:57",
      "content": "<p>[quote=yr;52844]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>\n<p>[/quote]</p>\n<p>I did. It looks very promising (also with the results it got for KDD-cup 2012 Ad click prediction). Would love to see a benchmark in LibFM.</p>\n<p>Can't get it to build to hold more than 2GB of memory though, is 64-bit LibFM on Windows possible?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52848,
      "author_name": "mjahrer",
      "author_url": "",
      "post_date": "09/01/2014 13:19:47",
      "content": "<p>[quote=yr;52844]</p>\n<p>[quote=Michael Jahrer;52837]</p>\n<p>A&nbsp;single libfm on raw data (one-hot with minOccurence=5 of category,subcategory,price,phones_cnt,emails_cnt,urls_cnt) gave me&nbsp;0.98073 public and&nbsp;0.98103 private.</p>\n<p>Pretty good for such a simple attempt.</p>\n<p>[/quote]</p>\n<p>Wow~ I will definitely give libfm a shot for Display comp if I have time!</p>\n<p>[/quote]</p>\n<p>yep - works on display ad challenge, one part of my solution there ;)</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52856,
      "author_name": "zygmunt",
      "author_url": "",
      "post_date": "09/01/2014 14:53:37",
      "content": "<p>Congratulations to Giulio and Barisumog. After posting my solution I trained a separate model for each category, following sergiu's suggestion: 0.971 -&gt; 0.978.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52862,
      "author_name": "adjgiulio",
      "author_url": "",
      "post_date": "09/01/2014 16:13:45",
      "content": "<p>[quote=Mikhail Trofimov;52825]</p>\n<p>[quote=Giulio;52812]</p>\n<p>simple semi-supervised learning performed the best. I tried using only portions of the scored test set (i.e. observation with predicted probabilities above .9 or below .1), tried many cutoffs, but nothing was better than using all test. I even tried to use all the test set but weighted its observations based on how close to 0 and 1 the probabilities were, but that also did not add value.</p>\n<p>[/quote]</p>\n<p>Can you explain this in details?&nbsp;It is thing I want to learn! =)</p>\n<p>I've tried to use SSL, but got no profit.&nbsp;You predict whole test set, added it to the train, learn from concatenation and again&nbsp;predict test set?</p>\n<p>[/quote]</p>\n<p>In my case I had a two stage model. In the first stage I used several SGD as initial predictions. I fed those into a RF. I used the RF to predict test (as in 0/1, not probabilities). I then stacked train and test, target and predictions and retrained on the whole set. That improved my RF from .982-ish to .9859.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52871,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 17:47:20",
      "content": "<p>What were the engineered features like for everyone?</p>\n<p>title_char_length,&nbsp;body_char_length,&nbsp;category_count, sub_category_count,&nbsp;and numerous char frequencies.</p>\n<p>all seemed informative features.</p>\n<p>We tried building an RF model with no text tokens, but word_frequencies of words like: gun, pistol, knife, diploma, thesis, medical, m2, massage. This did ok for so few features ~80%.</p>\n<p>We got these words by studying duplicates or near-duplicates in test and train set. Could have been more gain there, as there where a lot of title-duplicates and even more near duplicates. Perhaps that is why KNN worked well on this challenge.</p>\n<p>Also dreamed about training opensource spamfilters like CRM114 on both train and test data, to generate features this way. Maybe another time.&nbsp;</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>I am a bit bummed I could not understand Russian, and had to rely on translate. What were the funny illicit advertisements you found in the dataset? I think I saw some&nbsp;military equipment advertised like sniper rifles and war medals.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52873,
      "author_name": "chenglongchen",
      "author_url": "",
      "post_date": "09/01/2014 18:04:50",
      "content": "<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>Top:</p>\n<p>id<br>99997125<br>99996057<br>99994331<br>99989755<br>99989702<br>99983497<br>99982520<br>99981089<br>99975380<br>99974721<br>99962972<br>Bottom:</p>\n<p>10000998<br>10000962<br>10000930<br>10000831<br>10000816<br>10000612<br>10000395<br>10000387<br>10000196<br>10000175<br>10000124<br>10000074</p>\n<p>with public LB:&nbsp;0.97625 and private LB: 0.97812. It is generated when I used squared loss in VW but with -p arg for prediction.</p>\n<p>With -r arg instead, the corresponding (corrected) version yields&nbsp;public LB: 0.98104 and private LB:&nbsp;0.97953 (The second attachment with &quot;r&quot;). Not that different.&nbsp;I am curious why it is so.&nbsp;</p>\n<p>Edited: Upload the file twice... Pls ignore the .rar file.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52874,
      "author_name": "dkaylor",
      "author_url": "",
      "post_date": "09/01/2014 18:26:24",
      "content": "<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52875,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 18:28:50",
      "content": "<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52877,
      "author_name": "barisumog",
      "author_url": "",
      "post_date": "09/01/2014 19:01:05",
      "content": "<p>[quote=Triskelion;52875]</p>\n<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>\n<p>[/quote]</p>\n<p>I just checked my own rankings, and also the combined rankings with Giulio, but I can't see a similar pattern. The first digits of the top 1000 seem pretty random.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52878,
      "author_name": "chenglongchen",
      "author_url": "",
      "post_date": "09/01/2014 19:06:50",
      "content": "<p>[quote=barisumog;52877]</p>\n<p>[quote=Triskelion;52875]</p>\n<p>[quote=dkay;52874]</p>\n<p>[quote=yr;52873]</p>\n<p>[quote=Triskelion;52871]</p>\n<p>Did you notice the strange distribution of the IDs in good submission files? ID's starting with 9 ranked near the top, and ID's starting with 1 ranked near the bottom. A curious artifact, but no we found no leakage in this.</p>\n<p>[/quote]</p>\n<p>I happen to find this too. Have a look at the first attachment (with &quot;p&quot;). Something like this:</p>\n<p>[/quote]</p>\n<p>Mine aren't like this at all. Did you guys bucket the predictions and then use itemid as a secondary sort?</p>\n<p>[/quote]</p>\n<p>No, we didn't sort on ID. This just appeared when ensembling different models together. But even individual model files will have a higher than normal distribution of IDs starting with 5-9 in the first 1000 or so lines. At least with VW.</p>\n<p>[/quote]</p>\n<p>I just checked my own rankings, and also the combined rankings with Giulio, but I can't see a similar pattern. The first digits of the top 1000 seem pretty random.</p>\n<p>[/quote]</p>\n<p>Yes. Most of my submissions seem random too. But the one I attached with weird ID order can yield high score 0.97x. That I can't understand.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52880,
      "author_name": "triskelion",
      "author_url": "",
      "post_date": "09/01/2014 19:09:35",
      "content": "<p>Pretty weird then. Something specific to VW being very good at remembering duplicates?</p>\n<p>The effect slowly appears, but is quite evident:</p>\n<p>Id<br>89473945<br>94127948<br>99606052<br>94989648<br>79129076<br>99849589<br>98818087<br>82182051<br>95990314<br>86040175</p>\n<p>...</p>\n<p>12564162<br>13689647<br>15085030<br>15669423<br>12604276<br>10813971<br>12198103<br>11358305<br>15096447<br>10287928</p>\n<p>Or even almost fully sorted, like yr's submission shows. Since the solution files were still well performing on both public and private leaderboard, I don't think it's a sorting/ensembling bug.</p>\n<p>There could however be small leakage: find high ID's like&nbsp;99997125 that are ranked below line 35k and put them back on top. Perhaps we dodged a bullet?</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52881,
      "author_name": "adjgiulio",
      "author_url": "",
      "post_date": "09/01/2014 19:20:47",
      "content": "<p>I noticed that in this competition RFs tend to produce that type of distribution when you let the full tree grow. In my case, I was feeding prediction from SGD into forests,&nbsp;and that was by far the most important feature. Since there were so few features in the RF model, even the full grown tree produces a very &quot;discrete&quot; solution. If I recall correctly, I was getting something like 1000 distinct leaves. That means, you'll get few clusters of probabilities. Depending on how you create your submission, the id could end up being sorted in each cluster of probabilities, thus giving the impression that 9xxxx ids are ranked higher. But if you look further down you'll see 9x, 8x, 7x,..1x repeat in cycles.</p>\n<p>I solved this by using a high min_sample_leaf, which stopped the tree much earlier and provided more &quot;continuous&quot; outcomes.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52902,
      "author_name": "sthompson",
      "author_url": "",
      "post_date": "09/02/2014 06:01:39",
      "content": "<p>Congrats to barisumog &amp; Giulio, Mikhail &amp; Dmitry and Feng &amp; Hang &amp; Jeong-Yoon.</p>\n<p>I used vw, trying several different parameter combinations particularly quadratic (cat/subcat with title / description / attrib), learning_rate and ngram (2 and 3 were beneficial beyond that it tended to overfit). Like Silogram, I found the number of passes could make a difference but found the auto stop kicked in at 20-30 passes. One of my earlier submissions, I tested beyond the auto stop and ended up with a submission that badly overfit, so I avoided the technique. Sounds like I should investigate that more. I did find a small amount of l1 regularisation helped.</p>\n<p>A substantial portion of my time was spent trying to get a system for cross-validating and learning vw and python.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 52927,
      "author_name": "devcon",
      "author_url": "",
      "post_date": "09/02/2014 18:09:02",
      "content": "<p>Congrats to Barisumog &amp; Giulio for keeping a lead within a tight margin.</p>\n\n<p>Like many others, I decided to learn vw when starting this competition.</p>\n<p>I ended up blending vw logistic, neural network and 2 gram.</p>\n\n<p>What setting did you use for l1?</p>\n<p>Setting regularization only seemed to lower my score.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "52795": "",
    "52798": "",
    "52800": "",
    "52802": "",
    "52806": "",
    "52807": "",
    "52809": "",
    "52810": "",
    "52811": "",
    "52812": "",
    "52813": "",
    "52814": "",
    "52815": "",
    "52818": "",
    "52820": "",
    "52824": "",
    "52825": "",
    "52828": "",
    "52834": "",
    "52836": "",
    "52837": "",
    "52838": "",
    "52841": "",
    "52843": "",
    "52844": "",
    "52847": "",
    "52848": "",
    "52856": "",
    "52862": "",
    "52871": "",
    "52873": "",
    "52874": "",
    "52875": "",
    "52877": "",
    "52878": "",
    "52880": "",
    "52881": "",
    "52902": "",
    "52927": ""
  },
  "source": "meta"
}