HW7: Comparing MNB & SVM with Kaggle Sentiment Data

OVERVIEW


VECTORIZERS USED:

CountVectorizer
TfidfVectorizer

MODELS USED:

Multinomial Naive Bayes (MNB)
Support Vector Machines (SVM)


VECTORIZATION PARAMS:

Binary
Stopwords
Unigrams, Bigrams
Min & Max df

TODO:

Stemming?
Vadar + TextBlob

FUNCTION & PACKAGE PARTY

In [4]:
## =======================================================
## TOKENIZING
## =======================================================
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize, word_tokenize

## =======================================================
## VECTORIZING
## =======================================================
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

## ----- VECTORIZORS
unigram_bool_cv = CountVectorizer(encoding='latin-1', binary=True, min_df=5, stop_words='english')
unigram_bool_cv_v2 = CountVectorizer(encoding='latin-1', binary=True, min_df=5, stop_words='english', token_pattern=r'(?u)\b[a-zA-Z]{2,}\b' )

unigram_cv = CountVectorizer(encoding='latin-1', binary=False, min_df=5, stop_words='english')
bigram_cv = CountVectorizer(encoding='latin-1', ngram_range=(1,2), min_df=5, stop_words='english')
unigram_tv = TfidfVectorizer(encoding='latin-1', use_idf=True, min_df=5, stop_words='english')
bigram_tv = TfidfVectorizer(encoding='latin-1', use_idf=True, ngram_range=(1,2), min_df=5, stop_words='english')

## =======================================================
## MODELING
## =======================================================
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.svm import LinearSVC
from sklearn.naive_bayes import BernoulliNB, MultinomialNB

## ----- CLASSIFIERS
mnb = MultinomialNB()
svm = LinearSVC(C=1)

def get_test_train_vec(X,y,vectorizer):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
    X_train_vec = vectorizer.fit_transform(X_train)
    X_test_vec = vectorizer.transform(X_test)
    return X_train_vec, X_test_vec, y_train, y_test

def run_classifier(X_train_vec, X_test_vec, y_train, y_test, labels, target_names, classifier):
    clf = classifier
    clf.fit(X_train_vec,y_train)
    print(clf.score(X_test_vec,y_test))
    return clf
    
def get_model(X, y, labels, target_names, classifier, vec):
    X_train_vec, X_test_vec, y_train, y_test = get_test_train_vec(X,y,vec)
    model = run_classifier(X_train_vec, X_test_vec, y_train, y_test, labels, target_names, classifier)
    return model
    
## =======================================================
## VISUALIZING
## =======================================================
from tabulate import tabulate
import pandas as pd

def return_features(vec, model):
    for i,feature_probability in enumerate(model.coef_):
        print('============ Sentiment Score: ', i)
        df1 = pd.DataFrame(sorted(zip(feature_probability, vec.get_feature_names()))[:10])
        df2 = pd.DataFrame(sorted(zip(feature_probability, vec.get_feature_names()))[-10:])
        df3 = pd.concat([df1, df2], axis=1)
        print(tabulate(df3, tablefmt="fancy_grid", headers=["Most","Likely","Least","Likely"], floatfmt=".2f"))
        

DATA GOES HERE:

In [5]:
# import pandas as pd
train=pd.read_csv("kaggle-sentiment/train.tsv", delimiter='\t')
y=train['Sentiment'].values
X=train['Phrase'].values

TASK 1

MNB | Vectorizer 1

In [6]:
vec = unigram_bool_cv
classifier = mnb

model = get_model(X,y,[0,1,2,3,4],['0','1','2','3','4'], classifier, vec)
return_features(vec, model)
0.606401384083045
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤════════════╕
│    │   Most │ Likely   │   Least │ Likely     │
╞════╪════════╪══════════╪═════════╪════════════╡
│  0 │ -10.48 │ 102      │   -5.95 │ time       │
├────┼────────┼──────────┼─────────┼────────────┤
│  1 │ -10.48 │ 10th     │   -5.94 │ minutes    │
├────┼────────┼──────────┼─────────┼────────────┤
│  2 │ -10.48 │ 127      │   -5.93 │ characters │
├────┼────────┼──────────┼─────────┼────────────┤
│  3 │ -10.48 │ 13th     │   -5.93 │ story      │
├────┼────────┼──────────┼─────────┼────────────┤
│  4 │ -10.48 │ 14       │   -5.90 │ comedy     │
├────┼────────┼──────────┼─────────┼────────────┤
│  5 │ -10.48 │ 16       │   -5.70 │ just       │
├────┼────────┼──────────┼─────────┼────────────┤
│  6 │ -10.48 │ 163      │   -5.20 │ like       │
├────┼────────┼──────────┼─────────┼────────────┤
│  7 │ -10.48 │ 168      │   -5.07 │ bad        │
├────┼────────┼──────────┼─────────┼────────────┤
│  8 │ -10.48 │ 170      │   -4.85 │ film       │
├────┼────────┼──────────┼─────────┼────────────┤
│  9 │ -10.48 │ 1790     │   -4.32 │ movie      │
╘════╧════════╧══════════╧═════════╧════════════╛
============ Sentiment Score:  1
╒════╤════════╤══════════╤═════════╤════════════╕
│    │   Most │ Likely   │   Least │ Likely     │
╞════╪════════╪══════════╪═════════╪════════════╡
│  0 │ -11.33 │ 000      │   -5.74 │ characters │
├────┼────────┼──────────┼─────────┼────────────┤
│  1 │ -11.33 │ 10th     │   -5.73 │ bad        │
├────┼────────┼──────────┼─────────┼────────────┤
│  2 │ -11.33 │ 127      │   -5.66 │ rrb        │
├────┼────────┼──────────┼─────────┼────────────┤
│  3 │ -11.33 │ 14       │   -5.64 │ little     │
├────┼────────┼──────────┼─────────┼────────────┤
│  4 │ -11.33 │ 168      │   -5.48 │ story      │
├────┼────────┼──────────┼─────────┼────────────┤
│  5 │ -11.33 │ 1790     │   -5.44 │ just       │
├────┼────────┼──────────┼─────────┼────────────┤
│  6 │ -11.33 │ 1915     │   -5.43 │ does       │
├────┼────────┼──────────┼─────────┼────────────┤
│  7 │ -11.33 │ 1920     │   -5.05 │ like       │
├────┼────────┼──────────┼─────────┼────────────┤
│  8 │ -11.33 │ 1933     │   -4.69 │ film       │
├────┼────────┼──────────┼─────────┼────────────┤
│  9 │ -11.33 │ 1937     │   -4.58 │ movie      │
╘════╧════════╧══════════╧═════════╧════════════╛
============ Sentiment Score:  2
╒════╤════════╤═════════════╤═════════╤════════════╕
│    │   Most │ Likely      │   Least │ Likely     │
╞════╪════════╪═════════════╪═════════╪════════════╡
│  0 │ -11.84 │ abroad      │   -5.95 │ movies     │
├────┼────────┼─────────────┼─────────┼────────────┤
│  1 │ -11.84 │ acclaim     │   -5.90 │ characters │
├────┼────────┼─────────────┼─────────┼────────────┤
│  2 │ -11.84 │ acumen      │   -5.79 │ time       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  3 │ -11.84 │ adding      │   -5.79 │ life       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  4 │ -11.84 │ admirers    │   -5.59 │ lrb        │
├────┼────────┼─────────────┼─────────┼────────────┤
│  5 │ -11.84 │ affirms     │   -5.49 │ story      │
├────┼────────┼─────────────┼─────────┼────────────┤
│  6 │ -11.84 │ aggravating │   -5.34 │ rrb        │
├────┼────────┼─────────────┼─────────┼────────────┤
│  7 │ -11.84 │ aimlessly   │   -5.30 │ like       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  8 │ -11.84 │ amaze       │   -4.75 │ movie      │
├────┼────────┼─────────────┼─────────┼────────────┤
│  9 │ -11.84 │ ambiguities │   -4.68 │ film       │
╘════╧════════╧═════════════╧═════════╧════════════╛
============ Sentiment Score:  3
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │   Likely │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │ -11.47 │      102 │   -5.77 │ lrb      │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │ -11.47 │      104 │   -5.76 │ love     │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │ -11.47 │      105 │   -5.68 │ rrb      │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │ -11.47 │      110 │   -5.67 │ life     │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │ -11.47 │      120 │   -5.57 │ like     │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │ -11.47 │      127 │   -5.50 │ story    │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │ -11.47 │      140 │   -5.49 │ funny    │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │ -11.47 │      146 │   -5.10 │ good     │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │ -11.47 │     1915 │   -4.80 │ movie    │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │ -11.47 │     1959 │   -4.49 │ film     │
╘════╧════════╧══════════╧═════════╧══════════╛
============ Sentiment Score:  4
╒════╤════════╤══════════╤═════════╤══════════════╕
│    │   Most │ Likely   │   Least │ Likely       │
╞════╪════════╪══════════╪═════════╪══════════════╡
│  0 │ -10.63 │ 000      │   -5.81 │ performance  │
├────┼────────┼──────────┼─────────┼──────────────┤
│  1 │ -10.63 │ 101      │   -5.77 │ comedy       │
├────┼────────┼──────────┼─────────┼──────────────┤
│  2 │ -10.63 │ 102      │   -5.73 │ great        │
├────┼────────┼──────────┼─────────┼──────────────┤
│  3 │ -10.63 │ 103      │   -5.69 │ story        │
├────┼────────┼──────────┼─────────┼──────────────┤
│  4 │ -10.63 │ 104      │   -5.64 │ performances │
├────┼────────┼──────────┼─────────┼──────────────┤
│  5 │ -10.63 │ 105      │   -5.47 │ good         │
├────┼────────┼──────────┼─────────┼──────────────┤
│  6 │ -10.63 │ 10th     │   -5.24 │ funny        │
├────┼────────┼──────────┼─────────┼──────────────┤
│  7 │ -10.63 │ 110      │   -5.15 │ best         │
├────┼────────┼──────────┼─────────┼──────────────┤
│  8 │ -10.63 │ 112      │   -4.78 │ movie        │
├────┼────────┼──────────┼─────────┼──────────────┤
│  9 │ -10.63 │ 12       │   -4.26 │ film         │
╘════╧════════╧══════════╧═════════╧══════════════╛

SVM | Vectorizer 1

In [156]:
vec = unigram_bool_cv
classifier = svm

model = get_model(X,y,[0,1,2,3,4],['0','1','2','3','4'], classifier, vec)
return_features(vec, model)
0.6245033961296937
============ Sentiment Score:  0
╒════╤════════╤═══════════╤═════════╤════════════════╕
│    │   Most │ Likely    │   Least │ Likely         │
╞════╪════════╪═══════════╪═════════╪════════════════╡
│  0 │  -1.81 │ hawke     │    1.63 │ cesspool       │
├────┼────────┼───────────┼─────────┼────────────────┤
│  1 │  -1.71 │ collar    │    1.66 │ pompous        │
├────┼────────┼───────────┼─────────┼────────────────┤
│  2 │  -1.69 │ giddy     │    1.69 │ stinks         │
├────┼────────┼───────────┼─────────┼────────────────┤
│  3 │  -1.59 │ swimfan   │    1.70 │ distasteful    │
├────┼────────┼───────────┼─────────┼────────────────┤
│  4 │  -1.57 │ blue      │    1.71 │ unwatchable    │
├────┼────────┼───────────┼─────────┼────────────────┤
│  5 │  -1.45 │ dogtown   │    1.72 │ disappointment │
├────┼────────┼───────────┼─────────┼────────────────┤
│  6 │  -1.41 │ victim    │    1.76 │ unbearable     │
├────┼────────┼───────────┼─────────┼────────────────┤
│  7 │  -1.41 │ joan      │    1.81 │ disgusting     │
├────┼────────┼───────────┼─────────┼────────────────┤
│  8 │  -1.41 │ won       │    1.81 │ stinker        │
├────┼────────┼───────────┼─────────┼────────────────┤
│  9 │  -1.40 │ innocence │    1.82 │ worthless      │
╘════╧════════╧═══════════╧═════════╧════════════════╛
============ Sentiment Score:  1
╒════╤════════╤═════════════════╤═════════╤════════════╕
│    │   Most │ Likely          │   Least │ Likely     │
╞════╪════════╪═════════════════╪═════════╪════════════╡
│  0 │  -2.22 │ hunk            │    1.67 │ activity   │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  1 │  -2.14 │ odor            │    1.67 │ clunkiness │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  2 │  -2.11 │ efficient       │    1.70 │ razzie     │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  3 │  -2.05 │ indescribably   │    1.70 │ squanders  │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  4 │  -2.05 │ norton          │    1.75 │ slimed     │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  5 │  -1.85 │ metropolis      │    1.77 │ muddy      │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  6 │  -1.79 │ unimaginatively │    1.79 │ padded     │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  7 │  -1.79 │ heels           │    1.81 │ charitable │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  8 │  -1.77 │ italicizes      │    1.96 │ outshined  │
├────┼────────┼─────────────────┼─────────┼────────────┤
│  9 │  -1.77 │ penetrating     │    2.04 │ flatfooted │
╘════╧════════╧═════════════════╧═════════╧════════════╛
============ Sentiment Score:  2
╒════╤════════╤═══════════════╤═════════╤════════════╕
│    │   Most │ Likely        │   Least │ Likely     │
╞════╪════════╪═══════════════╪═════════╪════════════╡
│  0 │  -2.80 │ flatfooted    │    1.83 │ handy      │
├────┼────────┼───────────────┼─────────┼────────────┤
│  1 │  -2.04 │ freshly       │    1.98 │ cunning    │
├────┼────────┼───────────────┼─────────┼────────────┤
│  2 │  -1.88 │ dimness       │    1.99 │ fashioning │
├────┼────────┼───────────────┼─────────┼────────────┤
│  3 │  -1.85 │ magnificent   │    2.02 │ nouvelle   │
├────┼────────┼───────────────┼─────────┼────────────┤
│  4 │  -1.82 │ insensitivity │    2.18 │ batch      │
├────┼────────┼───────────────┼─────────┼────────────┤
│  5 │  -1.81 │ elegantly     │    2.19 │ tidings    │
├────┼────────┼───────────────┼─────────┼────────────┤
│  6 │  -1.75 │ irresistibly  │    2.37 │ unseemly   │
├────┼────────┼───────────────┼─────────┼────────────┤
│  7 │  -1.72 │ clenching     │    2.49 │ pint       │
├────┼────────┼───────────────┼─────────┼────────────┤
│  8 │  -1.71 │ lagging       │    2.56 │ warren     │
├────┼────────┼───────────────┼─────────┼────────────┤
│  9 │  -1.70 │ strongest     │    2.57 │ spades     │
╘════╧════════╧═══════════════╧═════════╧════════════╛
============ Sentiment Score:  3
╒════╤════════╤════════════╤═════════╤═══════════════╕
│    │   Most │ Likely     │   Least │ Likely        │
╞════╪════════╪════════════╪═════════╪═══════════════╡
│  0 │  -2.32 │ mib        │    1.59 │ serb          │
├────┼────────┼────────────┼─────────┼───────────────┤
│  1 │  -2.13 │ facts      │    1.60 │ compels       │
├────┼────────┼────────────┼─────────┼───────────────┤
│  2 │  -2.08 │ strung     │    1.64 │ clenching     │
├────┼────────┼────────────┼─────────┼───────────────┤
│  3 │  -2.03 │ brutality  │    1.70 │ companionable │
├────┼────────┼────────────┼─────────┼───────────────┤
│  4 │  -1.95 │ ghost      │    1.70 │ pulpiness     │
├────┼────────┼────────────┼─────────┼───────────────┤
│  5 │  -1.95 │ wider      │    1.88 │ efficient     │
├────┼────────┼────────────┼─────────┼───────────────┤
│  6 │  -1.94 │ agenda     │    1.90 │ knotting      │
├────┼────────┼────────────┼─────────┼───────────────┤
│  7 │  -1.89 │ mud        │    1.98 │ ideally       │
├────┼────────┼────────────┼─────────┼───────────────┤
│  8 │  -1.78 │ mid        │    1.99 │ irresistibly  │
├────┼────────┼────────────┼─────────┼───────────────┤
│  9 │  -1.77 │ concession │    2.12 │ marveled      │
╘════╧════════╧════════════╧═════════╧═══════════════╛
============ Sentiment Score:  4
╒════╤════════╤════════════════╤═════════╤═════════════╕
│    │   Most │ Likely         │   Least │ Likely      │
╞════╪════════╪════════════════╪═════════╪═════════════╡
│  0 │  -2.32 │ sacrifices     │    1.57 │ stunning    │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  1 │  -1.86 │ maintained     │    1.58 │ flawless    │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  2 │  -1.77 │ argue          │    1.59 │ refreshes   │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  3 │  -1.66 │ failure        │    1.61 │ astonish    │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  4 │  -1.61 │ bore           │    1.63 │ phenomenal  │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  5 │  -1.55 │ nonchallenging │    1.65 │ masterful   │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  6 │  -1.53 │ clone          │    1.68 │ masterfully │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  7 │  -1.53 │ forcefully     │    1.91 │ glorious    │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  8 │  -1.52 │ lame           │    1.96 │ miraculous  │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  9 │  -1.47 │ homage         │    2.02 │ perfection  │
╘════╧════════╧════════════════╧═════════╧═════════════╛
In [ ]: