实用机器学习笔记八:特征工程
前言:
本文是个人在 B 站自学李沐老师的实用机器学习课程【斯坦福 2021 秋季中文同步】的学习笔记,感觉沐神讲解的非常棒 yyds。
为什么需要特征工程:
首先应该弄明白什么是特征工程,他应该算是一个技术,就是对数据集进行特征提取,以使机器学习模型在对经过特征工程处理过的数据进行学习时可以更快,精度更高,效果更好。
现在来说说为什么要进行特征工程:在深度学习大火之前,传统的机器学习模型是比较常用的,因此在进行学习的之前,需要把数据处理成模型喜欢的数据形式(这个过程往往是人们手动来设计的),因为机器学习算法比较“喜欢”固定长度的输入输出。这是一个非常关键的技术。比如在计算机视觉中,常常把图片进行处理成一个向量等来训练一个 SVM 模型。在深度学习技术成熟之后,人们开始使用神经网络来进行特征抽取(让特征工程更加简单),但是并没有改变特征工程的这个过程以及地位。而且神经网络可以不断地改变参数来更好的去抽取特征,缺点就是需要大量的数据和资源。
表格类数据特征:
int/float 类型数据:直接使用原始数据。或者是根据这列数据的最大值和最小值,然后分成 n 个相等的区间。那么每一个数会落到这 n 个区间中的一个区间中,这样一个实数就被展开成一个长度为 n 的向量,并且实数落到哪个区间这个区间所在位置就是 1。比如:在前面房子数据集中,一套房子房价为 100 万,和一套房子 101 万其实区别不是很大,但是如果直接输入原始数据的话,模型看到这两个数据不一样,就会比较在意这个区别,但是如果被使用这种切分数据区间的方式的话,就是告诉模型,不用在意这个 1 万的差距。
分类数据:一般独热编码(one-hot)。示例如下:
首先会有一个字典,里面有类别清单。如果某个数据是猫,那么在独热编码的特征向量里,只有猫对应的位置为 1,其他位置为 0。另外:还是根据房子数据集来说事,一般情况下,房子的类别不过是十几种,但是在数据集中房子类别出现了上百上千种,实际上类别也就前十种比较重要,其他可能是噪音或者是非常不重要,可以忽略,那么我们在处理数据时,就可以把除前十种之外的类型设置为 unknown。
时间数据:可以使用如下方式:因为如果只有年月日的话,就分不出工作日还是周末,但是人在周末和工作日会做不同的事情,使用如下的编码方式,可以尽量让机器学习算法可以学到这些特征。
[year, month, day, day_of_year, week_of_year, day_of_week]
特征组合:可以让机器学习算法学习到两两特征之间的关系。
[cat, dog]* [male, female]---->
[(cat, male), (cat, female), (dog, male), (dog, female)] 同样是独热编码
文本特征:
词元(token)特征:
Bag of words(BoW) model:前提是有一个完整的字典。文本中的每一个在数据处理时就已经别分成了一个个单独的词(也就是词元),然后对每一个词根据字典进行独热编码,接着把这句话中的每一个词的独热编码相加。实例如下:
缺点:需要认真设计词典,不能太大也不能太小。破坏了一个句子的时序信息。
词嵌入(Word Embeding): 先训练一个词嵌入模型,常见的是 word2vec,他会把一个词表示成一个向量,这个向量是带有语义信息的。如果两个词向量内积越小,就表示这两个向量比较接近,也就是说这两个词语义相近。这是因为 Word2vec 在训练时是通过一个词的上下文进行训练的。那么这句话的词嵌入表示如何得到呢?把每个词输入到 word2vec,得到没个词的向量,然后向量相加或者平均。
预训练好的语言模型(BERT,GPT-3):以上两个模型都是模型参数很大,里面有包含目前最流行的 transformer。而且是使用大量的无标注的数据自监督学习来训练,可以抽取很好地数据特征。缺点就是比较贵。他的作用和 Word2vec 一样输出每个单词的词向量。
图片和视频特征:
传统的方法:传统的方法通常是手工来抽取,比如 SIFT。
现在的神经网络方法:深度学习流行之后,使用预训练好的深度神经网络来进行特征抽取。比如:事先在 ImageNet 数据集上训练好了一个 ResNet 模型。那如何拿到抽取的特征呢?把图片输入到这个训练好的模型里面,然后在这个模型要做分类的那层神经网络的前一层(也就是输出层开始算的倒数第二层)的输出结果拿出来就是抽取的特征,可以把这个特征拿出来用到别的任务中。图示如下:
版权声明: 本文为 InfoQ 作者【打工人!】的原创文章。
原文链接:【http://xie.infoq.cn/article/a63e4d7486f6a7180591d3a64】。文章转载请联系作者。
评论