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 [11]:
## =======================================================
## 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_v1 = 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', 
                             token_pattern=r'(?u)\b[a-zA-Z]{2,}\b' )

bigram_cv = CountVectorizer(encoding='latin-1', ngram_range=(1,2), min_df=5, stop_words='english')
bigram_cv_v2 = CountVectorizer(encoding='latin-1', ngram_range=(1,2), min_df=5, stop_words='english', 
                               token_pattern=r'(?u)\b[a-zA-Z]{2,}\b')

unigram_tv = TfidfVectorizer(encoding='latin-1', use_idf=True, min_df=5, stop_words='english')
unigram_tv_v2 = TfidfVectorizer(encoding='latin-1', use_idf=True, min_df=5, stop_words='english', 
                                token_pattern=r'(?u)\b[a-zA-Z]{2,}\b')

bigram_tv = TfidfVectorizer(encoding='latin-1', use_idf=True, ngram_range=(1,2), min_df=5, stop_words='english')
bigram_tv_v2 = TfidfVectorizer(encoding='latin-1', use_idf=True, ngram_range=(1,2), min_df=5, stop_words='english', 
                               token_pattern=r'(?u)\b[a-zA-Z]{2,}\b')

## =======================================================
## 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)
    y_pred = clf.predict(X_test_vec)
    report = classification_report(y_test, y_pred, target_names=target_names,output_dict=True)
    score = clf.score(X_test_vec,y_test)
    return clf, score, report
    
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, score, report = run_classifier(X_train_vec, X_test_vec, y_train, y_test, labels, target_names, classifier)
    return model, score, report
    
## =======================================================
## 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"))

def update_big_df(big_df, new_row):
    big_df.append(new_row)
    df = pd.DataFrame(big_df)
    df = df.drop_duplicates()
    return df

DATA GOES HERE:

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


import pandas as pd
df = pd.read_csv('../death_row_discritized.csv')

def to_string(tokens):
    try:
        return " ".join(eval(tokens))
    except:
        return "error"
    
df['statement_string'] = df.apply(lambda x: to_string(x['last_statement']), axis=1)
# y=df['vic_kid'].values
y=df['vic_male'].values
X=df['statement_string'].values

TASK 1

TEST 1 -- MNB & SVM with Vectorizer 1

In [64]:
big_df = []
In [65]:
vec = unigram_bool_cv_v1
classifier = mnb

model, score, report = get_model(X,y,['yes', 'no'],['yes', 'no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V1', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤════════════╤═════════╤══════════════════════╕
│    │   Most │ Likely     │   Least │ Likely               │
╞════╪════════╪════════════╪═════════╪══════════════════════╡
│  0 │  -7.54 │ asked      │   -4.38 │ yes                  │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  1 │  -7.54 │ big        │   -4.28 │ god                  │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  2 │  -7.54 │ days       │   -4.23 │ want                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  3 │  -7.54 │ miss       │   -4.17 │ thank                │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  4 │  -7.54 │ place      │   -4.11 │ know                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  5 │  -7.54 │ supporters │   -4.09 │ like                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  6 │  -7.14 │ glad       │   -3.90 │ family               │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  7 │  -7.14 │ mrs        │   -3.52 │ love                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  8 │  -7.14 │ ms         │   -3.21 │ pronoun              │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  9 │  -7.14 │ situation  │   -3.16 │ first_person_pronoun │
╘════╧════════╧════════════╧═════════╧══════════════════════╛
Out[65]:
classifier vectorizer score
0 mnb V1 0.555066
In [66]:
vec = unigram_bool_cv_v1
classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V1', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │ Likely   │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │  -1.17 │ wanted   │    0.76 │ say      │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.17 │ id       │    0.77 │ theres   │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -1.16 │ days     │    0.80 │ body     │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -1.12 │ mama     │    0.80 │ death    │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -1.06 │ free     │    0.84 │ kill     │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -1.06 │ hold     │    0.85 │ grace    │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -0.99 │ hearts   │    0.90 │ ill      │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -0.98 │ today    │    0.95 │ oh       │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -0.88 │ told     │    1.02 │ came     │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -0.82 │ crime    │    1.09 │ sister   │
╘════╧════════╧══════════╧═════════╧══════════╛
Out[66]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203

NOTES: Very interesting!! MNB is very cluttered with numbers. SVM is not.

TEST 2 -- MNB & SVM with Vectorizer 2

In [67]:
vec = unigram_bool_cv_v2
classifier = mnb


model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V2', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤════════════╤═════════╤══════════╕
│    │   Most │ Likely     │   Least │ Likely   │
╞════╪════════╪════════════╪═════════╪══════════╡
│  0 │  -7.50 │ asked      │   -4.34 │ say      │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -7.50 │ big        │   -4.34 │ yes      │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -7.50 │ days       │   -4.24 │ god      │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -7.50 │ miss       │   -4.18 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -7.50 │ place      │   -4.13 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -7.50 │ supporters │   -4.06 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -7.09 │ glad       │   -4.05 │ like     │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -7.09 │ mrs        │   -3.86 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -7.09 │ ms         │   -3.47 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -7.09 │ situation  │   -3.17 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
Out[67]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
In [68]:
vec = unigram_bool_cv_v2
classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V2', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │ Likely   │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │  -1.17 │ wanted   │    0.76 │ say      │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.17 │ days     │    0.77 │ theres   │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -1.16 │ id       │    0.80 │ body     │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -1.12 │ mama     │    0.80 │ death    │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -1.07 │ free     │    0.84 │ kill     │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -1.06 │ hold     │    0.85 │ grace    │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -1.00 │ hearts   │    0.90 │ ill      │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -0.98 │ today    │    0.95 │ oh       │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -0.88 │ told     │    1.02 │ came     │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -0.82 │ crime    │    1.08 │ sister   │
╘════╧════════╧══════════╧═════════╧══════════╛
Out[68]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203

TEST 3 -- MNB & SVM with Vectorizer 3

In [69]:
vec = unigram_cv
classifier = mnb


model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V3', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤════════════╤═════════╤══════════╕
│    │   Most │ Likely     │   Least │ Likely   │
╞════╪════════╪════════════╪═════════╪══════════╡
│  0 │  -8.02 │ asked      │   -4.34 │ yall     │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -8.02 │ big        │   -4.33 │ sorry    │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -8.02 │ miss       │   -4.24 │ god      │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -8.02 │ place      │   -4.11 │ like     │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -8.02 │ supporters │   -4.09 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -7.61 │ days       │   -4.08 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -7.61 │ mrs        │   -3.89 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -7.61 │ ms         │   -3.83 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -7.61 │ situation  │   -3.02 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -7.61 │ touch      │   -1.63 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
Out[69]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
In [70]:
vec = unigram_cv
classifier = svm


model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)

df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V3', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │ Likely   │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │  -1.08 │ mama     │    0.65 │ grace    │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.05 │ place    │    0.68 │ look     │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -1.01 │ miss     │    0.68 │ thanks   │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -0.99 │ hold     │    0.69 │ home     │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -0.94 │ hearts   │    0.70 │ feel     │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -0.80 │ left     │    0.74 │ ones     │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -0.77 │ crime    │    0.81 │ theres   │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -0.77 │ helped   │    0.83 │ hurt     │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -0.76 │ free     │    0.98 │ ill      │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -0.74 │ id       │    1.14 │ sister   │
╘════╧════════╧══════════╧═════════╧══════════╛
Out[70]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581

TEST 4 -- MNB & SVM with Vectorizer 4

In [71]:
vec = bigram_cv
classifier = mnb

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V4', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V4', 'score': score})
df
============ Sentiment Score:  0
╒════╤════════╤═════════════════════════════╤═════════╤═══════════════════════════════════════════╕
│    │   Most │ Likely                      │   Least │ Likely                                    │
╞════╪════════╪═════════════════════════════╪═════════╪═══════════════════════════════════════════╡
│  0 │  -8.71 │ asked                       │   -4.78 │ thank                                     │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  1 │  -8.71 │ big                         │   -4.58 │ family                                    │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  2 │  -8.71 │ first_person_pronoun die    │   -4.58 │ first_person_pronoun first_person_pronoun │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  3 │  -8.71 │ first_person_pronoun think  │   -4.52 │ know                                      │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  4 │  -8.71 │ help pronoun                │   -4.19 │ love pronoun                              │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  5 │  -8.71 │ lord forgive                │   -4.07 │ pronoun first_person_pronoun              │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  6 │  -8.71 │ miss                        │   -3.94 │ first_person_pronoun love                 │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  7 │  -8.71 │ place                       │   -3.71 │ love                                      │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  8 │  -8.71 │ supporters                  │   -2.32 │ pronoun                                   │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  9 │  -8.30 │ caused first_person_pronoun │   -1.86 │ first_person_pronoun                      │
╘════╧════════╧═════════════════════════════╧═════════╧═══════════════════════════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════════╤═════════╤═════════════════════════════╕
│    │   Most │ Likely        │   Least │ Likely                      │
╞════╪════════╪═══════════════╪═════════╪═════════════════════════════╡
│  0 │  -0.81 │ lord pronoun  │    0.45 │ say pronoun                 │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  1 │  -0.80 │ pronoun mom   │    0.45 │ theres                      │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  2 │  -0.69 │ mama          │    0.49 │ thanks                      │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  3 │  -0.66 │ hold          │    0.49 │ peace                       │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  4 │  -0.61 │ pronoun thats │    0.49 │ first_person_pronoun ready  │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  5 │  -0.56 │ jesus         │    0.50 │ father first_person_pronoun │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  6 │  -0.56 │ loved pronoun │    0.54 │ goodbye                     │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  7 │  -0.56 │ place         │    0.63 │ statement                   │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  8 │  -0.54 │ forever       │    0.67 │ ill                         │
├────┼────────┼───────────────┼─────────┼─────────────────────────────┤
│  9 │  -0.54 │ free          │    0.73 │ soon                        │
╘════╧════════╧═══════════════╧═════════╧═════════════════════════════╛
/Users/danielcaraway/anaconda3/lib/python3.7/site-packages/sklearn/svm/base.py:929: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)
Out[71]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
In [72]:
df
Out[72]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203

TEST 5 -- MNB & SVM with Vectorizer 5

In [73]:
vec = bigram_cv_v2
classifier = mnb


model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V5', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V5', 'score': score})
============ Sentiment Score:  0
╒════╤════════╤════════════════╤═════════╤═════════════════╕
│    │   Most │ Likely         │   Least │ Likely          │
╞════╪════════╪════════════════╪═════════╪═════════════════╡
│  0 │  -8.31 │ asked          │   -4.53 │ god             │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  1 │  -8.31 │ big            │   -4.40 │ like            │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  2 │  -8.31 │ help pronoun   │   -4.38 │ want            │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  3 │  -8.31 │ lord forgive   │   -4.37 │ pronoun pronoun │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  4 │  -8.31 │ miss           │   -4.37 │ thank           │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  5 │  -8.31 │ place          │   -4.18 │ family          │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  6 │  -8.31 │ pronoun people │   -4.12 │ know            │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  7 │  -8.31 │ supporters     │   -3.79 │ love pronoun    │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  8 │  -7.90 │ days           │   -3.31 │ love            │
├────┼────────┼────────────────┼─────────┼─────────────────┤
│  9 │  -7.90 │ family loved   │   -1.92 │ pronoun         │
╘════╧════════╧════════════════╧═════════╧═════════════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════════╤═════════╤════════════════╕
│    │   Most │ Likely        │   Least │ Likely         │
╞════╪════════╪═══════════════╪═════════╪════════════════╡
│  0 │  -0.83 │ loved pronoun │    0.54 │ like tell      │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  1 │  -0.81 │ mama          │    0.56 │ family thank   │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  2 │  -0.81 │ pronoun mom   │    0.56 │ statement      │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  3 │  -0.80 │ free          │    0.56 │ thank lord     │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  4 │  -0.76 │ lord pronoun  │    0.57 │ caused pronoun │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  5 │  -0.68 │ hearts        │    0.58 │ know pronoun   │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  6 │  -0.68 │ crime         │    0.62 │ goodbye        │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  7 │  -0.67 │ peace god     │    0.63 │ sister         │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  8 │  -0.67 │ hold          │    0.66 │ soon           │
├────┼────────┼───────────────┼─────────┼────────────────┤
│  9 │  -0.67 │ left          │    0.80 │ ill            │
╘════╧════════╧═══════════════╧═════════╧════════════════╛
In [74]:
df
Out[74]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366

TEST 6 -- MNB & SVM with Vectorizer 6

In [75]:
vec = unigram_tv
classifier = mnb


model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V6', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V6', 'score': score})
============ Sentiment Score:  0
╒════╤════════╤════════════╤═════════╤══════════════════════╕
│    │   Most │ Likely     │   Least │ Likely               │
╞════╪════════╪════════════╪═════════╪══════════════════════╡
│  0 │  -6.74 │ miss       │   -4.70 │ say                  │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  1 │  -6.71 │ days       │   -4.67 │ want                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  2 │  -6.68 │ asked      │   -4.66 │ thank                │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  3 │  -6.67 │ touch      │   -4.64 │ know                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  4 │  -6.67 │ place      │   -4.60 │ like                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  5 │  -6.65 │ mama       │   -4.58 │ im                   │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  6 │  -6.65 │ big        │   -4.51 │ family               │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  7 │  -6.65 │ whats      │   -3.94 │ love                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  8 │  -6.64 │ members    │   -2.92 │ pronoun              │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  9 │  -6.64 │ supporters │   -2.50 │ first_person_pronoun │
╘════╧════════╧════════════╧═════════╧══════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │ Likely   │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │  -1.59 │ place    │    0.83 │ look     │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.59 │ hold     │    0.89 │ theres   │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -1.43 │ sorry    │    0.91 │ come     │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -1.36 │ crime    │    0.92 │ like     │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -1.10 │ mama     │    0.99 │ really   │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -1.10 │ free     │    1.03 │ ill      │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -1.07 │ hearts   │    1.04 │ bring    │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -1.03 │ mercy    │    1.24 │ home     │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -1.03 │ days     │    1.29 │ say      │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -1.03 │ wanted   │    1.31 │ sister   │
╘════╧════════╧══════════╧═════════╧══════════╛
In [76]:
df
Out[76]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366
10 mnb V6 0.603524
11 svm V6 0.511013

TEST 7 -- MNB & SVM with Vectorizer 7

In [77]:
vec = unigram_tv_v2
classifier = mnb

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V7', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V7', 'score': score})
============ Sentiment Score:  0
╒════╤════════╤════════════╤═════════╤══════════╕
│    │   Most │ Likely     │   Least │ Likely   │
╞════╪════════╪════════════╪═════════╪══════════╡
│  0 │  -6.73 │ miss       │   -4.63 │ yall     │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -6.69 │ asked      │   -4.58 │ say      │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -6.69 │ days       │   -4.56 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -6.68 │ place      │   -4.53 │ im       │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -6.65 │ big        │   -4.52 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -6.64 │ touch      │   -4.51 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -6.63 │ whats      │   -4.46 │ like     │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -6.61 │ mama       │   -4.34 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -6.61 │ members    │   -3.79 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -6.60 │ supporters │   -2.78 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
============ Sentiment Score:  0
╒════╤════════╤══════════╤═════════╤══════════╕
│    │   Most │ Likely   │   Least │ Likely   │
╞════╪════════╪══════════╪═════════╪══════════╡
│  0 │  -1.64 │ place    │    0.87 │ look     │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.57 │ hold     │    0.89 │ come     │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -1.36 │ sorry    │    0.90 │ like     │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -1.34 │ crime    │    0.90 │ theres   │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -1.15 │ hearts   │    0.99 │ really   │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -1.14 │ free     │    1.03 │ bring    │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -1.13 │ days     │    1.04 │ ill      │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -1.11 │ mama     │    1.19 │ home     │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -1.05 │ wanted   │    1.25 │ say      │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -1.04 │ today    │    1.43 │ sister   │
╘════╧════════╧══════════╧═════════╧══════════╛
In [78]:
df
Out[78]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366
10 mnb V6 0.603524
11 svm V6 0.511013
12 mnb V7 0.599119
13 svm V7 0.528634

TEST 8 -- MNB & SVM with Vectorizer 8

In [79]:
vec = bigram_tv
classifier = mnb

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V8', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V8', 'score': score})
============ Sentiment Score:  0
╒════╤════════╤════════════════════════════╤═════════╤══════════════════════════════╕
│    │   Most │ Likely                     │   Least │ Likely                       │
╞════╪════════╪════════════════════════════╪═════════╪══════════════════════════════╡
│  0 │  -7.23 │ first_person_pronoun think │   -5.28 │ know                         │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  1 │  -7.22 │ help pronoun               │   -5.27 │ im                           │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  2 │  -7.22 │ miss                       │   -5.26 │ like                         │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  3 │  -7.20 │ first_person_pronoun die   │   -5.19 │ family                       │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  4 │  -7.20 │ momma first_person_pronoun │   -4.99 │ pronoun first_person_pronoun │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  5 │  -7.19 │ first_person_pronoun wont  │   -4.91 │ love pronoun                 │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  6 │  -7.19 │ days                       │   -4.82 │ first_person_pronoun love    │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  7 │  -7.18 │ heart forgive              │   -4.62 │ love                         │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  8 │  -7.17 │ lord forgive               │   -3.59 │ pronoun                      │
├────┼────────┼────────────────────────────┼─────────┼──────────────────────────────┤
│  9 │  -7.17 │ asked                      │   -3.18 │ first_person_pronoun         │
╘════╧════════╧════════════════════════════╧═════════╧══════════════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════════════════════╤═════════╤═════════════════════════════╕
│    │   Most │ Likely                    │   Least │ Likely                      │
╞════╪════════╪═══════════════════════════╪═════════╪═════════════════════════════╡
│  0 │  -1.48 │ hold                      │    0.78 │ caused pronoun              │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  1 │  -1.27 │ place                     │    0.81 │ father first_person_pronoun │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  2 │  -1.23 │ pronoun mom               │    0.81 │ truth                       │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  3 │  -1.10 │ loved pronoun             │    0.81 │ ill                         │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  4 │  -1.08 │ sorry                     │    0.84 │ say                         │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  5 │  -1.04 │ care first_person_pronoun │    0.86 │ come                        │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  6 │  -1.00 │ pronoun im                │    0.88 │ sister                      │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  7 │  -0.98 │ lord pronoun              │    0.91 │ home                        │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  8 │  -0.97 │ mama                      │    0.98 │ say first_person_pronoun    │
├────┼────────┼───────────────────────────┼─────────┼─────────────────────────────┤
│  9 │  -0.94 │ today                     │    1.10 │ love first_person_pronoun   │
╘════╧════════╧═══════════════════════════╧═════════╧═════════════════════════════╛
In [80]:
df
Out[80]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366
10 mnb V6 0.603524
11 svm V6 0.511013
12 mnb V7 0.599119
13 svm V7 0.528634
14 mnb V8 0.603524
15 svm V8 0.528634

TEST 9 -- MNB & SVM with Vectorizer 9

In [81]:
vec = bigram_tv_v2
classifier = mnb

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'mnb', 'vectorizer': 'V9', 'score': score})

classifier = svm

model, score, report = get_model(X,y,['yes','no'],['yes','no'], classifier, vec)
return_features(vec, model)
df = update_big_df(big_df,{ 'classifier': 'svm', 'vectorizer': 'V9', 'score': score})
============ Sentiment Score:  0
╒════╤════════╤════════════════╤═════════╤══════════════╕
│    │   Most │ Likely         │   Least │ Likely       │
╞════╪════════╪════════════════╪═════════╪══════════════╡
│  0 │  -7.06 │ help pronoun   │   -5.06 │ say          │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  1 │  -7.05 │ miss           │   -5.02 │ im           │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  2 │  -7.01 │ asked          │   -5.01 │ want         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  3 │  -7.00 │ lord forgive   │   -4.97 │ thank        │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  4 │  -7.00 │ heart forgive  │   -4.96 │ know         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  5 │  -7.00 │ sorry hope     │   -4.93 │ like         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  6 │  -6.99 │ pronoun people │   -4.83 │ family       │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  7 │  -6.99 │ days           │   -4.58 │ love pronoun │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  8 │  -6.99 │ place          │   -4.27 │ love         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  9 │  -6.96 │ big            │   -3.25 │ pronoun      │
╘════╧════════╧════════════════╧═════════╧══════════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════════╤═════════╤═════════════════╕
│    │   Most │ Likely        │   Least │ Likely          │
╞════╪════════╪═══════════════╪═════════╪═════════════════╡
│  0 │  -1.44 │ hold          │    0.78 │ happening       │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  1 │  -1.40 │ place         │    0.79 │ pronoun love    │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  2 │  -1.30 │ sorry         │    0.82 │ ill             │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  3 │  -1.25 │ crime         │    0.83 │ pronoun pronoun │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  4 │  -1.18 │ pronoun mom   │    0.87 │ caused pronoun  │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  5 │  -1.16 │ lord pronoun  │    0.92 │ come            │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  6 │  -1.12 │ free          │    0.94 │ say             │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  7 │  -1.10 │ loved pronoun │    0.95 │ friends         │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  8 │  -1.03 │ mama          │    0.98 │ home            │
├────┼────────┼───────────────┼─────────┼─────────────────┤
│  9 │  -1.02 │ days          │    1.11 │ sister          │
╘════╧════════╧═══════════════╧═════════╧═════════════════╛
In [82]:
df
Out[82]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366
10 mnb V6 0.603524
11 svm V6 0.511013
12 mnb V7 0.599119
13 svm V7 0.528634
14 mnb V8 0.603524
15 svm V8 0.528634
16 mnb V9 0.599119
17 svm V9 0.515419
In [83]:
# pred_vec = bigram_cv_v2

# test = pd.read_csv("kaggle-sentiment/test.tsv", delimiter='\t')
# k_id = test['PhraseId'].values
# k_text = test['Phrase'].values

# k_vec = bigram_cv_v2.transform(k_text)
# k_vec

# def get_kaggle_test_train_vec(X,y,vectorizer):
#     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=None, 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 do_the_kaggle(X,y,vec):
#     X_train_vec, X_test_vec, y_train, y_test = get_kaggle_test_train_vec(X,y,vec)
#     svm_clf = LinearSVC(C=1)
#     prediction = svm_clf.fit(X_train_vec,y_train).predict(k_vec)
#     kaggle_submission = zip(k_id, prediction)
#     outf=open('kaggle_submission_linearSVC_v5.csv', 'w')
#     outf.write('PhraseId,Sentiment\n')
#     for x, value in enumerate(kaggle_submission): outf.write(str(value[0]) + ',' + str(value[1]) + '\n')
#     outf.close()
#     print('prediction complete')

# do_the_kaggle(X,y,bigram_cv_v2)
In [84]:
df
Out[84]:
classifier vectorizer score
0 mnb V1 0.555066
1 svm V1 0.502203
2 mnb V2 0.555066
3 svm V2 0.502203
4 mnb V3 0.533040
5 svm V3 0.484581
6 mnb V4 0.533040
7 svm V4 0.502203
8 mnb V5 0.502203
9 svm V5 0.471366
10 mnb V6 0.603524
11 svm V6 0.511013
12 mnb V7 0.599119
13 svm V7 0.528634
14 mnb V8 0.603524
15 svm V8 0.528634
16 mnb V9 0.599119
17 svm V9 0.515419
In [ ]:
 
In [ ]:
 
In [ ]: