目录
特征预处理
为什么要进行归一化和标准化?
特征预处理API
包含内容
归一化
标准化
降维
Filter过滤式
方差选择法——低方差过滤特征
相关系数法——特征与特征之间的相关程度
Embeded嵌入式
决策树
正则树
深度学习
主成分分析
通过一个转换函数将特征数据转换成更适合算法模型的特征数据过程
特征的单位或大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征。我们需要使用一些方法进行无量纲化,使不同规格的数据转换到同一规格。
例如:在评价一个汽车的好坏时,有这三个方面,这三个方面对于汽车的好坏评价的重要程度同等重要,但是由于消耗时间比这个特征的数值都比较小,里程数的数值都比较大,所以在计算的时候,消耗时间比对结果的影响占比较小,里程数对结果的影响占比较大。这个时候就需要进行归一化
sklearn.preprocessing
什么是归一化?较大通过对原始数据进行变换把数据映射到(默认为[0,1])之间
由公式可以看出,最大值与最小值非常容易受异常点影响,所以这种方法稳定性较差,只适合传统精确小数据场景。
处理前:
处理后:
- sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
- MinMaxScaler.fit_transform(X)
- X: numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
def minmax_demo():
#1.获取数据
data=pd.read_csv("dating.txt")
data=data.iloc[:,:3]
#2.实例化
transfer=MinMaxScaler(feature_range=[2,3]) #默认是0到1
#3.调用fir_transform
data_new=transfer.fit_transform(data)
#输出归一化的结果
print("将dating.txt文件中的前三列特征值进行归一化处理后得到的矩阵为:",data_new)
什么是标准化?就是通过对原始的数据进行变幻把数据变换到均值为0,标准差为1范围内
如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差的改变较小。 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
- sklearn.preprocessing.StandardScaler()
- 处理后,对每列来说,所有的数据都聚集在均值为0附近,标准差为1
- StandardScaler.fit_transform(X)
- X: numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
def stand_demo():
# 1.获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
# 2.实例化
transfer = StandardScaler()
# 3.调用fir_transform
data_new = transfer.fit_transform(data)
# 输出标准化的结果
print("将dating.txt文件中的前三列特征值进行归一化处理后得到的矩阵为:", data_new)
return None
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组不相关主变量的过程
如果在一组数据中,有两个特征的相关性很强(比如一只鸟的爪子大小和一只鸟是否有爪子),或者特征本身存在问题,那么对于算法学习预测的影响会比较大。
相关的特征太多,那么就会造成数据的冗余,处理起来会很不方便,这时候降维就会派上用场,对于保留相关特征中的一个即可。对于本身存在问题的特征可以舍去。
特征的方差小,那么某个特征大多样本的值比较相近,这时候这组数据显得没太大的参考意义。
API
sklearn.feature_selection.VarianceThreshold(threshold=0.0)
- 删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于Threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
def variance_demo():
#1.获取数据
data=pd.read_csv("factor_returns.csv")
data=data.iloc[:,1:-2]
#2.实例化一个转换器类
transfer=VarianceThreshold(threshold=10)#训练集差异低于10的特征将被删除。
#3.调用fit_transfrom
data_new=transfer.fit_transform(data)
return None
相关系数在[-1,1]区间内。当r<0时,表示两变量负相关,r>0时表示两变量正相关。|r|越接近于1,两变量间线性关系越密切,|r|越接近于0,两变量之间的线性相关越弱。
API
scipy.stats.pearsonr
from scipy.stats import pearsonr
print(pearsonr(data["pe_ratio"], data["pb_ratio"]))
运行结果为:
结果返回了两个值
第一个是皮尔逊相关系数
第二个是p值,p值表示对x和y不相关的零假设的检验,因此,若样本皮尔逊相关系数接近零将趋向提供较大的p值,若样本皮尔逊系数绝对值接近1那么将趋向提供较小的p值。总的来说,p值越大,那么两个特征相关性就越弱,越小,即相关性越强
特征与特征之间的相关性很高的话,那该做何处理呢?
- 选取其中一个
- 加权求和
- 主成分分析
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用:回归分析或者聚类分析当中
API
sklearn.decomposition.PCA(n_components=None)
- n_components:
- 小数:表示保留到百分之多少的信息
- 整数:减少到多少特征
- PCA.fit_transform(X) X:numpy array格式的数据
[n_samples, n_features]
- 返回值:转换后指定维度的array
from sklearn.decomposition import PCA
def pca_demo():
data=[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
#1.实例化一个转换器类
transfer=PCA(n_components=0.9)
#2.调用fit_transform
data_new=transfer.fit_transform(data)
print("data_new:\n",data_new)
return None
减少到3个特征