特征降维
定义:降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
降维的两种方式
- 特征选择
- 主成分分析(可以理解一种特征提取的方式)
什么是特征选择
定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
方法:
Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
1.方差选择法:低方差特征过滤
2.相关系数
Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
1.决策树:信息熵、信息增益
2.正则化:L1、L2
3.深度学习:卷积等
模块
sklearn.feature_selection
过滤式
低方差特征过滤
删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。
- 特征方差小:某个特征大多样本的值比较相近
- 特征方差大:某个特征很多样本的值都有差别
API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
- 删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
数据计算
我们对某些股票的指标特征之间进行一个筛选,数据在"factor_regression_data/factor_returns.csv"文件当中,除去'index,'date','return'列不考虑(这些类型不匹配,也不是所需要指标)
一共这些特征
pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense
分析
1、初始化VarianceThreshold,指定阀值方差
2、调用fit_transform
from sklearn.feature_selection import VarianceThreshold import pandas as pd from scipy.stats import pearsonr 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
if __name__ == "__main__":
# 代码10:低方差特征过滤
variance_demo()
相关系数
皮尔逊相关系数(Pearson Correlation Coefficient)
- 反映变量之间相关关系密切程度的统计指标
公式计算案例(了解,不用记忆)
- 比如说我们计算年广告费投入与月均销售额
-
那么之间的相关系数怎么计算
最终计算:
= 0.9942
所以我们最终得出结论是广告投入费与月平均销售额之间有高度的正相关关系。
特点
相关系数的值介于–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
from scipy.stats import pearsonr
- x : (N,) array_like
- y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
案例:股票的财务指标相关性计算
我们刚才的股票的这些指标进行相关性计算, 假设我们以
factor = ['pe_ratio','pb_ratio','market_cap','return_on_asset_net_profit','du_return_on_equity','ev','earnings_per_share','revenue','total_expense']
这些特征当中的两两进行计算,得出相关性高的一些特征
import pandas as pd from scipy.stats import pearsonr def pearsonr_demo(): """ 相关系数计算 :return: None """ data = pd.read_csv("factor_returns.csv") factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev', 'earnings_per_share', 'revenue', 'total_expense'] for i in range(len(factor)): for j in range(i, len(factor) - 1): print( "指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0])) return None
从中我们得出
- 指标revenue与指标total_expense之间的相关性大小为0.995845
- 指标return_on_asset_net_profit与指标du_return_on_equity之间的相关性大小为0.818697
我们也可以通过画图来观察结果
import matplotlib.pyplot as plt plt.figure(figsize=(20, 8), dpi=100) plt.scatter(data['revenue'], data['total_expense']) plt.show()