日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

方差过滤: Removing features with low variance

發(fā)布時間:2025/3/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方差过滤: Removing features with low variance 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

方差特征選擇的原理與使用

VarianceThreshold 是特征選擇的一個簡單基本方法,其原理在于–底方差的特征的預測效果往往不好。而VarianceThreshold會移除所有那些方差不滿足一些閾值的特征。默認情況下,它將會移除所有的零方差特征,即那些在所有的樣本上的取值均不變的特征。

例如,假設(shè)我們有一個特征是布爾值的數(shù)據(jù)集,我們想要移除那些在整個數(shù)據(jù)集中特征值為0或者為1的比例超過80%的特征。布爾特征是伯努利( Bernoulli )隨機變量,變量的方差為


Var[X] = p(1-p)

因此,我們可以使用閾值.8*(1-.8)進行選擇:

from sklearn.feature_selection import *X = [[100, 1, 2, 3],[100, 4, 5, 6],[100, 7, 8, 9],[100, 11, 12, 13],[100, 11, 12, 13],[101, 11, 12, 13]]threshold = .8*(1-.8)def test_VarianceThreshold(X,threshold):selector = VarianceThreshold(threshold)selector.fit(X)print("Variances is %s" % selector.variances_)print("After transform is %s" % selector.transform(X))print("The surport is %s" % selector.get_support(True))print("After reverse transform is %s" %selector.inverse_transform(selector.transform(X)))return selector.transform(X)test_VarianceThreshold(X=X,threshold=threshold) Variances is [ 0.13888889 15.25 15.25 15.25 ] After transform is [[ 1 2 3][ 4 5 6][ 7 8 9][11 12 13][11 12 13][11 12 13]] The surport is [1 2 3] After reverse transform is [[ 0 1 2 3][ 0 4 5 6][ 0 7 8 9][ 0 11 12 13][ 0 11 12 13][ 0 11 12 13]]array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13],[11, 12, 13],[11, 12, 13]])

但是對于實際的數(shù)據(jù)集而言,很多時候底方差的數(shù)據(jù)并不代表著其不是有效的數(shù)據(jù),在很多時候移除底方差的數(shù)據(jù)帶來的可能并不是模型性能的提升,而是下降。下面的實驗就證明力這一現(xiàn)象

方差特征選擇的缺陷

首先,加載數(shù)據(jù)

from sklearn import datasets,model_selection def load_data():iris=datasets.load_iris() # scikit-learn 自帶的 iris 數(shù)據(jù)集X_train=iris.datay_train=iris.targetreturn model_selection.train_test_split(X_train, y_train,test_size=0.25,random_state=0,stratify=y_train)

然后定義一個用來比較性能差距的類,在之后的測試中我們將會一直使用這兩個類:

def show_tree(X_train,X_test,y_train,y_test):from sklearn.tree import DecisionTreeClassifiercriterions=['gini','entropy']for criterion in criterions:clf = DecisionTreeClassifier(criterion=criterion)clf.fit(X_train, y_train)print(" ",criterion,"Training score:%f"%(clf.score(X_train,y_train)))print(" ",criterion,"Testing score:%f"%(clf.score(X_test,y_test)))def comparison_tree(selector):X_train,X_test,y_train,y_test=load_data()print("\nBefore feture selection :\n")show_tree(X_train,X_test,y_train,y_test)print("\nAfter feture selection :\n")selector.fit(X_train)new_X_train = selector.transform(X_train)new_X_test = selector.transform(X_test)show_tree(new_X_train,new_X_test,y_train,y_test)comparison_tree(selector=VarianceThreshold(.8*(1-.8))) Before feture selection :gini Training score:1.000000gini Testing score:0.947368entropy Training score:1.000000entropy Testing score:0.947368After feture selection :gini Training score:1.000000gini Testing score:0.947368entropy Training score:1.000000entropy Testing score:0.921053

由上面的實驗可以證明,移除底方差的數(shù)據(jù)并不一定會帶來模型性能的性能提升,甚至可能是下降。

其他方法

參考

  • fit_transform : 使用數(shù)據(jù)并轉(zhuǎn)換
  • get_params : 獲取參數(shù)
  • get_support :獲取所選元素的整數(shù)索引
  • inverse_transform : 反轉(zhuǎn)換
  • set_params : 設(shè)置參數(shù)

本文參考

  • sklearn官方文檔
  • sklearn ApacheCN 官方翻譯

總結(jié)

以上是生活随笔為你收集整理的方差过滤: Removing features with low variance的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。