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 [41]:
# 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_female'].values
X=df['statement_string'].values

TASK 1

TEST 1 -- MNB & SVM with Vectorizer 1

In [42]:
big_df = []
In [43]:
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.43 │ aint       │   -4.34 │ like                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  1 │  -7.43 │ committed  │   -4.28 │ thank                │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  2 │  -7.43 │ especially │   -4.24 │ god                  │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  3 │  -7.43 │ faith      │   -4.22 │ want                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  4 │  -7.43 │ grief      │   -4.20 │ im                   │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  5 │  -7.43 │ supported  │   -4.18 │ know                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  6 │  -7.03 │ allowed    │   -3.92 │ family               │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  7 │  -7.03 │ best       │   -3.61 │ love                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  8 │  -7.03 │ body       │   -3.25 │ pronoun              │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  9 │  -7.03 │ chance     │   -3.21 │ first_person_pronoun │
╘════╧════════╧════════════╧═════════╧══════════════════════╛
Out[43]:
classifier vectorizer score
0 mnb V1 0.550661
In [44]:
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.18 │ bring     │    0.91 │ house    │
├────┼────────┼───────────┼─────────┼──────────┤
│  1 │  -0.99 │ feel      │    0.92 │ hold     │
├────┼────────┼───────────┼─────────┼──────────┤
│  2 │  -0.98 │ theres    │    0.95 │ mama     │
├────┼────────┼───────────┼─────────┼──────────┤
│  3 │  -0.93 │ father    │    0.97 │ miss     │
├────┼────────┼───────────┼─────────┼──────────┤
│  4 │  -0.93 │ oh        │    1.04 │ today    │
├────┼────────┼───────────┼─────────┼──────────┤
│  5 │  -0.90 │ ill       │    1.09 │ okay     │
├────┼────────┼───────────┼─────────┼──────────┤
│  6 │  -0.89 │ aint      │    1.11 │ coming   │
├────┼────────┼───────────┼─────────┼──────────┤
│  7 │  -0.88 │ execution │    1.11 │ free     │
├────┼────────┼───────────┼─────────┼──────────┤
│  8 │  -0.87 │ body      │    1.13 │ killed   │
├────┼────────┼───────────┼─────────┼──────────┤
│  9 │  -0.85 │ supported │    1.21 │ david    │
╘════╧════════╧═══════════╧═════════╧══════════╛
Out[44]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256

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

TEST 2 -- MNB & SVM with Vectorizer 2

In [45]:
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.39 │ aint       │   -4.32 │ sorry    │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -7.39 │ committed  │   -4.30 │ like     │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -7.39 │ especially │   -4.24 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -7.39 │ faith      │   -4.19 │ god      │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -7.39 │ grief      │   -4.17 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -7.39 │ supported  │   -4.15 │ im       │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -6.99 │ allowed    │   -4.13 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -6.99 │ best       │   -3.88 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -6.99 │ body       │   -3.56 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -6.99 │ chance     │   -3.21 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
Out[45]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
In [46]:
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.16 │ bring     │    0.89 │ id       │
├────┼────────┼───────────┼─────────┼──────────┤
│  1 │  -1.00 │ aint      │    0.92 │ hold     │
├────┼────────┼───────────┼─────────┼──────────┤
│  2 │  -0.99 │ feel      │    0.92 │ house    │
├────┼────────┼───────────┼─────────┼──────────┤
│  3 │  -0.96 │ theres    │    1.00 │ miss     │
├────┼────────┼───────────┼─────────┼──────────┤
│  4 │  -0.93 │ oh        │    1.06 │ today    │
├────┼────────┼───────────┼─────────┼──────────┤
│  5 │  -0.92 │ ill       │    1.06 │ coming   │
├────┼────────┼───────────┼─────────┼──────────┤
│  6 │  -0.91 │ father    │    1.10 │ killed   │
├────┼────────┼───────────┼─────────┼──────────┤
│  7 │  -0.91 │ body      │    1.12 │ okay     │
├────┼────────┼───────────┼─────────┼──────────┤
│  8 │  -0.89 │ execution │    1.17 │ free     │
├────┼────────┼───────────┼─────────┼──────────┤
│  9 │  -0.89 │ supported │    1.23 │ david    │
╘════╧════════╧═══════════╧═════════╧══════════╛
Out[46]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445

TEST 3 -- MNB & SVM with Vectorizer 3

In [47]:
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 │  -7.87 │ aint       │   -4.21 │ im       │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -7.87 │ committed  │   -4.19 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -7.87 │ especially │   -4.09 │ yall     │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -7.87 │ faith      │   -4.06 │ god      │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -7.87 │ grief      │   -4.06 │ sorry    │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -7.87 │ supported  │   -4.02 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -7.46 │ allowed    │   -3.99 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -7.46 │ body       │   -3.90 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -7.46 │ chance     │   -3.09 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -7.46 │ face       │   -1.70 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
Out[47]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
In [48]:
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.10 │ theres   │    0.76 │ hold     │
├────┼────────┼──────────┼─────────┼──────────┤
│  1 │  -1.03 │ time     │    0.85 │ better   │
├────┼────────┼──────────┼─────────┼──────────┤
│  2 │  -0.92 │ feel     │    0.86 │ gave     │
├────┼────────┼──────────┼─────────┼──────────┤
│  3 │  -0.90 │ faith    │    0.88 │ guess    │
├────┼────────┼──────────┼─────────┼──────────┤
│  4 │  -0.90 │ bring    │    0.89 │ free     │
├────┼────────┼──────────┼─────────┼──────────┤
│  5 │  -0.88 │ aint     │    0.94 │ okay     │
├────┼────────┼──────────┼─────────┼──────────┤
│  6 │  -0.87 │ really   │    1.00 │ think    │
├────┼────────┼──────────┼─────────┼──────────┤
│  7 │  -0.79 │ someday  │    1.02 │ letter   │
├────┼────────┼──────────┼─────────┼──────────┤
│  8 │  -0.77 │ ill      │    1.15 │ today    │
├────┼────────┼──────────┼─────────┼──────────┤
│  9 │  -0.76 │ long     │    1.17 │ waiting  │
╘════╧════════╧══════════╧═════════╧══════════╛
/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[48]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203

TEST 4 -- MNB & SVM with Vectorizer 4

In [49]:
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 │  -9.25 │ ah first_person_pronoun    │   -4.71 │ know                                      │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  1 │  -8.56 │ aint                       │   -4.69 │ thank                                     │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  2 │  -8.56 │ bring pronoun              │   -4.60 │ family                                    │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  3 │  -8.56 │ committed                  │   -4.42 │ first_person_pronoun first_person_pronoun │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  4 │  -8.56 │ especially                 │   -4.20 │ love pronoun                              │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  5 │  -8.56 │ faith                      │   -4.17 │ pronoun first_person_pronoun              │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  6 │  -8.56 │ first_person_pronoun right │   -4.01 │ first_person_pronoun love                 │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  7 │  -8.56 │ grief                      │   -3.79 │ love                                      │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  8 │  -8.56 │ pronoun head               │   -2.39 │ pronoun                                   │
├────┼────────┼────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  9 │  -8.56 │ pronoun like               │   -1.85 │ first_person_pronoun                      │
╘════╧════════╧════════════════════════════╧═════════╧═══════════════════════════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤════════════════════════════╤═════════╤═══════════════╕
│    │   Most │ Likely                     │   Least │ Likely        │
╞════╪════════╪════════════════════════════╪═════════╪═══════════════╡
│  0 │  -0.88 │ statement                  │    0.56 │ jesus         │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  1 │  -0.87 │ theres                     │    0.57 │ pronoun thats │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  2 │  -0.81 │ goodbye                    │    0.60 │ ms            │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  3 │  -0.80 │ ill                        │    0.61 │ free          │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  4 │  -0.76 │ ready warden               │    0.61 │ doing         │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  5 │  -0.73 │ first_person_pronoun ready │    0.62 │ yall pronoun  │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  6 │  -0.71 │ sorry first_person_pronoun │    0.63 │ miss          │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  7 │  -0.69 │ die                        │    0.78 │ coming        │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  8 │  -0.67 │ aint                       │    0.80 │ today         │
├────┼────────┼────────────────────────────┼─────────┼───────────────┤
│  9 │  -0.59 │ bring                      │    0.95 │ pronoun mom   │
╘════╧════════╧════════════════════════════╧═════════╧═══════════════╛
/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[49]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
In [50]:
df
Out[50]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066

TEST 5 -- MNB & SVM with Vectorizer 5

In [51]:
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.84 │ pronoun really │   -4.47 │ want         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  1 │  -8.15 │ aint           │   -4.38 │ yall         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  2 │  -8.15 │ bring pronoun  │   -4.34 │ god          │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  3 │  -8.15 │ committed      │   -4.34 │ sorry        │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  4 │  -8.15 │ especially     │   -4.30 │ know         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  5 │  -8.15 │ faith          │   -4.28 │ thank        │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  6 │  -8.15 │ grief          │   -4.19 │ family       │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  7 │  -8.15 │ pronoun head   │   -3.79 │ love pronoun │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  8 │  -8.15 │ supported      │   -3.37 │ love         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  9 │  -7.74 │ allowed        │   -1.98 │ pronoun      │
╘════╧════════╧════════════════╧═════════╧══════════════╛
============ Sentiment Score:  0
╒════╤════════╤══════════════╤═════════╤════════════════╕
│    │   Most │ Likely       │   Least │ Likely         │
╞════╪════════╪══════════════╪═════════╪════════════════╡
│  0 │  -0.93 │ theres       │    0.67 │ hold           │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  1 │  -0.90 │ sorry did    │    0.70 │ peace god      │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  2 │  -0.82 │ ill          │    0.71 │ love everybody │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  3 │  -0.82 │ goodbye      │    0.74 │ miss           │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  4 │  -0.76 │ aint         │    0.77 │ free           │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  5 │  -0.74 │ statement    │    0.78 │ truth          │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  6 │  -0.71 │ time         │    0.79 │ ms             │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  7 │  -0.69 │ mom love     │    0.89 │ today          │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  8 │  -0.67 │ thank lord   │    0.97 │ pronoun mom    │
├────┼────────┼──────────────┼─────────┼────────────────┤
│  9 │  -0.65 │ ready warden │    1.03 │ coming         │
╘════╧════════╧══════════════╧═════════╧════════════════╛
In [52]:
df
Out[52]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013

TEST 6 -- MNB & SVM with Vectorizer 6

In [53]:
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.66 │ faith      │   -4.79 │ want                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  1 │  -6.63 │ body       │   -4.71 │ god                  │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  2 │  -6.63 │ face       │   -4.65 │ thank                │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  3 │  -6.62 │ grief      │   -4.64 │ family               │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  4 │  -6.61 │ night      │   -4.64 │ sorry                │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  5 │  -6.60 │ human      │   -4.51 │ yall                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  6 │  -6.57 │ aint       │   -4.39 │ im                   │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  7 │  -6.56 │ especially │   -4.04 │ love                 │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  8 │  -6.56 │ showed     │   -3.00 │ pronoun              │
├────┼────────┼────────────┼─────────┼──────────────────────┤
│  9 │  -6.55 │ supported  │   -2.55 │ first_person_pronoun │
╘════╧════════╧════════════╧═════════╧══════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════╤═════════╤══════════╕
│    │   Most │ Likely    │   Least │ Likely   │
╞════╪════════╪═══════════╪═════════╪══════════╡
│  0 │  -1.57 │ bring     │    0.96 │ did      │
├────┼────────┼───────────┼─────────┼──────────┤
│  1 │  -1.24 │ really    │    1.00 │ told     │
├────┼────────┼───────────┼─────────┼──────────┤
│  2 │  -1.22 │ theres    │    1.11 │ okay     │
├────┼────────┼───────────┼─────────┼──────────┤
│  3 │  -1.14 │ aint      │    1.14 │ loved    │
├────┼────────┼───────────┼─────────┼──────────┤
│  4 │  -1.01 │ ill       │    1.14 │ free     │
├────┼────────┼───────────┼─────────┼──────────┤
│  5 │  -0.98 │ statement │    1.20 │ today    │
├────┼────────┼───────────┼─────────┼──────────┤
│  6 │  -0.95 │ someday   │    1.21 │ ms       │
├────┼────────┼───────────┼─────────┼──────────┤
│  7 │  -0.93 │ faith     │    1.25 │ hold     │
├────┼────────┼───────────┼─────────┼──────────┤
│  8 │  -0.92 │ past      │    1.26 │ coming   │
├────┼────────┼───────────┼─────────┼──────────┤
│  9 │  -0.92 │ die       │    1.26 │ better   │
╘════╧════════╧═══════════╧═════════╧══════════╛
In [54]:
df
Out[54]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013
10 mnb V6 0.594714
11 svm V6 0.537445

TEST 7 -- MNB & SVM with Vectorizer 7

In [55]:
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.68 │ faith      │   -4.68 │ know     │
├────┼────────┼────────────┼─────────┼──────────┤
│  1 │  -6.61 │ night      │   -4.67 │ want     │
├────┼────────┼────────────┼─────────┼──────────┤
│  2 │  -6.61 │ grief      │   -4.60 │ god      │
├────┼────────┼────────────┼─────────┼──────────┤
│  3 │  -6.61 │ body       │   -4.50 │ thank    │
├────┼────────┼────────────┼─────────┼──────────┤
│  4 │  -6.61 │ face       │   -4.50 │ family   │
├────┼────────┼────────────┼─────────┼──────────┤
│  5 │  -6.60 │ human      │   -4.48 │ sorry    │
├────┼────────┼────────────┼─────────┼──────────┤
│  6 │  -6.56 │ especially │   -4.41 │ yall     │
├────┼────────┼────────────┼─────────┼──────────┤
│  7 │  -6.56 │ aint       │   -4.33 │ im       │
├────┼────────┼────────────┼─────────┼──────────┤
│  8 │  -6.54 │ supported  │   -3.91 │ love     │
├────┼────────┼────────────┼─────────┼──────────┤
│  9 │  -6.54 │ times      │   -2.86 │ pronoun  │
╘════╧════════╧════════════╧═════════╧══════════╛
============ Sentiment Score:  0
╒════╤════════╤═══════════╤═════════╤══════════╕
│    │   Most │ Likely    │   Least │ Likely   │
╞════╪════════╪═══════════╪═════════╪══════════╡
│  0 │  -1.63 │ bring     │    1.03 │ told     │
├────┼────────┼───────────┼─────────┼──────────┤
│  1 │  -1.33 │ really    │    1.06 │ letter   │
├────┼────────┼───────────┼─────────┼──────────┤
│  2 │  -1.23 │ theres    │    1.13 │ loved    │
├────┼────────┼───────────┼─────────┼──────────┤
│  3 │  -1.17 │ aint      │    1.14 │ okay     │
├────┼────────┼───────────┼─────────┼──────────┤
│  4 │  -1.02 │ ill       │    1.16 │ free     │
├────┼────────┼───────────┼─────────┼──────────┤
│  5 │  -1.01 │ someday   │    1.20 │ hold     │
├────┼────────┼───────────┼─────────┼──────────┤
│  6 │  -1.01 │ sister    │    1.23 │ ms       │
├────┼────────┼───────────┼─────────┼──────────┤
│  7 │  -0.93 │ statement │    1.28 │ coming   │
├────┼────────┼───────────┼─────────┼──────────┤
│  8 │  -0.92 │ past      │    1.28 │ today    │
├────┼────────┼───────────┼─────────┼──────────┤
│  9 │  -0.91 │ faith     │    1.30 │ better   │
╘════╧════════╧═══════════╧═════════╧══════════╛
In [56]:
df
Out[56]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013
10 mnb V6 0.594714
11 svm V6 0.537445
12 mnb V7 0.607930
13 svm V7 0.515419

TEST 8 -- MNB & SVM with Vectorizer 8

In [57]:
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.21 │ ah first_person_pronoun     │   -5.32 │ sorry                                     │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  1 │  -7.14 │ faith                       │   -5.23 │ first_person_pronoun first_person_pronoun │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  2 │  -7.12 │ body                        │   -5.20 │ yall                                      │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  3 │  -7.12 │ face                        │   -5.10 │ im                                        │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  4 │  -7.12 │ pronoun head                │   -5.08 │ pronoun first_person_pronoun              │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  5 │  -7.12 │ grief                       │   -4.98 │ love pronoun                              │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  6 │  -7.12 │ guilty first_person_pronoun │   -4.91 │ first_person_pronoun love                 │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  7 │  -7.10 │ first_person_pronoun right  │   -4.73 │ love                                      │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  8 │  -7.10 │ human                       │   -3.68 │ pronoun                                   │
├────┼────────┼─────────────────────────────┼─────────┼───────────────────────────────────────────┤
│  9 │  -7.09 │ night                       │   -3.23 │ first_person_pronoun                      │
╘════╧════════╧═════════════════════════════╧═════════╧═══════════════════════════════════════════╛
============ Sentiment Score:  0
╒════╤════════╤════════════════════════════╤═════════╤═════════════╕
│    │   Most │ Likely                     │   Least │ Likely      │
╞════╪════════╪════════════════════════════╪═════════╪═════════════╡
│  0 │  -1.31 │ first_person_pronoun home  │    0.81 │ did         │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  1 │  -1.18 │ bring                      │    0.83 │ life        │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  2 │  -1.05 │ theres                     │    0.90 │ free        │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  3 │  -1.04 │ first_person_pronoun ready │    0.95 │ miss        │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  4 │  -1.02 │ statement                  │    1.02 │ today       │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  5 │  -1.00 │ aint                       │    1.06 │ pronoun mom │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  6 │  -1.00 │ love first_person_pronoun  │    1.07 │ ms          │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  7 │  -0.99 │ first_person_pronoun just  │    1.08 │ coming      │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  8 │  -0.96 │ goodbye                    │    1.12 │ hold        │
├────┼────────┼────────────────────────────┼─────────┼─────────────┤
│  9 │  -0.95 │ ill                        │    1.13 │ better      │
╘════╧════════╧════════════════════════════╧═════════╧═════════════╛
In [58]:
df
Out[58]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013
10 mnb V6 0.594714
11 svm V6 0.537445
12 mnb V7 0.607930
13 svm V7 0.515419
14 mnb V8 0.577093
15 svm V8 0.568282

TEST 9 -- MNB & SVM with Vectorizer 9

In [59]:
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 │ pronoun really │   -5.12 │ want         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  1 │  -6.99 │ faith          │   -5.06 │ god          │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  2 │  -6.94 │ pronoun head   │   -4.98 │ thank        │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  3 │  -6.93 │ grief          │   -4.98 │ family       │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  4 │  -6.93 │ body           │   -4.96 │ sorry        │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  5 │  -6.93 │ face           │   -4.89 │ yall         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  6 │  -6.92 │ night          │   -4.84 │ im           │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  7 │  -6.92 │ home lord      │   -4.64 │ love pronoun │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  8 │  -6.92 │ human          │   -4.40 │ love         │
├────┼────────┼────────────────┼─────────┼──────────────┤
│  9 │  -6.90 │ especially     │   -3.34 │ pronoun      │
╘════╧════════╧════════════════╧═════════╧══════════════╛
============ Sentiment Score:  0
╒════╤════════╤════════════════╤═════════╤═════════════╕
│    │   Most │ Likely         │   Least │ Likely      │
╞════╪════════╪════════════════╪═════════╪═════════════╡
│  0 │  -1.28 │ bring          │    0.98 │ crime       │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  1 │  -1.09 │ theres         │    1.01 │ pronoun mom │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  2 │  -1.08 │ aint           │    1.03 │ miss        │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  3 │  -0.99 │ goodbye        │    1.06 │ today       │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  4 │  -0.97 │ ill            │    1.07 │ free        │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  5 │  -0.92 │ statement      │    1.16 │ hold        │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  6 │  -0.91 │ really         │    1.17 │ better      │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  7 │  -0.90 │ people         │    1.18 │ did         │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  8 │  -0.90 │ faith          │    1.21 │ coming      │
├────┼────────┼────────────────┼─────────┼─────────────┤
│  9 │  -0.90 │ pronoun really │    1.23 │ ms          │
╘════╧════════╧════════════════╧═════════╧═════════════╛
In [60]:
df
Out[60]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013
10 mnb V6 0.594714
11 svm V6 0.537445
12 mnb V7 0.607930
13 svm V7 0.515419
14 mnb V8 0.577093
15 svm V8 0.568282
16 mnb V9 0.572687
17 svm V9 0.559471
In [61]:
# 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 [62]:
df
Out[62]:
classifier vectorizer score
0 mnb V1 0.550661
1 svm V1 0.546256
2 mnb V2 0.550661
3 svm V2 0.537445
4 mnb V3 0.541850
5 svm V3 0.502203
6 mnb V4 0.528634
7 svm V4 0.555066
8 mnb V5 0.519824
9 svm V5 0.511013
10 mnb V6 0.594714
11 svm V6 0.537445
12 mnb V7 0.607930
13 svm V7 0.515419
14 mnb V8 0.577093
15 svm V8 0.568282
16 mnb V9 0.572687
17 svm V9 0.559471
In [ ]:
 
In [ ]: