Created
October 31, 2015 04:53
-
-
Save juanshishido/923d16404dd117e1052a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "# ANLP 2015 Text Classification Assignment" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "Emily Scharff and Juan Shishido" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Write Up" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Introduction\n\nThis notebook contains the code and documentation that we used to obtain our score of **0.58541** on the public leaderboard for the ANLP 2015 Classification Assignment. We describe our text processing, feature engineering, and model selection approaches. We both worked on feature engineering and model selection. Juan spent time at the beginning setting up tfidf and Emily created and tested many features. Juan also experimented with tweaking the model parameters. Both Juan and Emily contributed to setting up the workflow.\n\n### Text Processing\n\nThe data were loaded into pandas DataFrames. We began plotting the frequency of each category in the training set and noticed that the distribution was not uniform. Category 1, for example, was the most well represented with 769 questions. Category 6, on the other hand, had the least amount of questions—232. This would prove to be a good insight and we'll describe how we used this to our advantage.\n\nIn terms of processing the data, our approach was *not* to modify the original text. Rather, we created a new column, `text_clean`, that reflected our changes.\n\nWhile examining the plain-text training data, we noticed sequences of HTML escaped characters, such as `
<br>`, which we removed with a regular expression. We also remove non-alphanumeric characters and replace whitespace with single spaces.\n\n### Features and Models\n\nIn terms of features, we started simple, using a term-document matrix that only included word frequencies. We also decided to get familiar with a handful of algorithms. We used our word features to train logistic regression and multinomial naive Bayes models. Using Scikit-Learn's `cross_validation` function, we were surprised to find initial scores of around 50% accuracy.\n\nFrom here, we deviated somewhat and tried document similarity. Using the training data, we combined questions, by category. Our thought was to create seven \"documents,\" one for each category, that represented the words used for the corresponding questions. This resulted in a $7 \\times w$ matrix, where $w$ represents the number of unique words *across* documents. This was created using Scikit-Learn's `TfidfVectorizer`. For the test data, the matrix was of dimension $w \\times q$, where $q$ represents the number of questions. Note that $w$ is the same in each of our matrices. This is so that it's possible to perform matrix multiplication. Of course, the `cosine_similarity` function, the metric we decided to use, takes care of some of the implementation details. Our first submission was based on this approach. We then stemmed the words in our corpus, using the Porter Stemmer, and that increased our score slightly.\n\nBefore proceeding, we decided to use Scikit-Learn's `train_test_split` function to create a development set—20% of the training data—on which to test our models. To fit our models, we used the remaining 80% of the original training data.\n\nIn our next iteration, we went back to experimenting with logistic regression and naive Bayes, but also added a linear support vector classifier. Here, we also started to add features. Because we were fitting a model, we did *not* combine questions by category. Rather, our tfidf feature matrix had a row for each question.\n\nWe tried many features. We ended up with the following list:\n\n* number of question marks\n* number of periods\n* number of apostrophes\n* number of \"the\"s\n* number of words\n* number of stop words\n* number of first person words\n* number of second person words\n* number of third person words\n* indicators for whether the *first* word was in `['what', 'how', 'why', 'is']`\n\n#### Other features we tried\n\nUnigrams: This feature was used to check for the occurrence of certain unigrams, just as in John's Scikit-Learn notebook. We used it to check for the most frequent words in each category. Using the 500 most frequent words in each category performed the best. However, this performance was outstripped by a simple tfidf and, when combined, only lowered the score.\n\nNumeric: The goal of this feature was to check if a certain question used numbers. The idea was that crtain categories, such as math, would use number more frequently than others, such as entertainment. In practice it did not work out that well.\n\nSimilarity: Here we used WordNet's similarity to see how similar the words in the question were to the question's category. This performed quite poorly. We believe this was due to the fact that the similarity function is not that accurate.\n\nPOS: We added a feature to count the number of a particular part of speech. We tested it with nouns, verbs, and adjectives. Interestingly the verbs performed the best. However in combination with the other features we chose it seemed to hurt the performance\n\nMedian length: Without tfidf, including the length of the median word of a question greatly increased the categorization accuracy. However, after using tfidf, the median length only detracted from the score. Because tfidf performed better, we did not include it in the final set of features.\n\nNames: This feature checked if a particular question contained a name. This worked better than counting the number of names. This is likely due to a lack of data. Overall, the number of questions with names in the training set is small so you can get better classification by only making the feature return\n\n#### Other processing\n\nWe also stemmed the words prior to passing them through the `TfidfVectorizer`.\n\nWhen we noticed some misspelled words, we tried using Peter Norvig's `correct` function, but it did not improve our accuracy scores.\n\nOne thing that was helpful was the plots we created when assessing the various models. We plotted the predicted labels against the ground truth. (An example of this in included below.) This helped us see, right away, that the linear SVC was performing best across all the permutations of features we tried. This is how we eventually decided to stick with that algorithm.\n\nDuring one of the iterations, we noticed that the naive Bayes model was incorrectly predicting category 1 for a majority of the data. We remembered the distribution of categories mentioned earlier and decided to sample the *other* categories at higher frequencies. We took the original training data, and then drew a random sample of questions from categories 2 through 7. After some experimentation, we decided to sample an extra 1,200 observations. This strategy helped improve our score.\n\nWe also spend time examining and analyzing the confidence scores using the `decision_function()` method. The idea here was to see if we could identify patterns in *how* the classifier was incorrectly labeling the development set. Unfortunately, we were not able to use this information to improve our scores.\n\nFinally, because of all the testing we had done, we had several results files, which included results we did not submit. With this data, we used a bagging approach—majority vote—to get a \"final\" classification on the 1,874 test examples. This, unfortunately, did not improve our score.\n\nOur best result on the public leaderboard was from a single linear support vector classifier using tfidf and the features listed above." | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Code" | |
}, | |
{ | |
"metadata": { | |
"collapsed": true | |
}, | |
"cell_type": "markdown", | |
"source": "### Imports" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "%matplotlib inline\n\nimport re\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport nltk\nfrom nltk.corpus import stopwords\nfrom nltk.tokenize import regexp_tokenize\nfrom nltk.stem.porter import PorterStemmer\nfrom sklearn import cross_validation\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.svm import LinearSVC\nfrom sklearn.metrics import accuracy_score", | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "plt.style.use('ggplot')", | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Functions" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "def sample(df, n=1000, include_cats=[2, 3, 4, 5, 6, 7], random_state=1868):\n \"\"\"Take a random sample of size `n` for categories\n in `include_cats`.\n \"\"\"\n df = df.copy()\n subset = df[df.Category.isin(include_cats)]\n sample = subset.sample(n, random_state=random_state)\n return sample\n\ndef clean_text(df, col):\n \"\"\"A function for keeping only alpha-numeric\n characters and replacing all white space with\n a single space.\n \"\"\"\n df = df.copy()\n porter_stemmer = PorterStemmer()\n return df[col].apply(lambda x: re.sub(';br&', ';&', x))\\\n .apply(lambda x: re.sub('&.+?;', '', x))\\\n .apply(lambda x: re.sub('[^A-Za-z0-9]+', ' ', x.lower()))\\\n .apply(lambda x: re.sub('\\s+', ' ', x).strip())\\\n .apply(lambda x: ' '.join([porter_stemmer.stem(w)\n for w in x.split()]))\n\ndef count_pattern(df, col, pattern):\n \"\"\"Count the occurrences of `pattern`\n in df[col].\n \"\"\"\n df = df.copy()\n return df[col].str.count(pattern)\n\ndef split_on_sentence(text):\n \"\"\"Tokenize the text on sentences.\n Returns a list of strings (sentences).\n \"\"\"\n sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')\n return sent_tokenizer.tokenize(text)\n\ndef split_on_word(text):\n \"\"\"Use regular expression tokenizer.\n Keep apostrophes.\n Returns a list of lists, one list for each sentence:\n [[word, word], [word, word, ..., word], ...].\n \"\"\"\n if type(text) is list:\n return [regexp_tokenize(sentence, pattern=\"\\w+(?:[-']\\w+)*\")\n for sentence in text]\n else:\n return regexp_tokenize(text, pattern=\"\\w+(?:[-']\\w+)*\")\n\ndef features(df):\n \"\"\"Create the features in the specified DataFrame.\"\"\"\n stop_words = stopwords.words('english')\n df = df.copy()\n df['n_questionmarks'] = count_pattern(df, 'Text', '\\?')\n df['n_periods'] = count_pattern(df, 'Text', '\\.')\n df['n_apostrophes'] = count_pattern(df, 'Text', '\\'')\n df['n_the'] = count_pattern(df, 'Text', 'the ')\n \n df['first_word'] = df.text_clean.apply(lambda x: split_on_word(x)[0])\n question_words = ['what', 'how', 'why', 'is']\n for w in question_words:\n col_wc = 'n_' + w\n col_fw = 'fw_' + w\n df[col_fw] = (df.first_word == w) * 1\n \n del df['first_word']\n \n df['n_words'] = df.text_clean.apply(lambda x: len(split_on_word(x)))\n df['n_stopwords'] = df.text_clean.apply(lambda x:\n len([w for w in split_on_word(x)\n if w not in stop_words]))\n \n df['n_first_person'] = df.text_clean.apply(lambda x:\n sum([w in person_first\n for w in x.split()]))\n df['n_second_person'] = df.text_clean.apply(lambda x:\n sum([w in person_second\n for w in x.split()]))\n df['n_third_person'] = df.text_clean.apply(lambda x:\n sum([w in person_third\n for w in x.split()]))\n \n return df\n\ndef flatten_words(list1d, get_unique=False):\n qa = [s.split() for s in list1d]\n if get_unique:\n return sorted(list(set([w for sent in qa for w in sent])))\n else:\n return [w for sent in qa for w in sent]\n\ndef tfidf_matrices(tr, te, col='text_clean'):\n \"\"\"Returns tfidf matrices for both the\n training and test DataFrames.\n The matrices will have the same number of\n columns, which represent unique words, but\n not the same number of rows, which represent\n samples.\n \"\"\"\n tr = tr.copy()\n te = te.copy()\n text = tr[col].values.tolist() + te[col].values.tolist()\n vocab = flatten_words(text, get_unique=True)\n tfidf = TfidfVectorizer(stop_words='english', vocabulary=vocab)\n tr_matrix = tfidf.fit_transform(tr.text_clean)\n te_matrix = tfidf.fit_transform(te.text_clean)\n return tr_matrix, te_matrix\n\ndef concat_tfidf(df, matrix):\n df = df.copy()\n df = pd.concat([df, pd.DataFrame(matrix.todense())], axis=1)\n return df\n\ndef jitter(values, sd=0.25):\n \"\"\"Jitter points for use in a scatterplot.\"\"\"\n return [np.random.normal(v, sd) for v in values]", | |
"execution_count": 3, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "person_first = ['i', 'we', 'me', 'us', 'my', 'mine', 'our', 'ours']\nperson_second = ['you', 'your', 'yours']\nperson_third = ['he', 'she', 'it', 'him', 'her', 'his', 'hers', 'its']", | |
"execution_count": 4, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Data" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### Load" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training = pd.read_csv('../data/newtrain.csv')\ntest = pd.read_csv('../data/newtest.csv')", | |
"execution_count": 5, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### Clean" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training['text_clean'] = clean_text(training, 'Text')\ntest['text_clean'] = clean_text(test, 'Text')", | |
"execution_count": 6, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### Features" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training = features(training)\ntest = features(test)", | |
"execution_count": 7, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### Split the training data" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "train, dev = cross_validation.train_test_split(training, test_size=0.2, random_state=1868)", | |
"execution_count": 8, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "train = train.append(sample(train, n=800))", | |
"execution_count": 9, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "train.reset_index(drop=True, inplace=True)\ndev.reset_index(drop=True, inplace=True)", | |
"execution_count": 10, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### tfidf" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "train_matrix, dev_matrix = tfidf_matrices(train, dev)", | |
"execution_count": 11, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "#### Combine" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "train = concat_tfidf(train, train_matrix)\ndev = concat_tfidf(dev, dev_matrix)", | |
"execution_count": 12, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Training" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "svm = LinearSVC(dual=False, max_iter=5000)", | |
"execution_count": 13, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "features = train.columns[3:]\nX = train[features].values\ny = train['Category'].values\nfeatures_dev = dev[features].values", | |
"execution_count": 14, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Testing on `dev`" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "svm.fit(X, y)\ndev_predicted = svm.predict(features_dev)", | |
"execution_count": 15, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "accuracy_score(dev.Category, dev_predicted)", | |
"execution_count": 16, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 16, | |
"data": { | |
"text/plain": "0.57407407407407407" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "plt.figure(figsize=(6, 5))\n\nplt.scatter(jitter(dev.Category, 0.15),\n jitter(dev_predicted, 0.15),\n color='#348ABD', alpha=0.25)\n\nplt.title('Support Vector Classifier\\n')\nplt.xlabel('Ground Truth')\nplt.ylabel('Predicted')", | |
"execution_count": 17, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 17, | |
"data": { | |
"text/plain": "<matplotlib.text.Text at 0x10f739160>" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<matplotlib.figure.Figure at 0x1083560f0>", | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAFpCAYAAACbCUPfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0XGd5+PHvXWafkTTaLC+JLcdJbCshDmFJQ0hMGqCF\nJpSWOm1OOAlbNsrS0pYWwhIoBUPLScsJOym0hTYmDekCP+jCSXAclmIc4gjHidfYkWTts8/c7f39\nMZ6xJI+ksS2NZjTP5xyfY83cmfvOXZ73ve+qKaUUQgghmoa+1AkQQghRWxL4hRCiyUjgF0KIJiOB\nXwghmowEfiGEaDIS+IUQoslI4BeiQR05cgRd13niiSdqtk9d1/nWt75V/juZTPLGN76RtrY2DMPg\n6NGjbN26ldtvv71maRJnTgL/MpXL5fjQhz7ERRddRDgcpqOjg5e97GV87nOfW+qknbENGzZw7733\nzrnNe97zHlavXo3ruhXf7+vr481vfvM5p+X48ePous6PfvSjc/6u+Xzve9/jta99LZ2dnYTDYTZu\n3Mhdd93Fc889t+j7ns3Q0BC/+7u/W/77C1/4Aj/5yU/YtWsXg4ODnHfeeTzyyCN89rOfXbI0ivlJ\n4F+m7rrrLv7xH/+Rv/7rv2bfvn08+uijvPOd7ySRSCx10qpmWRYAmqbNu+0dd9zB4OAg3/3ud097\nb9euXezbt4877rhjwdK2EOMeS7+vko997GPceOONXHTRRXznO99h//79PPDAA/j9fu65555z3vfZ\n6u7uJhAIlP9+7rnn6Ovro6+vj+7ubnRdp62tjWg0ek77mevYiAWgxLLU1tam7r///jm3ufXWW9X1\n118/7bV//Md/VJqmlf/+yEc+ojZs2KC++c1vqt7eXhUMBtWrX/1qdeTIkTPaRimlvv71r6tNmzYp\nv9+v1qxZo+655x7lOE75/WuvvVa97W1vU/fcc49auXKl6unpUVu3blWapk37d/To0Yq/5+qrr1a/\n9Vu/VfF3bt68WSmllGVZ6iMf+Ug5nX19fepLX/rStO1TqZR6z3veo8477zwVCATUunXr1F/91V8p\npdRpaent7T2r39fT06NWrlxZ8Xf8/Oc/V5qmqe3bt1d8f2JiQiml1OHDh5WmaWrXrl3l9z7wgQ+o\nTZs2qXA4rM477zx15513qkQiUX4/kUio2267TfX09KhAIKDOO+889cd//Mfl93fu3KmuuuoqFYvF\nVCwWU5dddpn6wQ9+UH5f0zT1zW9+Uyml1Nq1a6cdi1e96lXl3/n2t799Wpr/7u/+Tl188cUqGAyq\nCy+8UH3iE5+YdmzWrl2r7rnnHnXXXXepjo4OdeWVV1b87WJhSOBfpjZt2qR+67d+S42Pj8+6zW23\n3aZe/epXT3utUuCPRCLqla98pdq9e7f6v//7P/Xyl79cvfjFLz6jbf7zP/9TGYahPvWpT6nnnntO\nPfjggyoej6sPfehD5W2uvfZaFYvF1F133aX27dunnn76aTU+Pq56e3vVn/7pn6oTJ06oEydOKNd1\nK/6ef/iHf1Cmaarjx4+XX5ucnFThcFjdd999SqliJnDZZZep//7v/1ZHjhxRDz74oGpra1Nf+9rX\nlFJKeZ6nrr32WnXBBReof/u3f1OHDx9Wjz/+ePn9PXv2KE3T1He+8x114sQJNTo6ek6/r5L3vOc9\nKhqNKtu2Zz13SlUO/H/5l3+pHn/8cXX06FH1v//7v2rjxo3q1ltvLb//rne9S1122WXqZz/7mTp2\n7Jh64okn1Fe/+lWllFK2bat4PK7e9773qQMHDqgDBw6oRx55RO3cubP8+amBf2RkRN10003q2muv\nVSdOnChnSFu3blXveMc7yp/5yEc+otauXaseeeQRdeTIEfW9731PnX/++dOOzdq1a1VLS4u69957\n1XPPPaf27ds3528X50YC/zK1a9cutXbtWmUYhnrRi16kbr/9dvXII49M26baEr+maergwYPl1559\n9lmlaZr64Q9/WPU2V199tbrpppum7etv//ZvVSgUKge4a6+9Vl188cWn/ZYNGzaoe++9d97fnM/n\nVXt7u/rYxz5Wfu3zn/+8CgaDamJiQh06dEjpuq72798/7XP33nuv2rJli1JKqf/5n/9Rmqap3bt3\nV9zHsWPHlKZp6rHHHpv2+rn8vpl+8zd/U1122WXzblcp8M/08MMPq0AgUP77DW94g7rtttsqbjs+\nPq40TVOPPvrorN83NfArVfkamhr4M5mMCofD054alFLqG9/4hmprayv/vXbt2tO+RyweqeNfpq66\n6ioOHjzIzp07ufXWWzlx4gRvetObuPHGG8/4u7q6uli/fn357wsvvJDOzk76+/ur3uZXv/oV11xz\nzbTvveaaa8jn8xw8eLD82hVXXHHG6SsJBAK8+c1v5oEHHii/9pWvfIXf+73fo62tjZ///Ocopbji\n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\noegw/j+KOChzFgJqYgAAAABJRU5ErkJggg==\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Test Data" | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training = training.append(sample(training, n=1200))\ntraining.reset_index(drop=True, inplace=True)", | |
"execution_count": 18, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training_matrix, test_matrix = tfidf_matrices(training, test)", | |
"execution_count": 19, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "training = concat_tfidf(training, training_matrix)\ntest = concat_tfidf(test, test_matrix)", | |
"execution_count": 20, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "features = training.columns[3:]\nX = training[features].values\ny = training['Category'].values\nfeatures_test = test[features].values", | |
"execution_count": 21, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "svm.fit(X, y)\ntest_predicted = svm.predict(features_test)", | |
"execution_count": 22, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "test['Category'] = test_predicted\noutput = test[['Id', 'Category']]", | |
"execution_count": 23, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": false, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3", | |
"language": "python" | |
}, | |
"language_info": { | |
"file_extension": ".py", | |
"pygments_lexer": "ipython3", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"nbconvert_exporter": "python", | |
"version": "3.4.2", | |
"mimetype": "text/x-python", | |
"name": "python" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment