In [6]:
import IPython
import numpy as np
import pandas as pd
from tsa.science import numpy_ext as npx
import viz
import viz.stats
import viz.format
from sklearn import metrics, cross_validation
from sklearn import linear_model
from sklearn import naive_bayes
from sklearn import svm
from sklearn import feature_selection
from tsa import stdout, stderr
from tsa.lib import tabular, datetime_extra
from tsa.lib.timer import Timer
from tsa.models import Source, Document, create_session
from tsa.science import features, models, timeseries
from tsa.science.corpora import MulticlassCorpus
from tsa.science.plot import plt, figure_path, distinct_styles, ticker
from tsa.science.summarization import metrics_dict, metrics_summary, average_accuracy
In [2]:
documents = Source.from_name('sb5b')
full_corpus = MulticlassCorpus(documents)
full_corpus.apply_labelfunc(lambda doc: doc.label)
In [4]:
full_corpus.labels
Out[4]:
In [15]:
tri_classes = [full_corpus.class_lookup[label] for label in ['For', 'Against', 'Neutral']]
tri_indices = np.in1d(full_corpus.y, tri_classes)
tri_corpus = full_corpus.subset(tri_indices)
tri_corpus.extract_features(lambda doc: 1, features.intercept)
tri_corpus.extract_features(lambda doc: doc.document, features.ngrams,
ngram_max=2, min_df=2, max_df=1.0)
Out[15]:
In [16]:
npx.table(tri_corpus.y)
Out[16]:
In [7]:
average_accuracy(tri_corpus, linear_model.LogisticRegression(fit_intercept=False, penalty='l2'))
Out[7]:
In [27]:
folds = list(cross_validation.StratifiedShuffleSplit(tri_corpus.y, test_size=0.75, n_iter=10))
corpus = tri_corpus
train_indices, test_indices = folds[0]
train_corpus = corpus.subset(train_indices)
test_corpus = corpus.subset(test_indices)
model = linear_model.LogisticRegression(fit_intercept=False, penalty='l1')
model.fit(train_corpus.X, train_corpus.y)
pred_y = model.predict(test_corpus.X)
confusion_counts = metrics.confusion_matrix(test_corpus.y, pred_y)
print 'overall accuracy', metrics.accuracy_score(test_corpus.y, pred_y)
print 'true labels on the rows, predicted labels in the columns'
pd.DataFrame(confusion_counts, index=corpus.labels[tri_classes], columns=corpus.labels[tri_classes])
Out[27]:
In [23]:
Out[23]:
In [22]:
tri_classes
Out[22]:
In [ ]: