特征工程数据提取
- :
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。(本文是个人的笔记,有些内容是引用)
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。说白了特征工程就是将你自己收集到的数据转化为算法需要的数据形式。下图是一个例子
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
接下来介绍几种比较常见的特征抽取
字典特征抽取(使用sklearn)
字典数据抽取:把字典中一些类别数据,分别进行转换成特征,因为原始数据中的有的数据是文本的或者字符串的形式存在的,这时候计算机并不能识别此类型的数据,因此需要对这些数据进行特征抽取。对于本来就是数值型的数据比如说温度等直接保留,而对于有类别的数据则要先转化为字典数据,sklearn中采用one-hot编码的方式处理。
下面是one-hot编码的举例:
原字典
{‘city’:‘北京’,‘temperature’:100},{‘city’:‘上海’,‘temperature’:20},{‘city’:‘杭州’,‘temperature’:90}
one-hot编码后的字典:
{‘city=北京’: 1.0, ‘temperature’: 100.0}, {‘city=上海’: 1.0, ‘temperature’: 20.0}, {‘city=杭州’: 1.0, ‘temperature’: 90.0}
经过sklearn处理后转化成的数组
:
可以清楚的看到city是用类别的,所以说先将city=城市名转化为特征名(一个类别对应一个特征名),接着如果1代表符合特征,0代表不符合。
下面是使用sklearn编写的简单字典数据抽取的代码:
字典特征抽取
作用:对字典数据进行特征值化
类:sklearn.feature_extraction.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)data=dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':80},{'city':'广州','temperature':70}])#返回类别名称name=dict.get_feature_names()print(name)print(data)if __name__ == '__main__':dictvec()
运行结果:
文本特征提取
作用:对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵
CountVectorizer.fit_transform(X,y) X:文本或者包含文本字符串的可迭代对象返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)X:array数组或者sparse矩阵
返回值:转换之前数据格式
CountVectorizer.get_feature_names()返回值:单词列表
实例测试:
from sklearn.feature_extraction.text import CountVectorizer
def countvec():"""对文本进行特征化:return:None"""#实例化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())
if __name__ == '__main__':countvec()
运行结果:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 2 1 1 0 1 1 0][1 1 1 0 1 1 0 1]]
这里的0,1代表的是统计该特征属性在这句话中出现的次数