业界流传:数据和特征决定了机器学习的上限,而算法和模型只是在逼近这个上限而已。
特征工程是什么?特征工程:就是一项工程活动,最大限度地从原始数据中提取特征以供算法和模型使用。说白了,就是将自己获得的数据转换为算法需要的形式。
如何理解这句话呢?比如数据有缺失,可以进行缺失值处理;对不属于同一量纲的数据,可以进行归一化和标准化;对于多个特征值,可以特征选择或者PCA降维,减少无用的特征等等,这将使得模型更准确的对数据进行处理。
思维导图:
特征抽取
介绍几种常见的特征抽取:
1、字典特征抽取
字典特征抽取是指对字典数据进行特征值化。对于数据中是数值型的特征,像温度等可直接保留,而对于具有类别的数据,则需要进行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}
API:
类:sklearn.feature_extraction.DictVertorizer
DictVertorizer(sparse=True)
DictVertorizer.fit_transform(X) X为字典,返回sparse矩阵,如果sparse为false,则返回一个数组
DictVertorizer.inverse_transform(X) X为数组或者sparse矩阵,返回一个字典数据。
DictVertorizer.get_feature_names() 返回类别名称
2、文本特征抽取
文本特征提取是指对文本数据进行特征值化,比如字符串,可以是英文也可中文,但是中文的时候需要进行特殊处理(jieba)
API
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer(max_df=1.0,min_df=1,…)
CountVectorizer.fit_transform(X) X为文本,返回sparse矩阵,要想转化为array,需要用到toarray()函数
CountVectorizer.inverse_transform(X) X为数组或者sparse矩阵,返回文本数据。
DictVertorizer.get_feature_names() 返回类别名称
注意
直接对中文文本进行特征抽取效果并不好,那如何对中文文本进行特征抽取呢?利用jieba.cut()对中文进行分词,jieba.cut()的返回值是一个词语生成器而不是字符串。
流程:
- 准备句子,使用jieba.cut()进行分词
- 实例化CountVectorizer()
- 将分词结果转化为字符串作为fit_transform的输入
如果特征抽取的是好几篇文章呢?
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,
并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。
TF-IDF的作用:用来评估一个词对于一个文件集或者语料库的重要程度。
API
类:from sklearn.feature_extraction.text import TfidfVectorizer
TfidfVectorizer(stop_words=None,…)
方法和上边的一样
数据预处理 sklearn.preprocessing
数据的特征处理可以分类数值型数据,类别型数据,时间类型数据。
数值型数据:
- 归一化
- 标准化
- 缺失值
类别型数据:
- one-hot编码
- 时间类型:
- 时间的划分
归一化:
通过对原始数据进行变换把数据变换到(0,1)之间。
sklearn.preprocessing.MinMaxScaler
方法:MinMaxScaler.fit_transform(X) 返回与X形状相同的array
公式:
默认情况下,max为1,min为0.
标准化:
通过将原始数据转化成均值为0,方差为1的范围,标准化可以很好的解决归一化中异常值带来的影响。
sklearn.preprocessing. StandardScaler
方法:StandardScaler.fit_transform(X)
StandardScaler.mean_ 原始数据中每列特征的均值
StandardScaler.std_ 原始数据中每列特征的方差
缺失值处理:
对于缺失值,两种处理方法:
-删除:当每列或每行的数据缺失值达到一定比例,建议放弃整行或整列
-插补:可以用平均值或者中值来填充
sklearn.preprocessing.Imputer
方法:Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
特征选择 sklearn.feature_selection
特征选择就是单纯地从众多特征中选择出具有代表性的特征作为训练集特征,选择后维数会降低。
为什么要特征选择呢?
- 冗余:部分特征的相关度高,容易消耗计算性能
- 噪声:部分特征会对预测结果有负影响
方法:
Filter(过滤式):VarianceThreshold
Embedded(嵌入式):正则化、决策树
wrapper(包裹式)
过滤式
VarianceThreshold(threshold = 0.0)
VarianceThreshold.fit_transform(X)
训练集差异低于threshold的特征将被删除,默认为0,删除所有方差非0的特征值,即只删除样本中具有相同值得特征。
降维(PCA) sklearn.decomposition
降维的常用方法:
PCA(主成分分析)
LDA(线性判断分析)
PCA(n_components=None)
将数据分解为较低维数空间
n_components=0.95 即保留95%得数据
数据选择与降维有什么区别?
降维和特征选择都是为了使数据维度降小,但实际上两者的区别是很大,他们的本质是完全不同的。下面着重说说两者的区别。
降维本质上是从一个维度空间映射到另一个维度空间,特征的多少别没有减少,当然在映射的过程中特征值也会相应的变化。举个例子,现在的特征是1000维,我们想要把它降到500维。降维的过程就是找个一个从1000维映射到500维的映射关系。原始数据中的1000个特征,每一个都对应着降维后的500维空间中的一个值。假设原始特征中有个特征的值是9,那么降维后对应的值可能是3。
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。举个例子,现在的特征是1000维,现在我们要从这1000个特征中选择500个,那个这500个特征的值就跟对应的原始特征中那500个特征值是完全一样的。对于另个500个没有被选择到的特征就直接抛弃了。假设原始特征中有个特征的值是9,那么特征选择选到这个特征后它的值还是9,并没有改变。
参考:
https://blog.csdn.net/Albert_Ejiestein/article/details/89634331