# 計算變量的方差
# 如果方差接近于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小時內與您取得聯系。