您的位置:首页 > 其它

线性分类器:Logistic Regression

2016-11-29 19:18 232 查看
本内容整理自coursera.欢迎交流转载。

1 回顾

  在这篇博客里我描述过直线、平面和超平面的分类。

2 逻辑回归

  什么是logistic regression?

  假设我们有N个独立向量,每个向量有D个特征x⃗ i(x0,x1,x2,...,xD),矩阵H是特征矩阵,hi(x⃗ i)=x⃗ i(xi),同时我们有系数矩阵w,那么我们可以预测y^i=sign(score(x⃗ i)),score(x⃗ i)=w0h0(x⃗ i)+w1h1(x⃗ i)+...+wDhD(x⃗ i)=∑Dj=0wjhj(x⃗ i)=w⃗ Th⃗ (x⃗ i).

  y^=11+e−w⃗ Th⃗ (x⃗ i).

  y^就是计算的事件发生的概率。

  概率大于0.5我们认为结果的准确程度。

3 one versus all model

  简单介绍一下种类很多的时候怎么使用二分类。比方有四类图片:苹果,猫,狗,树。

  每次我们仅仅做一个判断,比如苹果还是非苹果?猫还是非猫?狗还是非狗?树还是非树?

  假如我有四类要划分(也就是4个Label),它们是A、B、C、D。于是我在抽取训练集的时候,分别抽取A所对应的向量作为正集,B,C,D所对应的向量作为负集;B所对应的向量作为正集,A,C,D所对应的向量作为负集;C所对应的向量作为正集, A,B,D所对应的向量作为负集;D所对应的向量作为正集,A,B,C所对应的向量作为负集,这四个训练集分别进行训练,然后的得到四个训练结果文件,在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试,最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x).于是最终的结果便是这四个值中最大的一个。

4 代码(使用库实现,重在体验)

from __future__ import division
import graphlab
import math
import string

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

def remove_punctuation(text):
import string
return text.translate(None, string.punctuation)

products = products[products['rating'] != 3]
products['sentiment'] = products['rating'].apply(lambda rating : +1 if rating > 3 else -1)

train_data, test_data = products.random_split(.8, seed=1)

#model 1
sentiment_model = graphlab.logistic_classifier.create(train_data,target = 'sentiment',features=['word_count'],validation_set=None)

scores = sentiment_model.predict(sample_test_data, output_type='margin')
print "Class predictions according to GraphLab Create:"
print sentiment_model.predict(sample_test_data, output_type='probability')

def get_classification_accuracy(model, data, true_labels):
# First get the predictions
## YOUR CODE HERE
pres = model.predict(data)
data['pre']=pres
# Compute the number of correctly classified examples
## YOUR CODE HERE
right = data[data['pre']==data['sentiment']]
correct = len(right)

# Then compute accuracy by dividing num_correct by total number of examples
## YOUR CODE HERE
accuracy = correct/len(data)

return accuracy

get_classification_accuracy(sentiment_model, test_data, test_data['sentiment'])

#Learn another classifier with fewer words

significant_words = ['love', 'great', 'easy', 'old', 'little', 'perfect', 'loves', 'well', 'able', 'car', 'broke', 'less', 'even', 'waste', 'disappointed', 'work', 'product', 'money', 'would', 'return']
train_data['word_count_subset'] = train_data['word_count'].dict_trim_by_keys(significant_words, exclude=False)
test_data['word_count_subset'] = test_data['word_count'].dict_trim_by_keys(significant_words, exclude=False)
simple_model = graphlab.logistic_classifier.create(train_data,
target = 'sentiment', features=['word_count_subset'],validation_set=None)
get_classification_accuracy(simple_model, test_data, test_data['sentiment'])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习