特征提取

<机器学习笔记-03>(scikit-learn 03)特征提取


标签:机器学习,特征提取,feature extraction,scikit-learn,python

摘要:本文为“mastering machine learning with scikit-learn”第三章“特征提取”的读书笔记;主要介绍了从分类变量、文字、图像等研究对象中提取变量特征的方法,重点介绍了独热编码(one-Hot Encoding)、词库模型(Bag-Of-words model)、特征向量降维方法、角点/SIFT/SURF等特征提取方法,以及其Python实现;


  1. 知识要点总结
    1. 掌握独热编码(One-Hot Encoding)、词库模型、带TF-IDF权重的词库模型,了解小写转化、停用词过滤、词根/词形还原等文字特征向量的降维方法,了解欧式距离的计算,
    2. 了解图片提取角点、SIFT/SURF特征的方法;
    3. 掌握sklearn.feature_extraction.DictVectorizersklearn.feature_extraction.text.CountVectorizersklearn.feature_extraction.text.TfidfVectorizer建模方法用sklearn.metrics.pariwise.euclidean_distances计算欧拉距离;
    4. 使用skimagemahotas库提取SIFT/SURF 特征,以及兴趣点 (边缘edges和角点corners);
  2. 基本概念与理论分析
    1. 序列化-从研究对象(数值、分类变量、文字、图像)中抽取出变量特征的方法,是机器学习的基础;
    2. 独热编码(One-Hot Encoding)常用来提取分类变量,可以通过二进制数来表示每个解释变量,python中可以用sklearn.feature_extraction.DictVectorizer来实现;
    3. 词库模型(Bag-of-words model)常用来提取文字特征,将将文字转化为可以量化的特征向量
      1. 将文档仅仅看成是词的组合,忽略词序、语法、词语组合、词语位置;
      2. 可以看成是独热编码的扩展,为每个单词设置一个特征值;
      3. 依据:相似单词的文章意思差不多;可以实现有效的编码方式实现文档分档和检索;
      4. 文字的单词构成词汇表(vocabulary),构成特征向量的元素数量成为维度(dimension),用词典(dictionary)表示词汇表与特征向量索引的对应关系;
      5. sklearn.feature_extraction.text.CountVectorizer可以用来实现词库模型:文档全部转化为小写,文档词块化(tokenize),通过正则表达式用空格分割句子,抽取长度大于2的字母序列;
      6. sklearn.metrics.pariwise.euclidean_distances可以用来计算欧氏距离,即两个向量的欧式范数;语义接近的文档向量在空间也是接近的;
      7. 使用词汇较多会导致特征向量维度太大,会导致(1)占用较大内存,Numpy的稀疏向量可以解决这个问题(2)维度灾难-纬度越多导致需要更大的训练集才能够保证模型充分学习,否则可能因样本不够导致拟合过度,需要用降维方法解决;
    4. 特征向量降维的方法:
      1. 单词全部小写
      2. 停用词过滤

        停用词(stop-word):功能词汇,字面意义不体现;英文中冠词(a、an、the)、助动词(do、be、will)、介词(on、in)等;

        CountVectorizer类可以设置stop_words参数过滤停用词;

      3. 词根还原(stemming)和词形还原(lemmatization):英语中将单词从不同的时态、派生形式还原

        词形还原:处理表现单词意思的词元(lemma)或者形态学词根(morphological root)的过程;词元是词典查询该词的基本形式;需要词法资料支持(WordNet or 单词此类)

        词根还原:把附加词去掉,构成一个词块,可能不是正常单词;

      4. 带TF-IDF权重的扩展词库

        sklearn.feature_extraction.text.CountVectorizer设置binary=True返回二进制,binary默认是false,返回词频数;

        为了比较两个不同长度文档中的单词频率,需要对特征向量进行归一化处理;可以使用sklearn.feature_extraction.text.TfidfVectorizer类;

        TF(term frequency)词频率:归一化、对数词频调整、词频放大三种方法可以消除文档不同大小对词频的影响;

        IDF(inverse document frequency)逆向文件频率:某些单词在各个文档中经常出现,但是对于区分文档意思没有作用;

        单词的TF-IDF值就是频率与逆向文件频率的乘积;

    5. 哈希技巧(hashing trick)实现特征向量
      1. 通过哈希函数确定在特征向量的索引位置,可以不创建词典;
      2. 哈希技巧无固定状态(stateless),把任意数据应射到固定数目的位置,保证相同的输入产生相同输入,不同输入产生不同输出;
      3. sklearn.feature_extraction.text.HashingVector可以实现哈希技巧;
    6. 图片特征提取
      1. 通过像素值提取特征: 用图像创建特征向量会导致维度灾难,同时对图像收缩、旋转、变换、亮度比较敏感,不好用;
      2. 使用skimagemahotas库提取SIFT/SURF 特征,以及兴趣点 (边缘edges和角点corners);
  3. Python编程积累
    1. Python基础
      1. for变化量的灵活应用
        for x,y in [[0,1],[0,2],[1,2]]:
        dist = euclidean_distances(counts[x],counts[y])
      2. pirnt()同时输出字符串和数字的两种方法:%{}
        print('文档{}与文档{}的距离{}'.format(x,y,dist))
        
        #文档0与文档1的距离[[ 2.44948974]]
        
        
        print('文档%d与文档%.d的距离%.5f'%(x,y,dist))
        
        #文档0与文档1的距离2.44949
        
      3. 使用matlabplot.pyplotxlimylim确定绘制图像的大小
        plt.xlim(0, image.shape[1])
        plt.ylim(image.shape[0], 0)
      4. 使用len命令获取长度
        print('抽取了%s个SURF描述符' % len(surf.surf(image)))
    2. sklearn库提取特征
      1. sklearn.feature_extraction.DictVectorizer类基于One-Hot Encoding 独热编码提取分类特征
      2. sklearn.feature_extraction.text.CountVectorizer类基于词库模型将文字转换成特征向量;
      3. sklearn.feature_extraction.text.TfidfVectorizer类可以统计TF-IDF词频;
      4. 调用库函数
        from sklearn.feature_extraction import DictVectorizer
        from sklearn.feature_extraction.text import CountVectorizer
        from sklearn.feature_extraction.text import TfidfVectorizer
      5. DictVectorizer使用fit_transform()实例化建模,并使用toarry()输出编码;
        onehot_encoder = DictVectorizer()
        instances = [{'city': 'New York'},{'city': 'San Francisco'}, {'city': 'Ch apel Hill'}]
        print(onehot_encoder.fit_transform(instances).toarray())
      6. CountVectorizerTfidfVectorizer使用fit_transform()实例化建模,并使用todense()输出编码,使用vocabulary_输出词库;
        onehot_encoder = DictVectorizer()
        instances = [{'city': 'New York'},{'city': 'San Francisco'}, {'city': 'Ch apel Hill'}]
        print(onehot_encoder.fit_transform(instances).toarray())
      7. CountVectorizerTfidfVectorizer类可以设置stop_words参数过滤停用词,使用binary设置返回二进制还是词频数;
        vectorizer = CountVectorizer(stop_words='english')
        vectorizer = TfidfVectorizer(binary=True,stop_words='english')
      8. sklearn.feature_extraction.text.HashingVector用来实现哈希技巧
        from sklearn.feature_extraction.text import HashingVectorizer corpus = ['the', 'ate', 'bacon', 'cat']
        vectorizer = HashingVectorizer(n_features=6) print(vectorizer.transform(corpus).todense())
    3. 使用skimagemahotas库进行图像处理
      1. 使用skimge.io读入图像,显示图像
        import skimage.io as io
        mandrill=io.imread('Desktop/mandrill.png')
        import matplotlib.pyplot as plt
        plt.imshow(mandrill);
        plt.show()
      2. 使用skimage.color.rgb2gray进行颜色转换
        from skimage.color import rgb2gray
        plt.imshow(rgb2gray(mandrill));plt.show()
      3. 使用skimage.exposure.equalize_hist进行直方图均衡化
        from skimage.exposure import equalize_hist
        plt.imshow(equalize_hist(rgb2gray(mandrill)));
        plt.show()
      4. 使用skimage.featurecorner_harris获取harris角点(输入图像应为灰度图像),以及corner_peaks对角点进行过滤
        from skimage.feature import corner_harris, corner_peaks
        cor_h=corner_harris(rgb2gray(mandrill))
        cor_p=corner_peaks(cor_h,min_distance=3)
      5. 使用mahotas.imread()读取图像
        import mahotas as mh
        image = mh.imread('mlslpic/3.2 xiaobao.png', as_grey=True)
      6. 使用mahotas.features.surf获取SURF特征
        from mahotas.features import surf
        print('Surf {}'
           .format(surf.surf(image)[0]))

你可能感兴趣的:(机器学习,machine,learning)