线性分类器:Logistic Regression
2016-11-29 19:18
232 查看
本内容整理自coursera.欢迎交流转载。
假设我们有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我们认为结果的准确程度。
每次我们仅仅做一个判断,比如苹果还是非苹果?猫还是非猫?狗还是非狗?树还是非树?
假如我有四类要划分(也就是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).于是最终的结果便是这四个值中最大的一个。
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'])
相关文章推荐
- 【2017年cs231n学习笔记1】Lecture2 K近邻 距离度量 超参数 交叉验证 线性分类器
- cs231n笔记 (一) 线性分类器
- 斯坦福CS231n 课程学习笔记--线性分类器(Assignment1代码实现)
- SVM入门(三)线性分类器Part 2
- SVM入门(五)线性分类器的求解——问题的描述Part2
- 分类学习-线性分类器
- SVM入门(四)线性分类器的求解——问题的描述Part1
- SVM入门(六)线性分类器的求解――问题的转化,直观角度
- SVM入门(二三)线性分类器
- SVM入门(二)线性分类器Part 1
- 一个自带简易数据集的模拟线性分类器matlab代码——实验训练
- SVM入门——线性分类器的求解,核函数
- svm理论与实验之5: 线性分类器的求解
- 机器学习之线性分类器(Linear Classifiers)——肿瘤预测实例
- 线性回归, 逻辑回归和线性分类器
- 一个自带简易数据集的模拟线性分类器matlab代码——实验训练
- SVM入门(四)线性分类器的求解——问题的描述Part1
- 模式识别: 线性分类器
- 线性判别分析(二)——Bayes最优分类器的角度看LDA
- 线性分类器