特征工程:
特征工程的目的是通过一系列工程活动,使用更有效的编码方法(特征)来表示这些信息。使用特征所代表的信息,信息的损失更少,并且仍然保留了原始数据中包含的规则。此外,新的编码方法还需要尽量减少原始数据中不确定因素(白噪声、异常数据、缺失数据等)的影响。
1. 特征提取
API
sklearn.feature_extraction
from sklearn.feature_extraction import***
1. 1 字典特征提取
字典特征提取 – 类别 -> one-hot编码
API
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
返回一个稀疏矩阵,
将非零值 按位置表示出来
节省内存 - 提高加载效率
应用场景:
1)pclass, sex 数据集当中类别特征比较多
1、将数据集的特征-》字典类型
2、DictVectorizer转换
2)本身拿到的数据就是字典类型
from sklearn.feature_extraction import DictVectorizer
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=True)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, type(data_new))
print("data_new:\n", data_new.toarray(), type(data_new))
print("特征名字:\n", transfer.get_feature_names())
1.2 文本特征提取
关键词:在某个分类的文章中出现多次,在其他分类的文章中很少出现
方法1:CountVectorizer
统计每个样本特征词出现的次数
API
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、实例化一个转换器类
# stop_words = [] 停用词表,停用词表中出现的词汇在文本中不计入统计
transfer = CountVectorizer(stop_words=["is", "too"])
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
方法2:TfidfVectorizer
与CountVectorizer方法不同的是,返回的矩阵中的数字代表权重,数字越大说明这个词汇的代表意义越大。
API
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
word = " ".join(list(jieba.cut(sent)))
data_new.append(word)
#print(data_new)
# 1、实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["一种", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
2. 特征预处理
通过一些转换函数将特征数据转换为更适合算法模型的特征数据的过程
特征处理API
API
sklearn.preprocessing
为什么我们要进行归一化/标准化?
特征的单位或大小差异很大,或者一个特征的方差比其他特征大几个数量级,这很容易影响(支配)目标结果,使得某些算法无法学习其他特征。
2.1 归一化
归一化:通过原始数据进行变换把数据映射到默认[0, 1]之间。(简单地说就是等比放缩)
API
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
MinMaxScalar.fit_transform(X)
X:numpy array 格式的数据[n_samples(样本数), n_features(特征数)]
返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
data = pd.read_csv(".\data_demo\dating.txt")
#data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = MinMaxScaler(feature_range=[2, 3])
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
2.2 标准化
当数据中存在异常值,且异常值或大或小时,使用归一化缩放会产生较大的误差。
使用规范化可以避免这个问题
标准化:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。
X’ = (X – 平均值)/ 标准差
应用场景:
在样本足够多的情况下比较稳定,适用于现代嘈杂的大数据场景。
API
sklearn.preprocessing.StandardScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X)
X:numpy array 格式的数据[n_samples(样本数), n_features(特征数)]
返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
data = pd.read_csv(".\data_demo\dating.txt")
#data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = StandardScaler()
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
3. 降维
降维:在一定的有限条件下对随机变量(特征)的数量进行降维,得到一组“不相关”的主变量的过程
即求线性代数中的最大独立向量群
降维有两种方法:
特征选择
主成分分析(能理解一种特征提取的方式)
3.1 特征选择
特征选择:数据中包含冗余或相关变量(或特征、属性、指标等),旨在从原始特征中找到主要特征
方法一 Filter(过滤式)
step1:方差选择
移除一些低方差的特征
小特征方差:一个特征的大多数样本具有相似的值(删除
特征方差大:一个特征的许多样本的值不同(保留
API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有方差低于threshold的特征
Variance.fit_transform(X)
X:numpy array 格式的数据[n_samples(样本数), n_features(特征数)]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,
即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
# 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)
这样就删除了方差小的两组特征
Step2:相关系数
相关系数反映特征与特征之间的相关程度,过滤掉相关系数高的特征
皮尔逊相关系数:响应变量之间相关性密切程度的统计指标
取值范围:–1 ≤ r ≤ +1
r > 0时, 表示两变量正相关
r < 0时, 表示两变量负相关
r = 0时, 两变量吴相关关系
|r| = 1时 两变量完全相关
API
from scipy.stats import pearsonr
传入向量x ,y
返回x向量和y向量的皮尔逊相关系数r
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
from scipy.stats import pearsonr
# 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)
可见的
"pe_ratio", "pb_ratio"相关性较低 -0.004389
'revenue', 'total_expense'相关性非常高 0.9958
当特征之间的相关性较高时,有以下解决方案:
1)选取其中一个
2)加权求和
3)主成分分析
方法二 Embeded嵌入式
决策树
正则化
深度学习
3.2 主成分分析(PCA)
定义:将高维数据转换为低维数据的过程,在此过程中可能会丢弃原始数据并创建新变量。
作用:是数据维度压缩,尽可能减少原始数据维度(复杂度),损失少量信息
应用:回归分析或聚类分析
API
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
n_components
小数 表示保留百分之多少的信息
整数 减少到多少特征
PCA.fit_transform(X) X:numpy array 格式的数据[n_samples(样本数), n_features(特征数)]
返回值:转换后指定维度的array
import pandas as pd
from sklearn.decomposition import PCA
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
transfer = PCA(n_components=0.95)
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
文章出处登录后可见!