1. 为什么需要特征工程
数据和特征决定了机器学习的上限,而模型和算法只是逼近了这个上限而已
2. 什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
3. 特征工程的位置与数据处理的比较
pandas:一个数据读取非常方便以及基本的处理数据格式的工具
sklearn:对于特征的处理提供了强大的接口
特征工程内容包括
特征抽取/特征提取
特征预处理
特征降维
4. 特征提取
4.1 什么是特征提取
将任意数据(文本或图像)转换为可用于机器学习的数字特征(特征提取是为了计算机更好的去理解数据)
4.2 字典特征提取(对字典数据进行特征值化)
sklearn.feature_extraction.DictVectorizer(sparse=True,...)
代码如下:
1. fit
步骤学习数据的特征,transform
步骤将数据转换为数值矩阵
2. DictVectorizer
类,它是 sklearn.feature_extraction
模块中的一个工具,用于将字典形式的数据转换为可以用于机器学习模型的格式
from sklearn.feature_extraction import DictVectorizer
"""
字典特征抽取
"""
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 1、实例化一个转换器类
# transfer = DictVectorizer() # sparse=False 意味着转换结果将不是稀疏矩阵,而是一个常规的密集数组
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform() 字典或者包含字典的迭代器,返回值sparse矩阵
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
# 3、调用inverse_transform() array数组或者sparse矩阵,返回值转换之前的数据格式
data_real = transfer.inverse_transform(data_new)
print("data_real: \n", data_real)
print("特征名字:\n", transfer.get_feature_names_out())
5. 特征预处理
去除数值数据的量纲:(不同特征之间量纲不一,但是数据特征同等重要)
归一化
标准化
5.1 归一化
通过对原始数据进行变换把数据映射到(默认为[0,1]之间)
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
# 取原始数据中的所有行,前三列数据
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = MinMaxScaler()
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
最大值与最小值非常容易受到异常值的影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景
5.2 标准化
通过对原始数据进行变换把数据映射到均值为0,标准差为1的范围内
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
# 取原始数据中的所有行,前三列数据
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = StandardScaler()
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
对于标准化来说,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响不大,从而标准差改变较小。
6. 特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
6.1 降维的两种选择
特征选择 L1正则化
主成分分析(一种特征提取的方式)
6.2 特征选择
1. 定义:
特征选择:数据中包含冗余或相关变量(特征),旨在从原有特征中找出主要特征
2. 方法:
Filter过滤式:主要研究特征本身特点、特征与特征和特征与目标值之间的关联
(1)方差选择法:低方差特征过滤
(2)相关系数:特征与特征之间的相关程度
Embedded嵌入式:算法自动选择特征(特征与目标值之间的关联)
(1)决策树:信息熵、信息增益
(2)正则化:L1
(3)深度学习:卷积
3. 模块:
sklearn.feature_selection
4. 过滤式
4.1 低方差特征过滤 删除低方差的一些特征
特征方差小:某个特征大多样本的值比较接近
特征方差大:某个特征很多样本的值都有差别
API sklearn.feature_selection.VArianceThreshold(threshold=0.0)
删除所有低方差特征
Variance.fit_transform(X),X:numpy array格式的数据[m_sample,n_features],返回值:训练集差异低于threadshold的特征将被删除。默认值是保留非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
# 取原始数据中的所有行,前三列数据
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform, 方差小于10的特征将被删除
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
4.2 相关系数
皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标
公式:
特点:
API from scipy.stats import pearsonr
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
from scipy.stats import pearsonr
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
# 取原始数据中的所有行,前三列数据
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform, 方差小于10的特征将被删除
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
# 计算两个变量之间的相关系数
r = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r)
相关系数返回的是一个元组(皮尔逊相关系数,P值)