Skip to content

Latest commit

 

History

History
2054 lines (1619 loc) · 128 KB

File metadata and controls

2054 lines (1619 loc) · 128 KB
import graphlab

Read some product review data

products = graphlab.SFrame('amazon_baby.gl/')

Let's explore this data

products.head()
name review rating
Planetwise Flannel Wipes These flannel wipes are
OK, but in my opinion ...
3.0
Planetwise Wipe Pouch it came early and was not
disappointed. i love ...
5.0
Annas Dream Full Quilt
with 2 Shams ...
Very soft and comfortable
and warmer than it ...
5.0
Stop Pacifier Sucking
without tears with ...
This is a product well
worth the purchase. I ...
5.0
Stop Pacifier Sucking
without tears with ...
All of my kids have cried
non-stop when I tried to ...
5.0
Stop Pacifier Sucking
without tears with ...
When the Binky Fairy came
to our house, we didn't ...
5.0
A Tale of Baby's Days
with Peter Rabbit ...
Lovely book, it's bound
tightly so you may no ...
4.0
Baby Tracker® - Daily
Childcare Journal, ...
Perfect for new parents.
We were able to keep ...
5.0
Baby Tracker® - Daily
Childcare Journal, ...
A friend of mine pinned
this product on Pinte ...
5.0
Baby Tracker® - Daily
Childcare Journal, ...
This has been an easy way
for my nanny to record ...
4.0
[10 rows x 3 columns]

Build the word count vector for each review

products['word_count'] =graphlab.text_analytics.count_words(products['review'])
products.head()
name review rating word_count
Planetwise Flannel Wipes These flannel wipes are
OK, but in my opinion ...
3.0 {'and': 5L, 'stink': 1L,
'because': 1L, 'order ...
Planetwise Wipe Pouch it came early and was not
disappointed. i love ...
5.0 {'and': 3L, 'love': 1L,
'it': 2L, 'highly': 1L, ...
Annas Dream Full Quilt
with 2 Shams ...
Very soft and comfortable
and warmer than it ...
5.0 {'and': 2L, 'quilt': 1L,
'it': 1L, 'comfortable': ...
Stop Pacifier Sucking
without tears with ...
This is a product well
worth the purchase. I ...
5.0 {'ingenious': 1L, 'and':
3L, 'love': 2L, ...
Stop Pacifier Sucking
without tears with ...
All of my kids have cried
non-stop when I tried to ...
5.0 {'and': 2L, 'parents!!':
1L, 'all': 2L, 'puppe ...
Stop Pacifier Sucking
without tears with ...
When the Binky Fairy came
to our house, we didn't ...
5.0 {'and': 2L, 'cute': 1L,
'help': 2L, 'doll': 1L, ...
A Tale of Baby's Days
with Peter Rabbit ...
Lovely book, it's bound
tightly so you may no ...
4.0 {'shop': 1L, 'be': 1L,
'is': 1L, 'it': 1L, ' ...
Baby Tracker® - Daily
Childcare Journal, ...
Perfect for new parents.
We were able to keep ...
5.0 {'feeding,': 1L, 'and':
2L, 'all': 1L, 'right': ...
Baby Tracker® - Daily
Childcare Journal, ...
A friend of mine pinned
this product on Pinte ...
5.0 {'and': 1L, 'help': 1L,
'give': 1L, 'is': 1L, ...
Baby Tracker® - Daily
Childcare Journal, ...
This has been an easy way
for my nanny to record ...
4.0 {'journal.': 1L, 'all':
1L, 'standarad': 1L, ...
[10 rows x 4 columns]
graphlab.canvas.set_target('ipynb')
products['name'].show()

Explore Vulli Sophie

giraffe_reviews = products[products['name'] == 'Vulli Sophie the Giraffe Teether']
len(giraffe_reviews)
giraffe_reviews
name review rating word_count
Vulli Sophie the Giraffe
Teether ...
He likes chewing on all
the parts especially the ...
5.0 {'and': 1L, 'all': 1L,
'because': 1L, 'it': 1L, ...
Vulli Sophie the Giraffe
Teether ...
My son loves this toy and
fits great in the diaper ...
5.0 {'and': 1L, 'right': 1L,
'help': 1L, 'just': 1L, ...
Vulli Sophie the Giraffe
Teether ...
There really should be a
large warning on the ...
1.0 {'and': 2L, 'all': 1L,
'latex.': 1L, 'being': ...
Vulli Sophie the Giraffe
Teether ...
All the moms in my moms'
group got Sophie for ...
5.0 {'and': 2L, 'one!': 1L,
'all': 1L, 'love': 1L, ...
Vulli Sophie the Giraffe
Teether ...
I was a little skeptical
on whether Sophie was ...
5.0 {'and': 3L, 'all': 1L,
'old': 1L, 'her.': 1L, ...
Vulli Sophie the Giraffe
Teether ...
I have been reading about
Sophie and was going ...
5.0 {'and': 6L, 'seven': 1L,
'already': 1L, 'love': ...
Vulli Sophie the Giraffe
Teether ...
My neice loves her sophie
and has spent hours ...
5.0 {'and': 4L, 'drooling,':
1L, 'love': 1L, 'her.': ...
Vulli Sophie the Giraffe
Teether ...
What a friendly face!
And those mesmerizing ...
5.0 {'and': 3L, 'chew': 1L,
"don't": 1L, 'is': 1L, ...
Vulli Sophie the Giraffe
Teether ...
We got this just for my
son to chew on instea ...
5.0 {'chew': 2L, 'because':
1L, 'just': 2L, 'what': ...
Vulli Sophie the Giraffe
Teether ...
My baby seems to like
this toy, but I could ...
3.0 {'and': 2L, 'already':
1L, 'in': 1L, 'some': ...
[785 rows x 4 columns]
Note: Only the head of the SFrame is printed.
You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.
giraffe_reviews['rating'].show(view='Categorical')

Build a sentiment classifier

 products['rating'].show(view = 'Categorical')

Define what's a postive and a negative sentiment

#ignore all 3* reviews
products = products[products['rating'] != 3]
#positive sentiment = 4* or 5* reviews
products['sentiment'] = products['rating'] >= 4
products.head()
name review rating word_count sentiment
Planetwise Wipe Pouch it came early and was not
disappointed. i love ...
5.0 {'and': 3L, 'love': 1L,
'it': 2L, 'highly': 1L, ...
1
Annas Dream Full Quilt
with 2 Shams ...
Very soft and comfortable
and warmer than it ...
5.0 {'and': 2L, 'quilt': 1L,
'it': 1L, 'comfortable': ...
1
Stop Pacifier Sucking
without tears with ...
This is a product well
worth the purchase. I ...
5.0 {'ingenious': 1L, 'and':
3L, 'love': 2L, ...
1
Stop Pacifier Sucking
without tears with ...
All of my kids have cried
non-stop when I tried to ...
5.0 {'and': 2L, 'parents!!':
1L, 'all': 2L, 'puppe ...
1
Stop Pacifier Sucking
without tears with ...
When the Binky Fairy came
to our house, we didn't ...
5.0 {'and': 2L, 'cute': 1L,
'help': 2L, 'doll': 1L, ...
1
A Tale of Baby's Days
with Peter Rabbit ...
Lovely book, it's bound
tightly so you may no ...
4.0 {'shop': 1L, 'be': 1L,
'is': 1L, 'it': 1L, ' ...
1
Baby Tracker® - Daily
Childcare Journal, ...
Perfect for new parents.
We were able to keep ...
5.0 {'feeding,': 1L, 'and':
2L, 'all': 1L, 'right': ...
1
Baby Tracker® - Daily
Childcare Journal, ...
A friend of mine pinned
this product on Pinte ...
5.0 {'and': 1L, 'help': 1L,
'give': 1L, 'is': 1L, ...
1
Baby Tracker® - Daily
Childcare Journal, ...
This has been an easy way
for my nanny to record ...
4.0 {'journal.': 1L, 'all':
1L, 'standarad': 1L, ...
1
Baby Tracker® - Daily
Childcare Journal, ...
I love this journal and
our nanny uses it ...
4.0 {'all': 1L, 'forget': 1L,
'just': 1L, "daughter ...
1
[10 rows x 5 columns]
products['sentiment'].sum()
140259L

Let's train the sentiment classifier

train_data,test_data = products.random_split(.8, seed=0)
sentiment_model = graphlab.logistic_classifier.create(train_data,
                                                     target = 'sentiment',
                                                     features = ['word_count'],
                                                     validation_set = test_data)
WARNING: The number of feature dimensions in this problem is very large in comparison with the number of examples. Unless an appropriate regularization value is set, this model may not provide accurate predictions for a validation/test set.
Logistic regression:
--------------------------------------------------------
Number of examples          : 133448
Number of classes           : 2
Number of feature columns   : 1
Number of unpacked features : 219217
Number of coefficients    : 219218
Starting L-BFGS
--------------------------------------------------------
+-----------+----------+-----------+--------------+-------------------+---------------------+
| Iteration | Passes   | Step size | Elapsed Time | Training-accuracy | Validation-accuracy |
+-----------+----------+-----------+--------------+-------------------+---------------------+
| 1         | 5        | 0.000002  | 1.862498     | 0.841481          | 0.839989            |
| 2         | 9        | 3.000000  | 3.323145     | 0.947425          | 0.894877            |
| 3         | 10       | 3.000000  | 3.927555     | 0.923768          | 0.866232            |
| 4         | 11       | 3.000000  | 4.626296     | 0.971779          | 0.912743            |
| 5         | 12       | 3.000000  | 5.344024     | 0.975511          | 0.908900            |
| 6         | 13       | 3.000000  | 6.121510     | 0.899991          | 0.825967            |
| 10        | 18       | 1.000000  | 9.149221     | 0.988715          | 0.916256            |
+-----------+----------+-----------+--------------+-------------------+---------------------+
TERMINATED: Iteration limit reached.
This model may not be optimal. To improve it, consider increasing `max_iterations`.

Evaluate the sentiment model

sentiment_model.evaluate(test_data, metric='roc_curve')
{'roc_curve': Columns:
 	threshold	float
 	fpr	float
 	tpr	float
 	p	int
 	n	int
 
 Rows: 100001
 
 Data:
 +-----------+----------------+----------------+-------+------+
 | threshold |      fpr       |      tpr       |   p   |  n   |
 +-----------+----------------+----------------+-------+------+
 |    0.0    |      1.0       |      1.0       | 27976 | 5328 |
 |   1e-05   | 0.909346846847 | 0.998856162425 | 27976 | 5328 |
 |   2e-05   | 0.896021021021 | 0.998748927652 | 27976 | 5328 |
 |   3e-05   | 0.886448948949 | 0.998462968259 | 27976 | 5328 |
 |   4e-05   | 0.879692192192 | 0.998284243637 | 27976 | 5328 |
 |   5e-05   | 0.875187687688 | 0.998212753789 | 27976 | 5328 |
 |   6e-05   | 0.872184684685 | 0.998177008865 | 27976 | 5328 |
 |   7e-05   | 0.868618618619 | 0.998034029168 | 27976 | 5328 |
 |   8e-05   | 0.864677177177 | 0.997998284244 | 27976 | 5328 |
 |   9e-05   | 0.860735735736 | 0.997962539319 | 27976 | 5328 |
 +-----------+----------------+----------------+-------+------+
 [100001 rows x 5 columns]
 Note: Only the head of the SFrame is printed.
 You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.}
sentiment_model.show(view='Evaluation')

Applying the learned model to understand sentiment for Giraffe

giraffe_reviews['predicted_sentiment'] = sentiment_model.predict(giraffe_reviews, 
                                                                 output_type='probability')
giraffe_reviews.head()
name review rating word_count predicted_sentiment
Vulli Sophie the Giraffe
Teether ...
He likes chewing on all
the parts especially the ...
5.0 {'and': 1L, 'all': 1L,
'because': 1L, 'it': 1L, ...
0.999513023521
Vulli Sophie the Giraffe
Teether ...
My son loves this toy and
fits great in the diaper ...
5.0 {'and': 1L, 'right': 1L,
'help': 1L, 'just': 1L, ...
0.999320678306
Vulli Sophie the Giraffe
Teether ...
There really should be a
large warning on the ...
1.0 {'and': 2L, 'all': 1L,
'latex.': 1L, 'being': ...
0.013558811687
Vulli Sophie the Giraffe
Teether ...
All the moms in my moms'
group got Sophie for ...
5.0 {'and': 2L, 'one!': 1L,
'all': 1L, 'love': 1L, ...
0.995769474148
Vulli Sophie the Giraffe
Teether ...
I was a little skeptical
on whether Sophie was ...
5.0 {'and': 3L, 'all': 1L,
'old': 1L, 'her.': 1L, ...
0.662374415673
Vulli Sophie the Giraffe
Teether ...
I have been reading about
Sophie and was going ...
5.0 {'and': 6L, 'seven': 1L,
'already': 1L, 'love': ...
0.999997148186
Vulli Sophie the Giraffe
Teether ...
My neice loves her sophie
and has spent hours ...
5.0 {'and': 4L, 'drooling,':
1L, 'love': 1L, 'her.': ...
0.989190989536
Vulli Sophie the Giraffe
Teether ...
What a friendly face!
And those mesmerizing ...
5.0 {'and': 3L, 'chew': 1L,
"don't": 1L, 'is': 1L, ...
0.999563518413
Vulli Sophie the Giraffe
Teether ...
We got this just for my
son to chew on instea ...
5.0 {'chew': 2L, 'because':
1L, 'just': 2L, 'what': ...
0.970160542725
Vulli Sophie the Giraffe
Teether ...
My baby seems to like
this toy, but I could ...
3.0 {'and': 2L, 'already':
1L, 'in': 1L, 'some': ...
0.195367644588
[10 rows x 5 columns]

Sort the reviews based on the predicted sentiment and explore

giraffe_reviews = giraffe_reviews.sort('predicted_sentiment', ascending=False)
giraffe_reviews.head()
name review rating word_count predicted_sentiment
Vulli Sophie the Giraffe
Teether ...
Sophie, oh Sophie, your
time has come. My ...
5.0 {'giggles': 1L, 'all':
1L, "violet's": 2L, ...
1.0
Vulli Sophie the Giraffe
Teether ...
I'm not sure why Sophie
is such a hit with the ...
4.0 {'peace': 1L, 'month':
1L, 'bright': 1L, ...
0.999999999703
Vulli Sophie the Giraffe
Teether ...
I'll be honest...I bought
this toy because all the ...
4.0 {'all': 2L, 'pops': 1L,
'existence.': 1L, ...
0.999999999392
Vulli Sophie the Giraffe
Teether ...
We got this little
giraffe as a gift from a ...
5.0 {'all': 2L, "don't": 1L,
'(literally).so': 1L, ...
0.99999999919
Vulli Sophie the Giraffe
Teether ...
As a mother of 16month
old twins; I bought ...
5.0 {'cute': 1L, 'all': 1L,
'reviews.': 2L, 'just': ...
0.999999998657
Vulli Sophie the Giraffe
Teether ...
Sophie the Giraffe is the
perfect teething toy. ...
5.0 {'just': 2L, 'both': 1L,
'month': 1L, 'ears,': ...
0.999999997108
Vulli Sophie the Giraffe
Teether ...
Sophie la giraffe is
absolutely the best toy ...
5.0 {'and': 5L, 'the': 1L,
'all': 1L, 'old': 1L, ...
0.999999995589
Vulli Sophie the Giraffe
Teether ...
My 5-mos old son took to
this immediately. The ...
5.0 {'just': 1L, 'shape': 2L,
'mutt': 1L, '"dog': 1L, ...
0.999999995573
Vulli Sophie the Giraffe
Teether ...
My nephews and my four
kids all had Sophie in ...
5.0 {'and': 4L, 'chew': 1L,
'all': 1L, 'perfect;': ...
0.999999989527
Vulli Sophie the Giraffe
Teether ...
Never thought I'd see my
son French kissing a ...
5.0 {'giggles': 1L, 'all':
1L, 'out,': 1L, 'over': ...
0.999999985069
[10 rows x 5 columns]
giraffe_reviews[0]['review']
"Sophie, oh Sophie, your time has come. My granddaughter, Violet is 5 months old and starting to teeth. What joy little Sophie brings to Violet. Sophie is made of a very pliable rubber that is sturdy but not tough. It is quite easy for Violet to twist Sophie into unheard of positions to get Sophie into her mouth. The little nose and hooves fit perfectly into small mouths, and the drooling has purpose. The paint on Sophie is food quality.Sophie was born in 1961 in France. The maker had wondered why there was nothing available for babies and made Sophie from the finest rubber, phthalate-free on St Sophie's Day, thus the name was born. Since that time millions of Sophie's populate the world. She is soft and for babies little hands easy to grasp. Violet especially loves the bumpy head and horns of Sophie. Sophie has a long neck that easy to grasp and twist. She has lovely, sizable spots that attract Violet's attention. Sophie has happy little squeaks that bring squeals of delight from Violet. She is able to make Sophie squeak and that brings much joy. Sophie's smooth skin is soothing to Violet's little gums. Sophie is 7 inches tall and is the exact correct size for babies to hold and love.As you well know the first thing babies grasp, goes into their mouths- how wonderful to have a toy that stimulates all of the senses and helps with the issue of teething. Sophie is small enough to fit into any size pocket or bag. Sophie is the perfect find for babies from a few months to a year old. How wonderful to hear the giggles and laughs that emanate from babies who find Sophie irresistible. Viva La Sophie!Highly Recommended.  prisrob 12-11-09"
giraffe_reviews[1]['review']
"I'm not sure why Sophie is such a hit with the little ones, but my 7 month old baby girl is one of her adoring fans.  The rubber is softer and more pleasant to handle, and my daughter has enjoyed chewing on her legs and the nubs on her head even before she started teething.  She also loves the squeak that Sophie makes when you squeeze her.  Not sure what it is but if Sophie is amongst a pile of her other toys, my daughter will more often than not reach for Sophie.  And I have the peace of mind of knowing that only edible and safe paints and materials have been used to make Sophie, as opposed to Bright Starts and other baby toys made in China.  Now that the research is out on phthalates and other toxic substances in baby toys, I think it's more important than ever to find good quality toys that are also safe for our babies to handle and put in their mouths.  Sophie is a must-have for every new mom in my opinion.  Even if your kid is one of the few that can take or leave her, it's worth a try.  Vulli, the makers of Sophie, also make natural rubber teething rings that my daughter loves as well."

Show most negative reviews

giraffe_reviews[-1]['review']
"My son (now 2.5) LOVED his Sophie, and I bought one for every baby shower I've gone to. Now, my daughter (6 months) just today nearly choked on it and I will never give it to her again. Had I not been within hearing range it could have been fatal. The strange sound she was making caught my attention and when I went to her and found the front curved leg shoved well down her throat and her face a purply/blue I panicked. I pulled it out and she vomited all over the carpet before screaming her head off. I can't believe how my opinion of this toy has changed from a must-have to a must-not-use. Please don't disregard any of the choking hazard comments, they are not over exaggerated!"
giraffe_reviews[-2]['review']
"This children's toy is nostalgic and very cute. However, there is a distinct rubber smell and a very odd taste, yes I tried it, that my baby did not enjoy. Also, if it is soiled it is extremely difficult to clean as the rubber is a kind of porus material and does not clean well. The final thing is the squeaking device inside which stopped working after the first couple of days. I returned this item feeling I had overpaid for a toy that was defective and did not meet my expectations. Please do not be swayed by the cute packaging and hype surounding it as I was. One more thing, I was given a full refund from Amazon without any problem."

Assignment :

selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate']
'''
def awesome_count(word_count):
    if 'awesome' in word_count:
        return word_count['awesome']
    else:
        return 0
        
products['awesome'] = products['word_count'].apply(awesome_count)
'''
"\ndef awesome_count(word_count):\n    if 'awesome' in word_count:\n        return word_count['awesome']\n    else:\n        return 0\n        \nproducts['awesome'] = products['word_count'].apply(awesome_count)\n"
#adding the columns for the selected words with their respective counts in each review
for this_word in selected_words:
    products[this_word] = products['word_count'].apply(lambda dic: dic.get(this_word, 0))
    
    
products.head()
name review rating word_count sentiment awesome
Planetwise Wipe Pouch it came early and was not
disappointed. i love ...
5.0 {'and': 3L, 'love': 1L,
'it': 2L, 'highly': 1L, ...
1 0
Annas Dream Full Quilt
with 2 Shams ...
Very soft and comfortable
and warmer than it ...
5.0 {'and': 2L, 'quilt': 1L,
'it': 1L, 'comfortable': ...
1 0
Stop Pacifier Sucking
without tears with ...
This is a product well
worth the purchase. I ...
5.0 {'ingenious': 1L, 'and':
3L, 'love': 2L, ...
1 0
Stop Pacifier Sucking
without tears with ...
All of my kids have cried
non-stop when I tried to ...
5.0 {'and': 2L, 'parents!!':
1L, 'all': 2L, 'puppe ...
1 0
Stop Pacifier Sucking
without tears with ...
When the Binky Fairy came
to our house, we didn't ...
5.0 {'and': 2L, 'cute': 1L,
'help': 2L, 'doll': 1L, ...
1 0
A Tale of Baby's Days
with Peter Rabbit ...
Lovely book, it's bound
tightly so you may no ...
4.0 {'shop': 1L, 'be': 1L,
'is': 1L, 'it': 1L, ' ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
Perfect for new parents.
We were able to keep ...
5.0 {'feeding,': 1L, 'and':
2L, 'all': 1L, 'right': ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
A friend of mine pinned
this product on Pinte ...
5.0 {'and': 1L, 'help': 1L,
'give': 1L, 'is': 1L, ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
This has been an easy way
for my nanny to record ...
4.0 {'journal.': 1L, 'all':
1L, 'standarad': 1L, ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
I love this journal and
our nanny uses it ...
4.0 {'all': 1L, 'forget': 1L,
'just': 1L, "daughter ...
1 0
great fantastic amazing love horrible bad terrible awful wow hate
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0
[10 rows x 16 columns]
products[2]['review']
'This is a product well worth the purchase.  I have not found anything else like this, and it is a positive, ingenious approach to losing the binky.  What I love most about this product is how much ownership my daughter has in getting rid of the binky.  She is so proud of herself, and loves her little fairy.  I love the artwork, the chart in the back, and the clever approach of this tool.'
#a = graphlab.SArray(data = [0] * len(selected_words), dtype=long)
#a = [0] * len(selected_words)
#word_total =  graphlab.SFrame({'word': selected_words, 'count' : a})
dict = {}
for w in selected_words:
    dict[w] = 0
for this_word in selected_words:
    dict[this_word] = products[this_word].sum()
dict
{'amazing': 1305L,
 'awesome': 2002L,
 'awful': 345L,
 'bad': 3197L,
 'fantastic': 873L,
 'great': 42420L,
 'hate': 1057L,
 'horrible': 659L,
 'love': 40277L,
 'terrible': 673L,
 'wow': 131L}
max_count_word = sorted(dict.items(),key=lambda x: x[1], reverse= True)[0][0]
min_count_word = sorted(dict.items(),key=lambda x: x[1])[0][0]
print max_count_word, min_count_word
great wow

Building the sentiment model based on selected words

products.head()
name review rating word_count sentiment awesome
Planetwise Wipe Pouch it came early and was not
disappointed. i love ...
5.0 {'and': 3L, 'love': 1L,
'it': 2L, 'highly': 1L, ...
1 0
Annas Dream Full Quilt
with 2 Shams ...
Very soft and comfortable
and warmer than it ...
5.0 {'and': 2L, 'quilt': 1L,
'it': 1L, 'comfortable': ...
1 0
Stop Pacifier Sucking
without tears with ...
This is a product well
worth the purchase. I ...
5.0 {'ingenious': 1L, 'and':
3L, 'love': 2L, ...
1 0
Stop Pacifier Sucking
without tears with ...
All of my kids have cried
non-stop when I tried to ...
5.0 {'and': 2L, 'parents!!':
1L, 'all': 2L, 'puppe ...
1 0
Stop Pacifier Sucking
without tears with ...
When the Binky Fairy came
to our house, we didn't ...
5.0 {'and': 2L, 'cute': 1L,
'help': 2L, 'doll': 1L, ...
1 0
A Tale of Baby's Days
with Peter Rabbit ...
Lovely book, it's bound
tightly so you may no ...
4.0 {'shop': 1L, 'be': 1L,
'is': 1L, 'it': 1L, ' ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
Perfect for new parents.
We were able to keep ...
5.0 {'feeding,': 1L, 'and':
2L, 'all': 1L, 'right': ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
A friend of mine pinned
this product on Pinte ...
5.0 {'and': 1L, 'help': 1L,
'give': 1L, 'is': 1L, ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
This has been an easy way
for my nanny to record ...
4.0 {'journal.': 1L, 'all':
1L, 'standarad': 1L, ...
1 0
Baby Tracker® - Daily
Childcare Journal, ...
I love this journal and
our nanny uses it ...
4.0 {'all': 1L, 'forget': 1L,
'just': 1L, "daughter ...
1 0
great fantastic amazing love horrible bad terrible awful wow hate
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0
[10 rows x 16 columns]
train_data,test_data = products.random_split(.8, seed=0)
selected_words_model = graphlab.logistic_classifier.create(train_data,
                                                           target='sentiment',
                                                           features=selected_words,
                                                           validation_set=test_data)
Logistic regression:
--------------------------------------------------------
Number of examples          : 133448
Number of classes           : 2
Number of feature columns   : 11
Number of unpacked features : 11
Number of coefficients    : 12
Starting Newton Method
--------------------------------------------------------
+-----------+----------+--------------+-------------------+---------------------+
| Iteration | Passes   | Elapsed Time | Training-accuracy | Validation-accuracy |
+-----------+----------+--------------+-------------------+---------------------+
| 1         | 2        | 0.222334     | 0.844299          | 0.842842            |
| 2         | 3        | 0.394792     | 0.844186          | 0.842842            |
| 3         | 4        | 0.533828     | 0.844276          | 0.843142            |
| 4         | 5        | 0.653923     | 0.844269          | 0.843142            |
| 5         | 6        | 0.777535     | 0.844269          | 0.843142            |
| 6         | 7        | 0.901868     | 0.844269          | 0.843142            |
+-----------+----------+--------------+-------------------+---------------------+
SUCCESS: Optimal solution found.

Max and Min weights assigned words

selected_words_model['coefficients']
name index class value stderr
(intercept) None 1 1.36728315229 0.00861805467824
awesome None 1 1.05800888878 0.110865296265
great None 1 0.883937894898 0.0217379527921
fantastic None 1 0.891303090304 0.154532343591
amazing None 1 0.892802422508 0.127989503231
love None 1 1.39989834302 0.0287147460124
horrible None 1 -1.99651800559 0.0973584169028
bad None 1 -0.985827369929 0.0433603009142
terrible None 1 -2.09049998487 0.0967241912229
awful None 1 -1.76469955631 0.134679803365
[12 rows x 5 columns]
Note: Only the head of the SFrame is printed.
You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.
weights = selected_words_model['coefficients'].sort('value', ascending = False)
max_weight_word = weights[0]['name']
min_weight_word = weights[-1]['name']

print max_weight_word, min_weight_word
love terrible

Evaluate selected_words_model

selected_words_model.evaluate(test_data)
{'accuracy': 0.8431419649291376,
 'auc': 0.6648096413721418,
 'confusion_matrix': Columns:
 	target_label	int
 	predicted_label	int
 	count	int
 
 Rows: 4
 
 Data:
 +--------------+-----------------+-------+
 | target_label | predicted_label | count |
 +--------------+-----------------+-------+
 |      0       |        0        |  234  |
 |      1       |        0        |  130  |
 |      0       |        1        |  5094 |
 |      1       |        1        | 27846 |
 +--------------+-----------------+-------+
 [4 rows x 3 columns],
 'f1_score': 0.914242563530107,
 'log_loss': 0.405474711036565,
 'precision': 0.8453551912568306,
 'recall': 0.9953531598513011,
 'roc_curve': Columns:
 	threshold	float
 	fpr	float
 	tpr	float
 	p	int
 	n	int
 
 Rows: 100001
 
 Data:
 +-----------+-----+-----+-------+------+
 | threshold | fpr | tpr |   p   |  n   |
 +-----------+-----+-----+-------+------+
 |    0.0    | 1.0 | 1.0 | 27976 | 5328 |
 |   1e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   2e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   3e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   4e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   5e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   6e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   7e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   8e-05   | 1.0 | 1.0 | 27976 | 5328 |
 |   9e-05   | 1.0 | 1.0 | 27976 | 5328 |
 +-----------+-----+-----+-------+------+
 [100001 rows x 5 columns]
 Note: Only the head of the SFrame is printed.
 You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.}
sentiment_model.evaluate(test_data)
{'accuracy': 0.916256305548883,
 'auc': 0.9446492867438502,
 'confusion_matrix': Columns:
 	target_label	int
 	predicted_label	int
 	count	int
 
 Rows: 4
 
 Data:
 +--------------+-----------------+-------+
 | target_label | predicted_label | count |
 +--------------+-----------------+-------+
 |      1       |        0        |  1461 |
 |      0       |        1        |  1328 |
 |      0       |        0        |  4000 |
 |      1       |        1        | 26515 |
 +--------------+-----------------+-------+
 [4 rows x 3 columns],
 'f1_score': 0.9500349343413533,
 'log_loss': 0.261066984324221,
 'precision': 0.9523039902309378,
 'recall': 0.9477766657134686,
 'roc_curve': Columns:
 	threshold	float
 	fpr	float
 	tpr	float
 	p	int
 	n	int
 
 Rows: 100001
 
 Data:
 +-----------+----------------+----------------+-------+------+
 | threshold |      fpr       |      tpr       |   p   |  n   |
 +-----------+----------------+----------------+-------+------+
 |    0.0    |      1.0       |      1.0       | 27976 | 5328 |
 |   1e-05   | 0.909346846847 | 0.998856162425 | 27976 | 5328 |
 |   2e-05   | 0.896021021021 | 0.998748927652 | 27976 | 5328 |
 |   3e-05   | 0.886448948949 | 0.998462968259 | 27976 | 5328 |
 |   4e-05   | 0.879692192192 | 0.998284243637 | 27976 | 5328 |
 |   5e-05   | 0.875187687688 | 0.998212753789 | 27976 | 5328 |
 |   6e-05   | 0.872184684685 | 0.998177008865 | 27976 | 5328 |
 |   7e-05   | 0.868618618619 | 0.998034029168 | 27976 | 5328 |
 |   8e-05   | 0.864677177177 | 0.997998284244 | 27976 | 5328 |
 |   9e-05   | 0.860735735736 | 0.997962539319 | 27976 | 5328 |
 +-----------+----------------+----------------+-------+------+
 [100001 rows x 5 columns]
 Note: Only the head of the SFrame is printed.
 You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.}

Interpreting the difference in performance between the models

'''amazon_products = graphlab.SFrame('amazon_baby.gl/')
amazon_products = amazon_products[amazon_products['rating'] != 3]
amazon_products['sentiment'] = amazon_products['rating'] >= 4
'''

diaper_champ_reviews = products[products['name'] == 'Baby Trend Diaper Champ']

sentiment_model

diaper_champ_reviews['predicted_sentiment_all'] = sentiment_model.predict(diaper_champ_reviews, output_type='probability')
diaper_champ_reviews = diaper_champ_reviews.sort('predicted_sentiment_all', ascending=False)
diaper_champ_reviews.head()
name review rating word_count sentiment awesome
Baby Trend Diaper Champ Baby Luke can turn a
clean diaper to a dirty ...
5.0 {'all': 1L, 'less': 1L,
"friend's": 1L, '(whi ...
1 0
Baby Trend Diaper Champ I LOOOVE this diaper
pail! Its the easies ...
5.0 {'just': 1L, 'over': 1L,
'rweek': 1L, 'sooo': 1L, ...
1 0
Baby Trend Diaper Champ We researched all of the
different types of di ...
4.0 {'all': 2L, 'just': 4L,
"don't": 2L, 'one,': 1L, ...
1 0
Baby Trend Diaper Champ My baby is now 8 months
and the can has been ...
5.0 {"don't": 1L, 'when': 1L,
'over': 1L, 'soon': 1L, ...
1 0
Baby Trend Diaper Champ This is absolutely, by
far, the best diaper ...
5.0 {'just': 3L, 'money': 1L,
'not': 2L, 'mechanism': ...
1 0
Baby Trend Diaper Champ Diaper Champ or Diaper
Genie? That was my ...
5.0 {'all': 1L, 'bags.': 1L,
'son,': 1L, '(i': 1L, ...
1 0
Baby Trend Diaper Champ Wow! This is fabulous.
It was a toss-up between ...
5.0 {'and': 4L, '"genie".':
1L, 'since': 1L, ...
1 0
Baby Trend Diaper Champ I originally put this
item on my baby registry ...
5.0 {'lysol': 1L, 'all': 2L,
'bags.': 1L, 'feedback': ...
1 0
Baby Trend Diaper Champ Two girlfriends and two
family members put me ...
5.0 {'just': 1L, 'when': 1L,
'both': 1L, 'results': ...
1 0
Baby Trend Diaper Champ I am one of those super-
critical shoppers who ...
5.0 {'taller': 1L, 'bags.':
1L, 'just': 1L, "don't": ...
1 0
great fantastic amazing love horrible bad terrible awful wow hate predicted_sentiment_all
0 0 0 0 0 0 0 0 0 0 0.999999937267
0 0 0 1 0 0 0 0 0 0 0.999999917406
0 0 0 0 0 1 0 0 0 0 0.999999899509
2 0 0 0 0 1 0 0 0 0 0.999999836182
0 0 0 2 0 0 0 0 0 0 0.999999824745
0 0 0 0 0 0 0 0 0 0 0.999999759315
0 0 0 0 0 0 0 0 0 0 0.999999692111
0 0 0 0 0 0 0 0 0 0 0.999999642488
0 0 0 0 1 0 0 0 0 0 0.999999604504
0 0 0 1 0 0 0 0 0 0 0.999999486804
[10 rows x 17 columns]

selected_word_model

'''
diaper_champ_reviews['predicted_sentiment_selected'] = selected_words_model.predict(diaper_champ_reviews, output_type='probability')
diaper_champ_reviews = diaper_champ_reviews.sort('predicted_sentiment_selected', ascending=False)
'''
diaper_champ_reviews[0:1]['review']
dtype: str
Rows: 1
['Baby Luke can turn a clean diaper to a dirty diaper in 3 seconds flat. The diaper champ turns the smelly diaper into "what diaper smell" in less time than that. I hesitated and wondered what I REALLY needed for the nursery. This is one of the best purchases we made. The champ, the baby bjorn, fluerville diaper bag, and graco pack and play bassinet all vie for the best baby purchase.Great product, easy to use, economical, effective, absolutly fabulous.UpdateI knew that I loved the champ, and useing the diaper genie at a friend's house REALLY reinforced that!! There is no comparison, the chanp is easy and smell free, the genie was difficult to use one handed (which is absolutly vital if you have a little one on a changing pad) and there was a deffinite odor eminating from the genieplus we found that the quick tie garbage bags where the ties are integrated into the bag work really well because there isn't any added bulk around the sealing edge of the champ.']
selected_words_model.predict(diaper_champ_reviews[0:1], output_type='probability')
dtype: float
Rows: 1
[0.796940851290671]

Majority Class Classifier

test_count = test_data.num_rows()

positive = test_data['sentiment'].sum()
accuracy = float(positive) / test_count
accuracy
0.8400192169108815