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 [153]:
## =======================================================
## 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', 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 [154]:
# 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 [157]:
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.6069780853517878
============ Sentiment Score:  0
╒════╤════════╤═════════════╤═════════╤════════════╕
│    │   Most │ Likely      │   Least │ Likely     │
╞════╪════════╪═════════════╪═════════╪════════════╡
│  0 │ -10.47 │ aaliyah     │   -5.94 │ time       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  1 │ -10.47 │ abagnale    │   -5.93 │ minutes    │
├────┼────────┼─────────────┼─────────┼────────────┤
│  2 │ -10.47 │ abandoned   │   -5.92 │ characters │
├────┼────────┼─────────────┼─────────┼────────────┤
│  3 │ -10.47 │ abbreviated │   -5.92 │ story      │
├────┼────────┼─────────────┼─────────┼────────────┤
│  4 │ -10.47 │ abel        │   -5.90 │ comedy     │
├────┼────────┼─────────────┼─────────┼────────────┤
│  5 │ -10.47 │ abhors      │   -5.69 │ just       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  6 │ -10.47 │ abiding     │   -5.19 │ like       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  7 │ -10.47 │ ably        │   -5.06 │ bad        │
├────┼────────┼─────────────┼─────────┼────────────┤
│  8 │ -10.47 │ aborted     │   -4.84 │ film       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  9 │ -10.47 │ abrahams    │   -4.31 │ movie      │
╘════╧════════╧═════════════╧═════════╧════════════╛
============ Sentiment Score:  1
╒════╤════════╤═══════════╤═════════╤════════════╕
│    │   Most │ Likely    │   Least │ Likely     │
╞════╪════════╪═══════════╪═════════╪════════════╡
│  0 │ -11.32 │ abagnale  │   -5.73 │ characters │
├────┼────────┼───────────┼─────────┼────────────┤
│  1 │ -11.32 │ abbott    │   -5.73 │ bad        │
├────┼────────┼───────────┼─────────┼────────────┤
│  2 │ -11.32 │ abdul     │   -5.65 │ rrb        │
├────┼────────┼───────────┼─────────┼────────────┤
│  3 │ -11.32 │ abel      │   -5.63 │ little     │
├────┼────────┼───────────┼─────────┼────────────┤
│  4 │ -11.32 │ abilities │   -5.48 │ story      │
├────┼────────┼───────────┼─────────┼────────────┤
│  5 │ -11.32 │ ably      │   -5.44 │ just       │
├────┼────────┼───────────┼─────────┼────────────┤
│  6 │ -11.32 │ abrahams  │   -5.42 │ does       │
├────┼────────┼───────────┼─────────┼────────────┤
│  7 │ -11.32 │ abroad    │   -5.05 │ like       │
├────┼────────┼───────────┼─────────┼────────────┤
│  8 │ -11.32 │ access    │   -4.68 │ film       │
├────┼────────┼───────────┼─────────┼────────────┤
│  9 │ -11.32 │ acclaim   │   -4.57 │ movie      │
╘════╧════════╧═══════════╧═════════╧════════════╛
============ Sentiment Score:  2
╒════╤════════╤═════════════╤═════════╤════════════╕
│    │   Most │ Likely      │   Least │ Likely     │
╞════╪════════╪═════════════╪═════════╪════════════╡
│  0 │ -11.83 │ abroad      │   -5.95 │ movies     │
├────┼────────┼─────────────┼─────────┼────────────┤
│  1 │ -11.83 │ acclaim     │   -5.90 │ characters │
├────┼────────┼─────────────┼─────────┼────────────┤
│  2 │ -11.83 │ acumen      │   -5.78 │ time       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  3 │ -11.83 │ adding      │   -5.78 │ life       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  4 │ -11.83 │ admirers    │   -5.59 │ lrb        │
├────┼────────┼─────────────┼─────────┼────────────┤
│  5 │ -11.83 │ affirms     │   -5.49 │ story      │
├────┼────────┼─────────────┼─────────┼────────────┤
│  6 │ -11.83 │ aggravating │   -5.33 │ rrb        │
├────┼────────┼─────────────┼─────────┼────────────┤
│  7 │ -11.83 │ aimlessly   │   -5.29 │ like       │
├────┼────────┼─────────────┼─────────┼────────────┤
│  8 │ -11.83 │ amaze       │   -4.74 │ movie      │
├────┼────────┼─────────────┼─────────┼────────────┤
│  9 │ -11.83 │ ambiguities │   -4.68 │ film       │
╘════╧════════╧═════════════╧═════════╧════════════╛
============ Sentiment Score:  3
╒════╤════════╤═════════════╤═════════╤══════════╕
│    │   Most │ Likely      │   Least │ Likely   │
╞════╪════════╪═════════════╪═════════╪══════════╡
│  0 │ -11.47 │ aaliyah     │   -5.77 │ lrb      │
├────┼────────┼─────────────┼─────────┼──────────┤
│  1 │ -11.47 │ abbreviated │   -5.75 │ love     │
├────┼────────┼─────────────┼─────────┼──────────┤
│  2 │ -11.47 │ abc         │   -5.68 │ rrb      │
├────┼────────┼─────────────┼─────────┼──────────┤
│  3 │ -11.47 │ abhorrent   │   -5.67 │ life     │
├────┼────────┼─────────────┼─────────┼──────────┤
│  4 │ -11.47 │ abhors      │   -5.57 │ like     │
├────┼────────┼─────────────┼─────────┼──────────┤
│  5 │ -11.47 │ abomination │   -5.50 │ story    │
├────┼────────┼─────────────┼─────────┼──────────┤
│  6 │ -11.47 │ aborted     │   -5.49 │ funny    │
├────┼────────┼─────────────┼─────────┼──────────┤
│  7 │ -11.47 │ abrupt      │   -5.10 │ good     │
├────┼────────┼─────────────┼─────────┼──────────┤
│  8 │ -11.47 │ absent      │   -4.80 │ movie    │
├────┼────────┼─────────────┼─────────┼──────────┤
│  9 │ -11.47 │ absurdities │   -4.48 │ film     │
╘════╧════════╧═════════════╧═════════╧══════════╛
============ Sentiment Score:  4
╒════╤════════╤═════════════╤═════════╤══════════════╕
│    │   Most │ Likely      │   Least │ Likely       │
╞════╪════════╪═════════════╪═════════╪══════════════╡
│  0 │ -10.62 │ aaliyah     │   -5.81 │ performance  │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  1 │ -10.62 │ abagnale    │   -5.77 │ comedy       │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  2 │ -10.62 │ abandoned   │   -5.72 │ great        │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  3 │ -10.62 │ abbott      │   -5.69 │ story        │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  4 │ -10.62 │ abbreviated │   -5.64 │ performances │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  5 │ -10.62 │ abc         │   -5.46 │ good         │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  6 │ -10.62 │ abdul       │   -5.23 │ funny        │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  7 │ -10.62 │ abhorrent   │   -5.14 │ best         │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  8 │ -10.62 │ abhors      │   -4.77 │ movie        │
├────┼────────┼─────────────┼─────────┼──────────────┤
│  9 │ -10.62 │ abiding     │   -4.25 │ 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 [ ]: