特征工程介绍
为什么需要特征工程?
数据和特征决定了机器学习的上限,而模型和算法只是逼近了这个上限而已
什么是特征工程?
特征工程会直接影响机器学习的效果
- sklearn 特征工程
- pandas 数据清洗、数据处理
特征提取
机器学习算法 -> 统计方法 -> 数学公式
1.将任意数据(文本或图像)转换为可用于机器学习的数字特征
文本类型 - > 数值
类型 -> 数值
2.特征提取API:sklearn.feature_extraction
字典特征提取:sklearn.feature_extraction.DictVectorizer(sparse = True,...)
将类别 -> one-hot 编码
vector 向量;矢量;一维数组
spares矩阵 = 稀疏矩阵 :将非零值按照位置显示,节省内存提高加载效果
def dict_demo():
data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
#实例一个转换器类
transfer = DictVectorizer(sparse=False)#将稀疏矩阵关闭
#调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
print("特征名称:\n",transfer.get_feature_names())
return None
应用场景
- 数据集当中类别特征比较多
- 将数据集的特征 -> 字典类型
- DictVectorizer转换
- 本身拿到的数据就是字典类型
文本特征处理
单词 作为 特征
方法一:sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- CountVectorizer 统计每个样本特征词出现的个数
- stop_words 停用词,找停用词表
def count_demo():
data = {"Life is short,i like like python","Life is too long,i dislike python"}
#实例化转换器
transfer = CountVectorizer()
#调用transform
data_new = transfer.fit_transform(data)
print("特征名字:\n",transfer.get_feature_names())
print("data_new:\n",data_new.toarray())#已数组形式输出
#增加停用词
tran = CountVectorizer(stop_words = ["python","is"])
tdata_new = tran.fit_transform(data)
print("特征名字:\n",tran.get_feature_names())
print("data_new:\n",tdata_new.toarray())#已数组形式输出
return None
- 返回词频矩阵
中文分词
- 中文文本需要将词语加空格分开 (结巴分词库)或者用其他库,再进行特征提取
方法2:关键词提取TfidfVectorizer
Tf-idf:重要程度
TFfni词频
idf:逆向文档频率
例:
API:
特征预处理
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
包含内容
- 数据型数据的无量纲化:将数据差值很大的数进行转化为一个固定的区间
- 归一化
- 标准化
特征预处理API
sklearn.preprocessing
归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])指定区间
公式
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3] #只取数据前三列
print("data=\n",data)
transfer = MinMaxScaler() #默认0-1
data_new = transfer.fit_transform(data)
print("data_new=\n",data_new)
缺点
最大值和最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景
标准化(常用 )
- 对于归一化来说:如果出现了异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现了异常点,由于具有一定的数据量,少量的异常带你对于平均值的影响并不大,从而方差改变较小
API
特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
降维的两种方法
特征选择
定义:数据中包含冗余或相关变量(或称特征,属性,指标等),旨在原有特征中找出主要特征
Fitter过滤式
方差选择法:低方差特征过滤
相关系数 -> 特征与特征之间的相关程度
皮尔逊相关系数
Embedded嵌入式
决策树
正则化
深度学习
过滤式
低方差特征过滤
删除和阈值比较相近的
- 特征方差小:某个特征大多样本的值都比较相近
- 特征方差大:某个特征很多样本的值都有差别
API
相关系数
相关系数的值介于-1与+1之间,即-1<=r<=+1其性质如下:
- 当r>0时,表示两变量正相关,r<0时,两变量为负相关
- 当|r| = 1时,表示两变量为完全相关,当r = 0时,表示两变量间无相关
- 当0<|r|<1时,表示两变量存在一定程度的相关,且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
- 一般可按三级划分:|r|<0.4为低度相关;0.4<=|r|<0.7为显著性相关;0.7<=|r|<1为高度线性相关
API
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 1、获取数据
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)
return None
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WangZun233!