特征工程
- 什么是特征工程?
定义:特征工程是将原始数据转换为更好代表数据潜在模型的特征的过程 - 特征工程的意义?
目的:更好的特征意味着更好的鲁棒性、更简单的模型、更好的结果 - 特征工程怎么做?
- 特征抽取
- 特征预处理
- 特征降维
- 其他
特征抽取
- 特征抽取的目的
将任意数据格式转换为机器可学习的数字特征 - 文本数据特征抽取
对文本数据可先进行分词,再以根据需求以下列方法进行(分词是以空格分隔每个词,对于英文文本无需分词,对于中文文本可用分词工具进行分词,如jieba)
- 计数
将文本中出现的所有词按出现次数统计,不统计单个字符
"""Count:sklearn实现"""
from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
vectorizer = CountVectorizer()
print(vectorizer.fit_transform(content).toarray()) # fit_fransform()默认返回sparse形式存储的稀疏矩阵,通过toarray()可转换为正常ndarray格式
- 重要性度量
度量某个词对于文本的重要程度,该方法相对于计数方法而言,能够有效避免某些高频但实际含义的词对分类的干扰
"""Importance:sklearn实现"""
from sklearn.feature_extraction.text import TfidfVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(content).toarray()) # fit_fransform()默认返回sparse形式存储的稀疏矩阵,通过toarray()可转换为正常ndarray格式
print(vectorizer.vocabulary_)
- 类别(标签)数据特征抽取
- one-hot编码(独热编码)
以类别个数为长度构造二值向量,对于某个样本在属于类别的位置将元素值为1,其他位置为0
类别 | one-hot编码 |
---|---|
编码顺序 | 类别1,类别2,类别3,类别4 |
类别1 | 1,0,0,0 |
类别2 | 0,1,0,0 |
类别3 | 0,0,1,0 |
类别4 | 0,0,0,1 |
from sklearn.preprocessing import label_binarize
y_true = np.array([np.random.choice([0,1,2]) for i in range(10)])
y_onehot = preprocessing.label_binarize(y_true,classes=[0,1,2])
y_true = np.array(["a","b","c","a","b","c","a","b"])
y_onehot = preprocessing.label_binarize(y_true,classes=["a","b","c"])
- 字典数据
对于字典数据,其中可转换为类别的数据以one-hot编码形式表示,对于数值型非类别数据不做处理
d = [{"city":"成都","age":20,"sex":"男"},
{"city":"上海","age":18,"sex":"女"},
{"city":"北京","age":25,"sex":"男"}]
# 特征抽取结果
# 元素位置对应关系["age","city:成都","city:上海","city:北京","sex:男","sex:女"]
[[ 20, 1, 0, 0, 1, 0],
[ 18, 0, 1, 0, 0, 1],
[ 25, 0, 0, 1, 1, 0]]
"""字典抽取:sklearn实现"""
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False
instances = [{'city': '北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray() # fit_fransform()默认返回sparse形式存储的稀疏矩阵,通过toarray()可转换为正常ndarray格式
print(onehot.get_feature_names()) # 返回经onehot编码后对应的特征名顺序
print(X) # 返回字典抽取后的ndarray形式
特征预处理
- 特征预处理的目的
将数据转换为算法需求的数据格式 - 数值特征预处理
- 目的:对于归一化和标准化预处理是为了同等看待每一特征,有效降低因特征尺度不同对模型学习结果的影响
- 归一化(MaxMinScale)
特点:将原始数据映射到指定范围,只适用于传统精确小数据场景
计算公式:
优点:计算简单方便
缺点:对异常值极为敏感
"""MinMaxScaler:sklearn实现"""
from sklearn.preprocessing import MinMaxScaler
import numpy as np
X = np.random.randint(0,10,25)
X = X.reshape(5,5).astype(np.float64)
mms = MinMaxScaler()
X1 = mms.fit_transform(X)
print(X)
print(X1)
- 标准化(Normalize)
特点:将原始数据映射到均值为0,方差为1的标准正态分布
计算公式:
优点:在数据量较大时,对异常值不敏感,鲁棒性强,比较常用
缺点:数据量较小时,不能体现其优点,且需计算样本均值及标准差,计算量相比归一化计算量稍大
"""Normalize:sklearn实现"""
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.random.randint(0,10,25)
X = X.reshape(5,5).astype(np.float64)
sds = StandardScaler()
X1 = sds.fit_transform(X)
print(X)
print(X1)
- 缺失值处理
缺失值导致了数据的不完整,而无法直接使用数据,对缺失值一般情况可采用丢弃样本或缺失值填充两种方法。对于样本较多,只有个别缺失数据时,可采用丢弃缺失样本方法。其他情况均采用缺失值填充方式,填充值一盘采用统计特征,如均值,中位数等
特征降维
- 特征降维的目的
- 减少特征数量,提升算法学习效率,使模型泛化能力更强,减少过拟合
- 增强特征和特征值之间的理解
- 特征降维的方法
- 特征选择
原因:
(1)冗余-部分特征相关度高,易消耗计算资源
(2)噪声-部分特征对预测结果有负面影响
主要方式:
过滤式(filter):方差阈值(variance threshold)
(1)方差阈值方法,删除不满足阈值要求的特征
"""Variance Threshold:sklearn实现"""
from sklearn.feature_selection import VarianceThreshold
X = np.random.randn(5,7)
vt = VarianceThreshold(threshold=0.5) # 实例化对象,设置方差阈值为0.5,方差小于等于0.5的特征将被删除
X1 = vt.fit_transform(X) # 对数据应用方差阈值
print(X)
print(X1)
嵌入式(embedded):正则化、决策树
包裹式(wrapper):
其他:神经网络
- 主成分分析(PCA)
主要用于削减特征数量,该方法保存数据中对方差影响最大的那些特征,极其容易受到特征尺度的影响,因此运用该方法前需进行特征标准化处理,确保每一特征的同等重要性。PCA算法内部采用SVD(奇异值分解)实现
"""PCA:sklearn实现"""
import numpy as np
from sklearn.decomposition import PCA
X = np.random.randn(5,10)
print(X)
pca = PCA(n_components=0.9)
"""
PCA常用参数: n_components:int/float int表示降维后的特征个数,float表示原数据的保真度,一般取0.9-0.95.该参数一般取浮点值
whiten:bool (default False) 判断是否白化,白化就是对特征数据的归一化
svd_solver:PCA所选择的SVD降维算法,一般使用默认值
"""
print(pca.fit(X)) # pca.fit(X)返回当前PCA配置信息
print(pca.fit_transform(X)) # pca.fit_transform(X) 返回降维后的数据
print(pca.explained_variance_ratio_) # pca.explained_variance_ratio_返回降维后数据每一特征的方差
- 其他:线性判别分析(LDA)