【机器学习入门笔记】第二篇-特征提取

        数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

特征工程:特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。特征提取的意义:会直接影响机器学习的效果。
pandas数据清理;sklearn特征工程

为什么进行特征提取(特征抽取)?

特征抽取是把研究的东西数字化的过程,当我们用机器学习算法做文章分类时,机器学习的算法来源于统计方法,统计方法是由数学公式组成的,数学公式不能处理字符串,所以我们需要将文本类型转为数值。

以下为特征提取的代码:

首先先导入用到的所有包

from sklearn.feature_extraction import DictVectorizer #字典特征提取
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer  # 文本特征提取
import jieba #中文分词用

第一种:字典的特征提取(特征离散化)

def dict_demo():
    '''
    字典特征抽取
    :return:
    '''
    data =[{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
    #1.实例化一个转换器类
    transfer =DictVectorizer(sparse=False)
    #2.调用fit_transform转换器类
    data_new = transfer.fit_transform(data)
    print('data_new:\n',data_new);
    print('特征名字:\n',transfer.get_feature_names())
    return None
字典的特征提取:sklearn.feature_extraction.DictVectorizer(sparse=True,...) 
将类别转化为onehot编码
vector的意思在数学上指向量,物理上指矢量,用一维数组表示。矩阵matrix用二维数组表示。
DicVectorizer.fit_transform(X):字典或者包含字典的迭代器返回值:返回sparse矩阵
默认情况下显示稀疏矩阵--sparse=False还原
 稀疏矩阵0过多,所以系统将非零值按位置表示出来
    如果类别很多很多,假设有1000个,那么0就会非常多,为了节省内存-提高加载效率
    应用场景:
    1)pclass,sex 数据集当中类别特征比较多
        1.将数据集的特征=》字典类型
        2.DictVectorizer转换
    2)本身拿到的数据就是字典类型

运行结果:

 第二种:文本特征提取

def count_demo():
    '''
    文本特征抽取:CountVectorizer
    :return:
    '''
    data = ["life is short,i like python","life is too long,i dislike dislike python"]
    #1.实例化一个转换器类
    transfer =CountVectorizer(stop_words=["is","too"])
    #2.调用fit_transform转换器类
    data_new = transfer.fit_transform(data)
    print('data_new:\n',data_new.toarray());#稀疏矩阵的转换
    print('特征名字:\n',transfer.get_feature_names()) #打印特征名
    return None

单词 作为特征        作用:对文本数据进行特征值化 sklearn.feature_extraction.text.CountVectorizer(stop_word=[]) =>返回词频矩阵

停用词,停用词表 对数据分析没有用的

CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象==>返回sparse矩阵

运行结果: 

第三种:中文文本特征提取

#分词
def cut_word(text):
    a = " ".join(list(jieba.cut(text)));
    return a

def count_chinese_demo():
    '''
    中文文本特征抽取,自动分词
    :return:
    '''
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人都不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    #1.分词
    data_new = [];
    for sentence in data:
        data_new.append(cut_word(sentence))
    print(data_new)

    # 2.实例化一个转换器类
    transfer = CountVectorizer(stop_words=["因为","如果","这样","所以"])
    # 2.调用fit_transform转换器类
    data_final = transfer.fit_transform(data_new)
    print('data_new:\n', data_final.toarray());  # 稀疏矩阵的转换
    print('特征名字:\n', transfer.get_feature_names())  # 打印特征名
    return None

运行结果:

第四种:中文tfidf特征提取 

在某一个文章中出现很多,在别的文章出现很少的单词,叫关键词,有利于分类

    TF-IDF-重要程度
    TF-term frequency,tf
    逆向文本频率:总文件数目除以包含该词语的文件数目
    两个词”经济“”非常“
    1000篇文章
    100篇文章都有非常   10篇文章是有经济
    两篇文章(都有100歌词)
    文章A:10次经济  tf:10/100=0.1   idf=1000/10=100  lg 100 = 2   TF-IDF=0.2
    文章B:10次非常 tf:10/100=0.1    idf=1000/100=10  lg 10 = 1    TF-IDF=0.1


def tfidf_demo():
    '''
    用tfidf文本特征抽取,自动分词
    :return:
    '''
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人都不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    #1.分词
    data_new = [];
    for sentence in data:
        data_new.append(cut_word(sentence))
    print(data_new)

    # 2.实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["因为","如果","这样","所以"])
    # 2.调用fit_transform转换器类
    data_final = transfer.fit_transform(data_new)
    print('data_new:\n', data_final.toarray());  # 稀疏矩阵的转换
    print('特征名字:\n', transfer.get_feature_names())  # 打印特征名
    return None

运行结果:

 


版权声明:本文为Y809714652原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。