AI学习---特征工程(Feature Engineering)

为什么需要特征工程(Feature Engineering)

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

什么是特征工程

帮助我们使得算法性能更好发挥性能而已

sklearn主要用于特征工程
pandas主要用于数据清洗、数据处理

特征工程包含如下3个内容:

1、特征抽取/特征提取

|__>字典特征抽取

|__>文本特征抽取

|__>图像特征抽取(深度学习)

2、特征预处理

3、特征降维

  • 特征抽取/特征提取

我们常说的机器学习算法实际上就是我们统计学上的统计方法也就是我们数学上的数学公式

                           即 机器学习算法--》统计方法--》数学公式

        字典特征抽取的应用场景:
            1)pclass, sex 数据集当中类别特征比较多
                    1、将数据集的特征 转换为字典类型
                    2、利用DictVectorizer转换为二维数组
            2)本身拿到的数据就是字典类型

1- 字典特征提取:

当我们调用sklearn.feature_extraction.DictVectorizer(sparse=True,…)的时候,实际上就是初始化了一个父类的转换器对象,然后调用实例进行fit_transform(X),进行字典和数值的转换。

(下图)有多少行数据就有多少个向量(有方向和大小),向量在计算机中以矩阵存储(二维数组),而矩阵的行和列都可以看做一个一维数组。下图中一行数据可以看做一个向量,n个样本有n个向量,即将字典转换为了计算机识别的二维数组。每一个样本有2个特征(城市+temperature),正常应该返回一个3行2列的矩阵,但是字典特征抽取后,样本量没有变(3个样本),但是特征量变成了4个(当特征中有类别的时候,要想表示成数值,又想要公平的表示数据,我们采用one-hot编码,有3个类别,就占用3列,如果是北京,则第二列的特征值就是1,最后添加上temperature就是4个特征了)。

字典特征抽取DEMO:

from sklearn.feature_extraction.dict_vectorizer import DictVectorizer

# 字典特征提取
def dic_demo():
    data = [{‘city‘: ‘北京‘, ‘temperature‘: 100},
            {‘city‘: ‘上海‘, ‘temperature‘: 60},
            {‘city‘: ‘深圳‘, ‘temperature‘: 30}]
    # 1、实例化一个转换器对象
    # transform = DictVectorizer(sparse=True)  # 默认开启稀疏矩阵
    transform = DictVectorizer(sparse=False)   # 默认sparse=True,
    # 2、调用fit_transform()
    new_data = transform.fit_transform(data)
    # 3、获取特征名称
    print("特征名字:\n", transform.get_feature_names()) # 特征名字:[‘city=上海‘, ‘city=北京‘, ‘city=深圳‘, ‘temperature‘]

    print(‘转换后的结果:\n‘, new_data)

    ‘‘‘
     # sparse=True时候的new_data的值:返回的new_data是一个sparse的稀疏矩阵
      (0, 1)	1.0
      (0, 3)	100.0
      (1, 0)	1.0
      (1, 3)	60.0
      (2, 2)	1.0
      (2, 3)	30.0

     # sparse=True时候的new_data的值,返回的是一个二维数组

      [[  0.   1.   0. 100.]
       [  1.   0.   0.  60.]
       [  0.   0.   1.  30.]]

      # 总结:
           稀疏矩阵将非零值按位置表示出来,这样做可以节省内存 - 提高加载效率
    ‘‘‘

if __name__ == ‘__main__‘:
    dic_demo()

结果截图:

附: 

    one-hot编码:

对特征中的类别信息,为了公平的表示每一组样本数据,我们处理的时候,就是根据类别进行划分,样本中几个类别就有几列,是这个数据则置该列的数值为1,否则为0

 

  2- 文本特征提取:

文本特征提取就是将单词、字母、短语作为主要的特征词进行特征提取

可以利用如下方法统计:

CountVectorizer:统计的是文本中出现的特征词次数,stop_words停用的停词表,toarray()可以转换为二维数组
 
英文的测试DEMO
from sklearn.feature_extraction.text import CountVectorizer

# 文本特征提取
def text_count_demo():
    data = ["life is short,i like like python", "life is too long, i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # transfer = CountVectorizer(stop_words=["is", "too"])
    ‘‘‘
    不添加stop_words的效果:transfer = CountVectorizer()
        data_new:
         [[0 1 1 2 0 1 1 0]
         [1 1 1 0 1 1 0 1]]
        特征名字:
         [‘dislike‘, ‘is‘, ‘life‘, ‘like‘, ‘long‘, ‘python‘, ‘short‘, ‘too‘]

    添加stop_words的效果: transfer = CountVectorizer(stop_words=["is", "too"])
        data_new:
         [[0 1 2 0 1 1]
         [1 1 0 1 1 0]]
        特征名字:
         [‘dislike‘, ‘life‘, ‘like‘, ‘long‘, ‘python‘, ‘short‘]

    ‘‘‘

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    # data_new返回的是一个sparse矩阵,
    print("矩阵_data_new:\n", data_new)
    # data_new.toarray()返回的是一个二维数组
    print("数组_data_new:\n", data_new.toarray())
    ‘‘‘
        矩阵_data_new:
              (0, 5)	1
              (0, 3)	2
              (0, 6)	1
              (0, 1)	1
              (0, 2)	1
              (1, 0)	1
              (1, 4)	1
              (1, 7)	1
              (1, 5)	1
              (1, 1)	1
          (1, 2)	1

        数组_data_new.toarray():
             [[0 1 1 2 0 1 1 0]
             [1 1 1 0 1 1 0 1]]
    ‘‘‘
    print("特征名字:\n", transfer.get_feature_names())

    return None

if __name__ ==‘__main__‘:
    text_count_demo()

中文的手动分词DEMO效果(这里是手动用空格进行的中文分词,麻烦):

from sklearn.feature_extraction.text import CountVectorizer
# 中文的需要进行分词,否则是以整句作为分词的
def chinese_text_count_demo():
    data = ["我爱北京天安门", "天安门上太阳升"]
    # data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]  # 添加了空格的中文分词
    ‘‘‘
    未添加空格的中文分词:
        data_new:
         [[0 1]
         [1 0]]
        特征名字:
         [‘天安门上太阳升‘, ‘我爱北京天安门‘] 

    添加了空格的中文分词:
         [[1 1 0]
         [0 1 1]]
        特征名字:
         [‘北京‘, ‘天安门‘, ‘太阳‘]

    ‘‘‘
    # 1、实例化一个转换器类
    transfer = CountVectorizer()

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())

    return None

if __name__ ==‘__main__‘:
    chinese_text_count_demo()

中文的自动分词统计的DEMO效果

from sklearn.feature_extraction.text import CountVectorizer
import jieba

# pip3 install jieba
# 利用jieba可以进行jieba分词
def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text))) # jieba.cut(text)返回的是一个生成器对象,需要转换为迭代器

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

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    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

if __name__ ==‘__main__‘:
    auto_chinese_text_count_demo()

  • 特征预处理

  • 特征降维

原文地址:https://www.cnblogs.com/ftl1012/p/10498480.html

时间: 2024-11-19 04:08:32

AI学习---特征工程(Feature Engineering)的相关文章

特征工程(Feature Enginnering)学习记要

最近学习特征工程(Feature Enginnering)的相关技术,主要包含两块:特征选取(Feature Selection)和特征抓取(Feature Extraction).这里记录一些要点,作为备忘. 特征选取 R中的FSelector包实现了一些特征选取的算法,主要分两大类: Algorithms for filtering attributes: cfs, chi.squared, information.gain, gain.ratio, symmetrical.uncertai

机器学习-特征工程-Feature generation 和 Feature selection

概述:上节咱们说了特征工程是机器学习的一个核心内容.然后咱们已经学习了特征工程中的基础内容,分别是missing value handling和categorical data encoding的一些方法技巧.但是光会前面的一些内容,还不足以应付实际的工作中的很多情况,例如如果咱们的原始数据的features太多,咱们应该选择那些features作为咱们训练的features?或者咱们的features太少了,咱们能不能利用现有的features再创造出一些新的与咱们的target有更加紧密联系

【特征工程】特征工程技术与方法

引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而,单纯学习机器学习的算法流程,可能仍然不会使用这些算法,尤其是应用到实际问题的时候,常常不知道怎么提取特征来建模. 特征是机器学习系统的原材料,对最终模型的影响是毋庸置疑的. 特征工程的重要意义 数据特征会直接影响你使用的预测模型和实现的预测结果.准备和选择的特征越好,则实现的结果越好. 影响预测结果好坏的因素:模型的选择.可用的数据.特征的提取. 优质的特征往往描述了数据的固有结构. 大多数模型都可

【特征工程】特征选择与特征学习

http://www.jianshu.com/p/ab697790090f 特征选择与特征学习 在机器学习的具体实践任务中,选择一组具有代表性的特征用于构建模型是非常重要的问题.特征选择通常选择与类别相关性强.且特征彼此间相关性弱的特征子集,具体特征选择算法通过定义合适的子集评价函数来体现.在现实世界中,数据通常是复杂冗余,富有变化的,有必要从原始数据发现有用的特性.人工选取出来的特征依赖人力和专业知识,不利于推广.于是我们需要通过机器来学习和抽取特征,促进特征工程的工作更加快速.有效. 特征选

关于特征工程的一些学习、思考与错误的纠正

特征工程的整体思路: 1. 对于特征的理解.评估 2. 特征处理: 2.1 特征处理 2.1.1 特征清洗 清洗异常.采样 2.1.2 预处理 单特征情况:归一化.离散化.哑变量编码.缺失值填充等.数据变换例如log服从正态分布. 多特征情况: 降维:PCA.LDA(这个不太了解.待学习) 特征选择:三种大方法,Filter--x与y之间的关联,Wrapper--目标函数检验(MSE),Embedded--机器学习方法,正则化.决策树.深度学习. 3. 特征监控 有效性分析和监控. Python

特征工程学习01-sklearn单机特征工程

特征工程学习01-sklearn单机特征工程 小书匠 kindle 0.数据的导入 from sklearn.datasets import load_iris #导入IRIS数据集  iris=load_iris()  #特征矩阵  print(iris.data[:5],len(iris.data))  #目标向量  print(iris.target[:5],len(iris.target))  [[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2]  [ 4.7 3.

最近看到的“特征工程”相关文章,特汇总在一起方便浏览~

最近看到的“特征工程”相关文章,特汇总在一起方便浏览~ 对于搞数据的和玩深度学习的特征工程是不可少的一环,尤其是特征选择,好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 这里先上一篇总括<特征工程技术与方法> 这篇文章详细梳理了特征工程所包含的内容,对机器学习中的特征.特征的重要性.特征提取与选择.特征的构建.学习等子类问题也给与了总结,总之看过这篇文章之后对特征工程就能有一个总体的认识.(这张图总结的太好了,一目了然,贴出来!)

机器学习之(四)特征工程以及特征选择的工程方法

关于特征工程(Feature Engineering),已经是很古老很常见的话题了,坊间常说:"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已".由此可见,特征工程在机器学习中占有相当重要的地位.在实际应用当中,可以说特征工程是机器学习成功的关键.纵观Kaggle.KDD等国内外大大小小的比赛,每个竞赛的冠军其实并没有用到很高深的算法,大多数都是在特征工程这个环节做出了出色的工作,然后使用一些常见的算法,比如LR,就能得到出色的性能.遗憾的是,在很多的书籍中并没有直接

机器学习-特征工程-Missing value和Category encoding

好了,大家现在进入到机器学习中的一块核心部分了,那就是特征工程,洋文叫做Feature Engineering.实际在机器学习的应用中,真正用于算法的结构分析和部署的工作只占很少的一部分,相反,用于特征工程的时间基本都占70%以上,因为是实际的工作中,绝大部分的数据都是非标数据.因而这一块的内容是非常重要和必要的,如果想要提高机器学习应用开发的效率,feature engineering就像一把钥匙,一个加速器,能给整个项目带来事半功倍的效果.另外,feature engineering做的好不