如何使用机器学习.形状特征提取来提取数据的特征

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
svm文本分类中基于法向量的特征选择算法研究
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
svm文本分类中基于法向量的特征选择算法研究
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口用Python开始机器学习(5:文本特征抽取与向量化)
我的图书馆
用Python开始机器学习(5:文本特征抽取与向量化)
假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢?
这类问题就属于情感分析问题。这类问题处理的第一步,就是将文本转换为特征。
因此,这章我们只学习第一步,如何从文本中抽取特征,并将其向量化。
由于中文的处理涉及到分词问题,本文用一个简单的例子来说明如何使用Python的机器学习库,对英文进行特征提取。
1、数据准备
Python的sklearn.datasets支持从目录读取所有分类好的文本。不过目录必须按照一个文件夹一个标签名的规则放好。比如本文使用的数据集共有2个标签,一个为“net”,一个为“pos”,每个目录下面有6个文本文件。目录如下所示:neg& & 1.txt& & 2.txt& & ......
pos& & 1.txt& & 2.txt& & ....
12个文件的内容汇总起来如下所示:
[plain]&view plain&copy&
&&&&shit.&&
&&&&waste&my&money.&&
&&&&waste&of&money.&&
&&&&sb&movie.&&
&&&&waste&of&time.&&
&&&&a&shit&movie.&&
&&&&nb!&nb&movie!&&
&&&&worth&my&money.&&
&&&&I&love&this&movie!&&
&&&&a&nb&movie.&&
&&&&worth&it!&&
2、文本特征
如何从这些英文中抽取情感态度而进行分类呢?
最直观的做法就是抽取单词。通常认为,很多关键词能够反映说话者的态度。比如上面这个简单的数据集,很容易发现,凡是说了“shit”的,就一定属于neg类。
当然,上面数据集是为了方便描述而简单设计的。现实中一个词经常会有穆棱两可的态度。但是仍然有理由相信,某个单词在neg类中出现的越多,那么他表示neg态度的概率越大。
同样我们注意到有些单词对情感分类是毫无意义的。比如上述数据中的“of”,“I”之类的单词。这类词有个名字,叫“Stop_Word“(停用词)。这类词是可以完全忽略掉不做统计的。显然忽略掉这些词,词频记录的存储空间能够得到优化,而且构建速度也更快。
把每个单词的词频作为重要的特征也存在一个问题。比如上述数据中的”movie“,在12个样本中出现了5次,但是出现正反两边次数差不多,没有什么区分度。而”worth“出现了2次,但却只出现在pos类中,显然更具有强烈的刚晴色彩,即区分度很高。
因此,我们需要引入TF-IDF(Term Frequency-Inverse Document Frequency,词频和逆向文件频率)对每个单词做进一步考量。
TF(词频)的计算很简单,就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this movie”,单词“love”的TF为1/4。如果去掉停用词“I"和”it“,则为1/2。
IDF(逆向文件频率)的意义是,对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。
比如单词“movie“一共出现了5次,而文档总数为12,因此IDF为ln(5/12)。
很显然,IDF是为了凸显那种出现的少,但是占有强烈感情色彩的词语。比如“movie”这样的词的IDF=ln(12/5)=0.88,远小于“love”的IDF=ln(12/1)=2.48。
TF-IDF就是把二者简单的乘在一起即可。这样,求出每个文档中,每个单词的TF-IDF,就是我们提取得到的文本特征值。
有了上述基础,就能够将文档向量化了。我们先看代码,再来分析向量化的意义:
[python]&view plain&copy&
#&-*-&coding:&utf-8&-*-&&
import&scipy&as&sp&&
import&numpy&as&np&&
from&sklearn.datasets&import&load_files&&
from&sklearn.cross_validation&import&train_test_split&&
from&sklearn.feature_extraction.text&import&&TfidfVectorizer&&
'''''加载数据集,切分数据集80%训练,20%测试'''&&
movie_reviews&=&load_files('endata')&&&&
doc_terms_train,&doc_terms_test,&y_train,&y_test\&&
&&&&=&train_test_split(movie_reviews.data,&movie_reviews.target,&test_size&=&0.3)&&
'''''BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口'''&&
count_vec&=&TfidfVectorizer(binary&=&False,&decode_error&=&'ignore',\&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&stop_words&=&'english')&&
x_train&=&count_vec.fit_transform(doc_terms_train)&&
x_test&&=&count_vec.transform(doc_terms_test)&&
x&&&&&&&=&count_vec.transform(movie_reviews.data)&&
y&&&&&&&=&movie_reviews.target&&
print(doc_terms_train)&&
print(count_vec.get_feature_names())&&
print(x_train.toarray())&&
print(movie_reviews.target)&&
运行结果如下:
[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth'][[ 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. & & & & &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. & & & & &1. & & & &]][1 1 0 1 0 1 0 1 1 0 0 0]
python输出的比较混乱。我这里做了一个表格如下:
从上表可以发现如下几点:
1、停用词的过滤。
初始化count_vec的时候,我们在count_vec构造时传递了stop_words = 'english',表示使用默认的英文停用词。可以使用count_vec.get_stop_words()查看TfidfVectorizer内置的所有停用词。当然,在这里可以传递你自己的停用词list(比如这里的“movie”)
2、TF-IDF的计算。
这里词频的计算使用的是sklearn的TfidfVectorizer。这个类继承于CountVectorizer,在后者基本的词频统计基础上增加了如TF-IDF之类的功能。
我们会发现这里计算的结果跟我们之前计算不太一样。因为这里count_vec构造时默认传递了max_df=1,因此TF-IDF都做了规格化处理,以便将所有值约束在[0,1]之间。
3、count_vec.fit_transform的结果是一个巨大的矩阵。我们可以看到上表中有大量的0,因此sklearn在内部实现上使用了稀疏矩阵。本例子数据较小。如果读者有兴趣,可以试试机器学习科研工作者使用的真实数据,来自康奈尔大学:http://www.cs.cornell.edu/people/pabo/movie-review-data/。这个网站提供了很多数据集,其中有几个2M左右的数据库,正反例700个左右。这样的数据规模也不算大,1分钟内还是可以跑完的,建议大家试一试。不过要注意这些数据集可能存在非法字符问题。所以在构造count_vec时,传入了decode_error = 'ignore',以忽略这些非法字符。
上表的结果,就是训练8个样本的8个特征的一个结果。这个结果就可以使用各种分类算法进行分类了。
喜欢该文的人也喜欢——技术凝聚实力
专业创新出版
机器学习:数据驱动的科学
引言:传统上,计算机会按照我们输入的指令一步步执行。而机器学习却是通过输入数据而不是指令来进行各种工作。
本文选自《深入浅出深度学习:原理剖析与Python实践》。
  机器学习,也被称为统计机器学习,是人工智能领域的一个分支,其基本思想是基于数据构建统计模型,并利用模型对数据进行分析和预测的一门学科。
  传统上,如果想让计算机工作,我们会编写一段指令,然后让计算机遵照这个指令一步一步执行下去。而机器学习则是采用另一种解决问题的思路,机器学习解决问题的方式不是通过输入指令逻辑,而是通过输入的数据,也就是说,机器学习是一种让计算机利用数据而不是指令来进行各种工作的方法。
  机器学习最基本的做法是使用算法来解析数据,从数据中学习到规律,并掌握这种规律,然后对真实世界中的事件做出决策或预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习的核心是使用大量的数据来训练,通过各种算法从数据中学习如何完成任务。机器学习直接来源于早期的人工智能领域,在模式识别和计算机学习理论的研究中逐渐发展,并最终形成一门新的学科。与人工智能类似,机器学习也是一个跨学科的领域,涉及多个基础学科,包括统计学、线性代数和数值计算等。
  机器学习是基于训练数据构建统计模型,从而使计算机具有对新数据进行预测和分析的能力,机器学习方法按其实现的目标不同,可以分为:监督学习、无监督学习和强化学习。
  监督学习(Supervised Learning):监督学习使用带有标签的训练数据集进行训练,输入的训练数据由物体的特征向量(输入)和物体的标签(输出)两部分构成,其中,若输出的标签是一个连续的值,则称为回归监督学习;若输出标签是一个离散的值,则称为分类监督学习。
  监督学习涉及两个方面的工作:首先,根据提供的训练数据,选择一种合适的模型进行训练,直至模型的训练收敛。常见的监督学习模型包括:Logistic回归、决策树、SVM(Support Vector Machines,支持向量机)、KNN、朴素贝叶斯等。下图展示的是一个水果分类的例子,每一个样本数据的输入是由物体的特征构成的特征向量,如物体的颜色、大小、形状等,输出的是物体的类别,如苹果、葡萄、香蕉等。
          
监督学习模型训练,算法利用训练数据提供的特征信息,如颜色、大小、形状等,构建概率模型p(y|x)或非概率模型y=f(x)  其次,当模型训练完毕,就可以把新的输入数据代入模型,模型将根据新数据的特征信息,找出最符合这种特征的输出结果,其过程如下。
          
                          模型预测  无监督学习(Unsupervised learning):无监督学习的训练样本数据没有任何的标签和输出,其目的是对原始数据结构进行深入分析,找出数据间存在的规律与关系。典型的无监督学习任务包括:聚类、降维、特征提取等。
     
                 两种常见的无监督学习,(a)数据聚类,(b)数据降维  虽然监督学习的准确率更高,但在现实生活中,我们获取的大量数据一般是没有标签数据的,因此,我们不得不诉诸于无监督学习,但传统的无监督学习方法在特征提取上并不令人满意,而深度学习则被证明具有强大的无监督学习能力,特别是在计算机视觉领域,运用深度学习技术所达到的效果更是要远优于传统的机器学习。
  强化学习(reinforcement learning):强化学习也称为增强学习,强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。
  强化学习与前面的监督学习、无监督学习之间的区别在于,它并不需要出现正确的输入输出对,也不需要精确校正次优化的行为。强化学习更加专注于在线规划,需要在探索未知的领域和遵从现有知识之间找到平衡,它的学习过程是一个从实际环境中不断学习积累,不断进化的过程。因此,强化学习更接近生物学习的本质,也是有望让机器获得通用智能的一项技术。      
             DeepMind利用强化学习技术在迷宫游戏中执行搜索任务(图片摘自网络)  本文选自,点此链接可在博文视点官网查看此书。
                       
没有更多推荐了,机器学习之数据清洗、特征提取与特征选择机器学习之数据清洗、特征提取与特征选择汽车多维数据集百家号前言:数据和特征决定机器学习的上限,而模型和算法只是逼近这个上限。上篇回顾:图文理解机器学习的基础概念提示:本文先不必强求甚解,宜按图索骥。对数据的每一步操作请务必备份!备份!一、数据清洗缺失值处理根据缺失率和重要性,分为去除字段、填充缺失值、重新取数据。其中,填充缺失值的方法有:a. 以业务知识或经验推测填充。b.平均值、中值、分位数、众数、随机值、插值等来填充。c. 建立一个模型来“预测”缺失的数据。d. 引入虚拟变量以映射到高维空间。2. 格式与内容处理格式与内容的问题是五花八门的,下图仅部分例子:格式和内容处理是非常考究耐心和细心。3. 去除重复的数据。4. 噪音数据的处理噪音数据过多,会导致模型泛化能力差。但适当的噪音数据,有助于防止过拟合。二、特征提取与特征选择的区别特征提取(Feature Extraction):特征选择(Feature Selection):对比图:三、特征提取基本方法1.主成分分析(PCA)将n维特征映射到k维上(k2. 线性判别分析法(LDA)将高维的数据样本投影到最佳判别的矢量空间,保证样本数据在该空间中有最佳的可分离性。显然上图投影到右边的矢量空间比左边的更好。3. 多维尺度分析法(MDS)根据样本之间的距离关系或不相似度关系在低维空间里生成对样本的一种表示。4.独立成分分析法( ICA )利用统计原理把数据或信号分离成统计独立的非高斯的信号源的线性组合。5. 核主成分分析法(如核方法KPCA,KDA)先对样本进行非线性变换,再在变换空间进行主成分分析来实现在原空间的非线性主成分分析。6.基于流型学习的方法通过局部距离来定义非线性距离度量,在样本分布较密集的情况下可以实现各种复杂的非线性距离度量。四、特征选择特征选择的流程图:特征选择方法:1. 按搜索策略分类2. 按评价准则分类。数据处理的本质就是为了尽可能的找到“充分且必要”的特征,因此往往花费80%以上的时间。如此呕心沥血,不点赞支持吗?谢谢!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。汽车多维数据集百家号最近更新:简介:我是一个IT我喜欢把我所学知识分享给大家作者最新文章相关文章&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Python 文本挖掘:使用机器学习方法进行情感分析(一、特征提取和选择)
摘要:用Python进行机器学习及情感分析,需要用到两个主要的程序包:nltk和scikit-learnnltk主要负责处理特征提取(双词或多词搭配需要使用nltk来做)和特征选择(需要nltk提供的统计方法)。scikit-learn主要负责分类算法,评价分类效果,进行分类等任务。接下来会有四篇文章按照以下步骤来实现机器学习的情感分析。1.&特征提取和特征选择(选择最佳特征)2.&赋予类标签,分割开发集和测试集3.&构建分类器,检验分类准确度,选择最
用Python 进行机器学习及情感分析,需要用到两个主要的程序包:nltk 和 scikit-learnnltk 主要负责处理特征提取(双词或多词搭配需要使用nltk 来做)和特征选择(需要nltk 提供的统计方法)。scikit-learn 主要负责分类算法,评价分类效果,进行分类等任务。接下来会有四篇文章按照以下步骤来实现机器学习的情感分析。1.&特征提取和特征选择(选择最佳特征)2.&赋予类标签,分割开发集和测试集3.&构建分类器,检验分类准确度,选择最佳分类算法4.
存储和使用最佳分类器进行分类,分类结果为概率值首先是特征提取和选择一、特征提取方法1. 把所有词作为特征
def bag_of_words(words): return dict([(word, True) for word in words])返回的是字典类型,这是nltk 处理情感分类的一个标准形式。2. 把双词搭配(bigrams)作为特征
import nltkfrom nltk.collocations import BigramCollocationFinderfrom nltk.metrics import BigramAssocMeasures
def bigram(words, score_fn=BigramAssocMeasures.chi_sq, n=1000): bigram_finder = BigramCollocationFinder.from_words(words) #把文本变成双词搭配的形式 bigrams = bigram_finder.nbest(score_fn, n) #使用了卡方统计的方法,选择排名前1000的双词 return bag_of_words(bigrams)除了可以使用卡方统计来选择信息量丰富的双词搭配,还可以使用其它的方法,比如互信息(PMI)。而排名前1000也只是人工选择的阈值,可以随意选择其它值,可经过测试一步步找到最优值。3. 把所有词和双词搭配一起作为特征
def bigram_words(words, score_fn=BigramAssocMeasures.chi_sq, n=1000): bigram_finder = BigramCollocationFinder.from_words(words) bigrams = bigram_finder.nbest(score_fn, n) return bag_of_words(words + bigrams) #所有词和(信息量大的)双词搭配一起作为特征二、特征选择方法有了提取特征的方法后,我们就可以提取特征来进行分类学习了。但一般来说,太多的特征会降低分类的准确度,所以需要使用一定的方法,来“选择”出信息量最丰富的特征,再使用这些特征来分类。特征选择遵循如下步骤:1. 计算出整个语料里面每个词的信息量2. 根据信息量进行倒序排序,选择排名靠前的信息量的词3. 把这些词作为特征1.&计算出整个语料里面
每个词的信息量1.1 计算整个语料里面每个词的信息量from nltk.probability import FreqDist, ConditionalFreqDistdef create_word_scores(): posWords = pickle.load(open('D:/code/sentiment_test/pos_review.pkl','r')) negWords = pickle.load(open('D:/code/sentiment_test/neg_review.pkl','r')) posWords = list(itertools.chain(*posWords)) #把多维数组解链成一维数组 negWords = list(itertools.chain(*negWords)) #同理 word_fd = FreqDist() #可统计所有词的词频 cond_word_fd = ConditionalFreqDist() #可统计积极文本中的词频和消极文本中的词频 for word in posWords: word_fd.inc(word) cond_word_fd['pos'].inc(word) for word in negWords: word_fd.inc(word) cond_word_fd['neg'].inc(word) pos_word_count = cond_word_fd['pos'].N() #积极词的数量 neg_word_count = cond_word_fd['neg'].N() #消极词的数量 total_word_count = pos_word_count + neg_word_count word_scores = {} for word, freq in word_fd.iteritems(): pos_score = BigramAssocMeasures.chi_sq(cond_word_fd['pos'][word], (freq, pos_word_count), total_word_count) #计算积极词的卡方统计量,这里也可以计算互信息等其它统计量 neg_score = BigramAssocMeasures.chi_sq(cond_word_fd['neg'][word], (freq, neg_word_count), total_word_count) #同理 word_scores[word] = pos_score + neg_score #一个词的信息量等于积极卡方统计量加上消极卡方统计量 return word_scores #包括了每个词和这个词的信息量1.2 计算整个语料里面每个词和双词搭配的信息量def create_word_bigram_scores(): posdata = pickle.load(open('D:/code/sentiment_test/pos_review.pkl','r')) negdata = pickle.load(open('D:/code/sentiment_test/neg_review.pkl','r')) posWords = list(itertools.chain(*posdata)) negWords = list(itertools.chain(*negdata)) bigram_finder = BigramCollocationFinder.from_words(posWords) bigram_finder = BigramCollocationFinder.from_words(negWords) posBigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 5000) negBigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 5000) pos = posWords + posBigrams #词和双词搭配 neg = negWords + negBigrams word_fd = FreqDist() cond_word_fd = ConditionalFreqDist() for word in pos: word_fd.inc(word) cond_word_fd['pos'].inc(word) for word in neg: word_fd.inc(word) cond_word_fd['neg'].inc(word) pos_word_count = cond_word_fd['pos'].N() neg_word_count = cond_word_fd['neg'].N() total_word_count = pos_word_count + neg_word_count word_scores = {} for word, freq in word_fd.iteritems(): pos_score = BigramAssocMeasures.chi_sq(cond_word_fd['pos'][word], (freq, pos_word_count), total_word_count) neg_score = BigramAssocMeasures.chi_sq(cond_word_fd['neg'][word], (freq, neg_word_count), total_word_count) word_scores[word] = pos_score + neg_score return word_scores2.&根据信息量进行倒序排序,选择排名靠前的信息量的词def find_best_words(word_scores, number): best_vals = sorted(word_scores.iteritems(), key=lambda (w, s): s, reverse=True)[:number] #把词按信息量倒序排序。number是特征的维度,是可以不断调整直至最优的 best_words = set([w for w, s in best_vals]) return best_words然后需要对find_best_words 赋值,如下:word_scores_1 = create_word_scores()word_scores_2 = create_word_bigram_scores()3.&把选出的这些词作为特征(这就是选择了信息量丰富的特征)def best_word_features(words): return dict([(word, True) for word in words if word in best_words])三、检测哪中特征选择方法更优见构建分类器,检验分类准确度,选择最佳分类算法
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Python 文本挖掘:使用机器学习方法进行情感分析(一、特征提取和选择)相关信息,包括
的信息,所有Python 文本挖掘:使用机器学习方法进行情感分析(一、特征提取和选择)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 spark 机器学习 特征提取 的文章

 

随机推荐