【机器学习】特征工程 —— 特征抽取 清疚 2022-12-22 02:27 400阅读 0赞 ## 特征工程 ## 定义:将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。 内容:主要有三部分: 1、**特征抽取** 2、**特征预处理** 3、**数据的降维** ## 数据集 ## 数据集,又称为资料集、数据集合或资料集合,是一种由数据所组成的集合。 Data set(或dataset)是一个数据的集合,通常以表格形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。它列出的价值观为每一个变量,如身高和体重的一个物体或价值的随机数。每个数值被称为数据资料。对应于行数,该数据集的数据可能包括一个或多个成员。 **常用数据集数据的结构组成:特征值+目标值。** 注:有些数据集可以没有目标值。 ## 特征抽取 ## 特征抽取对文本等数据进行特征值化(特征值化是为了计算机更好的去理解数据)。 **sklearn特征抽取API:sklearn.feature\_extraction。** ### 一、字典特征抽取 ### 字典特征抽取:对字典数据进行特征值化。把字典中一些类别数据,分别进行转换成特征。 **类:sklearn.feature\_extraction.DictVectorizer** DictVectorizer语法: > * **DictVectorizer(sparse=True, …)** > * **DictVectorizer.fit\_transform(x):** > **x: 字典或者包含字典的迭代器;返回值: 返回sparse矩阵** > * **DictVectorizer.inverse\_transform(x):** > **x: array数组或者sparse矩阵;返回值: 转换之前数据格式** > * **DictVectorizer.get\_feature\_names(): 返回类别名称** > * **DictVectorizer.transform(x): 按照原先的标准转换** **流程:** 1. **实例化类DictVectorizer。** 2. **调用fit\_transform方法输入数据并转换(注意返回格式)。** from sklearn.feature_extraction import DictVectorizer # 对字典进行特征值化 def dictvec(): # 实例化 dict = DictVectorizer(sparse=False) # 调用fit_transform data = dict.fit_transform([{ 'city': '北京', 'temperature': 23}, { 'city': '上海', 'temperature': 28}, { 'city': '深圳', 'temperature': 30}]) print(dict.get_feature_names()) print(dict.inverse_transform(data)) print(data) return None if __name__ == "__main__": # dictvec() ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center] ### 二、文本特征抽取 ### 文本特征抽取:对文本数据进行特征值化。用于文本分类、情感分析。 **类:sklearn.feature\_extraction.text.CountVectorizer** CountVectorizer语法: > * **CountVectorizer(): 返回词频矩阵** > * **CountVectorizer.fit\_transform(x):** > **x: 文本或者包含文本字符串的可迭代对象;返回值: 返回sparse矩阵** > * **CountVectorizer.inverse\_transform(x):** > **x: array数组或者sparse矩阵;返回值:转换之前数据格式** > * **CountVectorizer.get\_feature\_names():返回值:单词列表** **流程:** 1. **实例化类CountVectorizer** 2. **调用fit\_transform方法输入数据并转换(注意返回格式,利用toarray()进行sparse矩阵转换array数组)** from sklearn.feature_extraction.text import CountVectorizer # 对文本进行特征值化 def countvec(): cv = CountVectorizer() data = cv.fit_transform(["life is short, i like python", "life is too long, i dislike python"]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() ![在这里插入图片描述][20201117150620154.png_pic_center] 从得到的结果可以看到,第一行为提取出的单词列表,即统计所有文章当中的词,重复的只看做一次。而下面的数组则表示对于每篇文章,在词的列表里面进行统计每个词出现的次数。 *注:单个英文字母不统计,因为没有分类依据。* 那当我们对中文文章进行文本特征抽取时,会怎么样呢? from sklearn.feature_extraction.text import CountVectorizer # 对文本进行特征值化 def countvec(): cv = CountVectorizer() # 需要对中文进行分词才能详细的进行特征值化 data = cv.fit_transform(["人生苦短,我喜欢python", "人生漫长,不用python"]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() ![在这里插入图片描述][20201117150310584.png_pic_center] 此时,我们发现这并不是我们想要的结果,我们需要的是词。 那我们如果想英文那样在词与词之间加上空格会怎样呢? from sklearn.feature_extraction.text import CountVectorizer # 对文本进行特征值化 def countvec(): cv = CountVectorizer() # 需要对中文进行分词才能详细的进行特征值化 data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() ![在这里插入图片描述][20201117151546819.png_pic_center] 我们会发现,此时得到了我们想要的结果。但如果是文章的话,词汇量很多,这样做未免太过繁琐,所以可以通过使用**jieba**来实现。 下载: > pip install jieba **注意:返回值为词语生成器** def cutword(): con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上,所以每个人都不要放弃今天。") con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。") con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系") # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = ' '.join(content1) c2 = ' '.join(content2) c3 = ' '.join(content3) return c1, c2, c3 # 中文特征值化 def hanzivec(): c1, c2, c3 = cutword() print(c1, c2, c3) cv = CountVectorizer() data = cv.fit_transform([c1, c2, c3]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": hanzivec() ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center 1] ### TF-IDF ### 当我们对文本进行特征抽取时,一般来说一篇文章中的一个词出现的频率越高,它就越能反应这篇文章的主题。但是很多文章都会出现“因为”,“所以”,“我们”等等这类词,我们都知道向这类中性词语是不能代表文章的主题的。这个时候我们就需要使用 TF-IDF。 * **tf(term frequency): 词的频率 —> 统计词出现的次数** * **idf(inverse document frequency): 逆文档频率 —> log(总文档数量/该词出现的文档数量)** * **tf \* idf = 重要性程度** **TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。** TF-IDF的作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的**重要程度**。 **类:sklearn.feature\_extraction.text.TfidfVectorizer** TfidfVectorizer语法: > * **TfidfVectorizer(stop\_words=None,…): 返回词的权重矩阵** > * **TfidfVectorizer.fit\_transform(x):** > **x: 文本或者包含文本字符串的可迭代对象;返回值: 返回sparse矩阵** > * **TfidfVectorizer.inverse\_transform(x):** > **x: array数组或者sparse矩阵;返回值: 转换之前的格式** > * **TfidfVectorizer.get\_feature\_names():返回值: 单词列表** from sklearn.feature_extraction.text import TfidfVectorizer import jieba def cutword(): con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上,所以每个人都不要放弃今天。") con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。") con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系") # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = ' '.join(content1) c2 = ' '.join(content2) c3 = ' '.join(content3) return c1, c2, c3 def tfidfvec(): c1, c2, c3 = cutword() tf = TfidfVectorizer() data = tf.fit_transform([c1, c2, c3]) print(tf.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": tfidfvec() ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center 2] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center]: /images/20221120/a1d40d43ef2c472a9992694a78f91881.png [20201117150620154.png_pic_center]: /images/20221120/16f621d0c74e485db5239b4b3329aea0.png [20201117150310584.png_pic_center]: /images/20221120/b490d12286ba4db9a1a8d1b4dbd1e7fa.png [20201117151546819.png_pic_center]: /images/20221120/7920b192ab814d57bc3c466247b5b4b5.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221120/8cc9eb8c543e461cbd89c3fddd8d4dc4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70_pic_center 2]: /images/20221120/77cd98c27f424a958ebfeecb67b26fd6.png
还没有评论,来说两句吧...