特征工程

特征工程
  1. 什么是特征工程?
    定义:特征工程是将原始数据转换为更好代表数据潜在模型的特征的过程
  2. 特征工程的意义?
    目的:更好的特征意味着更好的鲁棒性、更简单的模型、更好的结果
  3. 特征工程怎么做?
  • 特征抽取
  • 特征预处理
  • 特征降维
  • 其他
特征抽取
  1. 特征抽取的目的
    将任意数据格式转换为机器可学习的数字特征
  2. 文本数据特征抽取
    对文本数据可先进行分词,再以根据需求以下列方法进行(分词是以空格分隔每个词,对于英文文本无需分词,对于中文文本可用分词工具进行分词,如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_)
  1. 类别(标签)数据特征抽取
  • one-hot编码(独热编码)
    以类别个数为长度构造二值向量,对于某个样本在属于类别的位置将元素值为1,其他位置为0
类别one-hot编码
编码顺序类别1,类别2,类别3,类别4
类别11,0,0,0
类别20,1,0,0
类别30,0,1,0
类别40,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形式
特征预处理
  1. 特征预处理的目的
    将数据转换为算法需求的数据格式
  2. 数值特征预处理
  • 目的:对于归一化和标准化预处理是为了同等看待每一特征,有效降低因特征尺度不同对模型学习结果的影响
  • 归一化(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. 特征降维的目的
  • 减少特征数量,提升算法学习效率,使模型泛化能力更强,减少过拟合
  • 增强特征和特征值之间的理解
  1. 特征降维的方法
  • 特征选择
    原因
    (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)
scikit-learn库
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值