# 计算变量的方差
# 如果方差接近于0,也就是该特征的特征值之间基本上没有差异,这个特征对于样本的区分并没有什么用,剔除
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1) #默认threshold=0.0
selector.fit_transform(df[numerical_features])
# 查看各个特征的方差,
selector.variances_ ,len(selector.variances_)
# 特征对应方差
all_used_features_dict = dict(zip(numerical_features,selector.variances_ ))
all_used_features_dict
协方差
如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;
如果协方差维负,说明X,Y反向运动,协方差越小说明反向程度越高;
如果两个变量相互独立,那么协方差就是0,说明两个变量不相关。
pearson系数
(1) 相关概念和值大小含义
相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。
可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。由于它是标准化后的协方差,因此更重要的特性来了,它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。
假设对于Pearson r相关性,两个变量都应该是正态分布的
pearson数值大小衡量相关性:
0.8-1.0 极强相关 | 0.6-0.8 强相关 | 0.4-0.6 中等程度相关 | 0.2-0.4 弱相关 | 0.0-0.2 极弱相关或无相关
(2) pearson 系数的优缺点:
优点: 可以通过数值对变量之间相关性衡量,正值代表正相关、负值代表负相关、0代表不相关
缺点: 没有对变量之间的关系进行提炼和学习,预测其实是学习不同特征之间的组合既关系。只能判别特征之间的线性相关性,如果是非线性相关就不可取。
(3) 适用场景
两个变量之间是线性关系,都是连续数据。
两个变量的总体是正态分布,或接近正态的单峰分布。
两个变量的观测值是成对的,每对观测值之间相互独立
(4) 相关代码
通过numpy
import numpy as np
np.corrcoef([a,b,c,d])
pandas中corr()函数
import matplotlib.pyplot as plt
plt.figure(figsize = (25,25))
#### 传入相关特征即可,输出为所有特征之间相关性
corr_values1 = data[features].corr()
sns.heatmap(corr_values1, annot=True,vmax=1, square=True, cmap="Blues",fmt='.2f')
plt.tight_layout()
plt.savefig('**.png',dpi=600)
plt.show()
利用scipy,输出两个值,第一个值为相关系数,第二个值越小代表两个之间相关性越高
import numpy as np
from scipy.stats import pearsonr
### 计算两个特征之间相关性,同时也可以计算特征和标签之间相关性
print("Lower noise", df(x, x1))
(5) 通过pearson系数删选特征
5.1 通过和label之间的相关性之间,通过设置阈值删选
def del_corr_fea(df,cor_df):
"""
df是原始数据,cor_df为通过pd.corr()获得特征间相关性矩阵,
"""
cor_df = cor_df.reset_index()
feature_col = [col for col in df.columns if col not in drop_fea_list]
drop_fea = []
for i,f in enumerate(feature_col):
if f not in drop_fea:
cor_df1 = cor_df[i+1:][[f,'index']]
cor_df_sel = cor_df1[cor_df1[f]>=0.8]
cor_df_sel.sort_values(by=[f],ascending = False,inplace = True)
del_name = cor_df_sel['index'].values.tolist()[1:]
drop_fea = del_name + drop_fea
return drop_fea
drop_list_no_p = del_corr_fea(data_end,corr_values_fea_fea)
5.2 首先计算不同特征之间相关性,然后通过相关性取出相似性最高的几个特征,并保留和label间系数最高的特征
def del_corr_fea(df,cor_df,cor_df_with_label):
"""
df是原始数据,cor_df为通过pd.corr()获得特征间相关性矩阵,cor_df_with_label和标签之间相关性
"""
cor_df = cor_df.reset_index()
cor_df = cor_df.rename(columns = {'index':'feature'})
feature_col = [col for col in df.columns if col not in drop_fea_list]
drop_fea = []
for i,f in enumerate(feature_col):
if f not in drop_fea:
print(len(drop_fea))
cor_df1 = cor_df[i:][[f,'feature']]
cor_df_sel = cor_df1[cor_df1[f]>=0.8]
sort_corr_df = cor_df_sel.merge(cor_df_with_label,on = 'feature',how = 'left')
## p 更改为相关性矩阵的列名
sort_corr_df.sort_values(by=['p'],ascending = False,inplace = True)
del_name = sort_corr_df['feature'].values.tolist()[1:]
drop_fea = del_name + drop_fea
return drop_fea
drop_feature_list = del_corr_fea(data_end,corr_values_fea_fea,d_df)
len(drop_feature_list)
(1) 最简单方式(回归模型,分类可以去官网查 https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html#sklearn.feature_selection.SelectKBest.set_params)
from sklearn.feature_selection import SelectKBest,f_regression
print(data_end.shape)
sk=SelectKBest(f_regression,k=300)
# drop_columns 为不需要判别的列名
new_train=sk.fit_transform(data_end.drop(drop_columns,axis = 1),data_end['label'].astype('int'))
print(new_train.shape)
# 获取对应列索引
select_columns=sk.get_support(indices = True)
print(select_columns)
print(data_end.columns[select_columns])
(2) 通过树模型输出特征重要性,一般选用Xgboost、Lightgbm等,这里采用lightgbm示例。
今天这篇文章跟大家分享的主题是关于筛选页面的设计。作为一个有逼格的设计师,你不但要知道怎么做,还要知道为什么这么做。以免被甲方、老板、运营等问的哑口无言、冒头苦改设计,经历身心的摧残后,一句“还是第一版最好”内心崩溃。
过javascript获取日期方法封装一些年月日期筛选,方便日后调用!
具体集合了以下几种方法
效果如下:
主要代码:
html:
javascript:
*请认真填写需求信息,我们会在24小时内与您取得联系。