<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          數(shù)據(jù)特征選擇(二)

          共 7373字,需瀏覽 15分鐘

           ·

          2020-08-17 23:15

          ?4 隨機森林

          隨機森林具有準(zhǔn)確率高、魯棒性好、易于使用等優(yōu)點,這使得它成為了目前最流行的機器學(xué)習(xí)算法之一。隨機森林提供了兩種特征選擇的方法:mean decrease impurity和mean decrease accuracy。

          ?4.1 平均不純度減少 mean decrease impurity

          隨機森林由多個決策樹構(gòu)成。決策樹中的每一個節(jié)點都是關(guān)于某個特征的條件,為的是將數(shù)據(jù)集按照不同的響應(yīng)變量一分為二。利用不純度可以確定節(jié)點(最優(yōu)條件),對于分類問題,通常采用?基尼不純度?或者?信息增益?,對于回歸問題,通常采用的是?方差?或者最小二乘擬合。當(dāng)訓(xùn)練決策樹的時候,可以計算出每個特征減少了多少樹的不純度。對于一個決策樹森林來說,可以算出每個特征平均減少了多少不純度,并把它平均減少的不純度作為特征選擇的值。

          下邊的例子是sklearn中基于隨機森林的特征重要度度量方法:

          from sklearn.datasets import load_boston
          from sklearn.ensemble import RandomForestRegressor
          import numpy as np
          #Load boston housing dataset as an example
          boston = load_boston()
          X = boston["data"]
          Y = boston["target"]
          names = boston["feature_names"]
          rf = RandomForestRegressor()
          rf.fit(X, Y)
          print "Features sorted by their score:"
          print sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names),
          reverse=True)

          Features sorted by their score: [(0.5298, ‘LSTAT’), (0.4116, ‘RM’), (0.0252, ‘DIS’), (0.0172, ‘CRIM’), (0.0065, ‘NOX’), (0.0035, ‘PTRATIO’), (0.0021, ‘TAX’), (0.0017, ‘AGE’), (0.0012, ‘B’), (0.0008, ‘INDUS’), (0.0004, ‘RAD’), (0.0001, ‘CHAS’), (0.0, ‘ZN’)]

          這里特征得分實際上采用的是?Gini Importance?。使用基于不純度的方法的時候,要記住:1、這種方法存在?偏向?,對具有更多類別的變量會更有利;2、對于存在關(guān)聯(lián)的多個特征,其中任意一個都可以作為指示器(優(yōu)秀的特征),并且一旦某個特征被選擇之后,其他特征的重要度就會急劇下降,因為不純度已經(jīng)被選中的那個特征降下來了,其他的特征就很難再降低那么多不純度了,這樣一來,只有先被選中的那個特征重要度很高,其他的關(guān)聯(lián)特征重要度往往較低。在理解數(shù)據(jù)時,這就會造成誤解,導(dǎo)致錯誤的認(rèn)為先被選中的特征是很重要的,而其余的特征是不重要的,但實際上這些特征對響應(yīng)變量的作用確實非常接近的(這跟Lasso是很像的)。

          特征隨機選擇?方法稍微緩解了這個問題,但總的來說并沒有完全解決。下面的例子中,X0、X1、X2是三個互相關(guān)聯(lián)的變量,在沒有噪音的情況下,輸出變量是三者之和。

          size = 10000
          np.random.seed(seed=10)
          X_seed = np.random.normal(0, 1, size)
          X0 = X_seed + np.random.normal(0, .1, size)
          X1 = X_seed + np.random.normal(0, .1, size)
          X2 = X_seed + np.random.normal(0, .1, size)
          X = np.array([X0, X1, X2]).T
          Y = X0 + X1 + X2

          rf = RandomForestRegressor(n_estimators=20, max_features=2)
          rf.fit(X, Y);
          print "Scores for X0, X1, X2:", map(lambda x:round (x,3),
          rf.feature_importances_)

          Scores for X0, X1, X2: [0.278, 0.66, 0.062]

          當(dāng)計算特征重要性時,可以看到X1的重要度比X2的重要度要高出10倍,但實際上他們真正的重要度是一樣的。盡管數(shù)據(jù)量已經(jīng)很大且沒有噪音,且用了20棵樹來做隨機選擇,但這個問題還是會存在。

          需要注意的一點是,關(guān)聯(lián)特征的打分存在不穩(wěn)定的現(xiàn)象,這不僅僅是隨機森林特有的,大多數(shù)基于模型的特征選擇方法都存在這個問題。

          ?4.2 平均精確率減少 Mean decrease accuracy

          另一種常用的特征選擇方法就是直接度量每個特征對模型精確率的影響。主要思路是打亂每個特征的特征值順序,并且度量順序變動對模型的精確率的影響。很明顯,對于不重要的變量來說,打亂順序?qū)δP偷木_率影響不會太大,但是對于重要的變量來說,打亂順序就會降低模型的精確率。

          這個方法sklearn中沒有直接提供,但是很容易實現(xiàn),下面繼續(xù)在波士頓房價數(shù)據(jù)集上進行實現(xiàn)。

          from sklearn.cross_validation import ShuffleSplit
          from sklearn.metrics import r2_score
          from collections import defaultdict
          X = boston["data"]
          Y = boston["target"]
          rf = RandomForestRegressor()
          scores = defaultdict(list)
          #crossvalidate the scores on a number of different random splits of the data
          for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
          X_train, X_test = X[train_idx], X[test_idx]
          Y_train, Y_test = Y[train_idx], Y[test_idx]
          r = rf.fit(X_train, Y_train)
          acc = r2_score(Y_test, rf.predict(X_test))
          for i in range(X.shape[1]):
          X_t = X_test.copy()
          np.random.shuffle(X_t[:, i])
          shuff_acc = r2_score(Y_test, rf.predict(X_t))
          scores[names[i]].append((acc-shuff_acc)/acc)
          print "Features sorted by their score:"
          print sorted([(round(np.mean(score), 4), feat) for
          feat, score in scores.items()], reverse=True)

          Features sorted by their score: [(0.7276, ‘LSTAT’), (0.5675, ‘RM’), (0.0867, ‘DIS’), (0.0407, ‘NOX’), (0.0351, ‘CRIM’), (0.0233, ‘PTRATIO’), (0.0168, ‘TAX’), (0.0122, ‘AGE’), (0.005, ‘B’), (0.0048, ‘INDUS’), (0.0043, ‘RAD’), (0.0004, ‘ZN’), (0.0001, ‘CHAS’)]

          在這個例子當(dāng)中,LSTAT和RM這兩個特征對模型的性能有著很大的影響,打亂這兩個特征的特征值使得模型的性能下降了73%和57%。注意,盡管這些我們是在所有特征上進行了訓(xùn)練得到了模型,然后才得到了每個特征的重要性測試,這并不意味著我們?nèi)拥裟硞€或者某些重要特征后模型的性能就一定會下降很多,因為即便某個特征刪掉之后,其關(guān)聯(lián)特征一樣可以發(fā)揮作用,讓模型性能基本上不變。

          ?5 兩種頂層特征選擇算法

          之所以叫做頂層,是因為他們都是建立在基于模型的特征選擇方法基礎(chǔ)之上的,例如回歸和SVM,在不同的子集上建立模型,然后匯總最終確定特征得分。

          ?5.1 穩(wěn)定性選擇 Stability selection

          穩(wěn)定性選擇是一種基于二次抽樣和選擇算法相結(jié)合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。它的主要思想是在不同的數(shù)據(jù)子集和特征子集上運行特征選擇算法,不斷的重復(fù),最終匯總特征選擇結(jié)果,比如可以統(tǒng)計某個特征被認(rèn)為是重要特征的頻率(被選為重要特征的次數(shù)除以它所在的子集被測試的次數(shù))。理想情況下,重要特征的得分會接近100%。稍微弱一點的特征得分會是非0的數(shù),而最無用的特征得分將會接近于0。

          sklearn在?隨機lasso?和?隨機邏輯回歸?中有對穩(wěn)定性選擇的實現(xiàn)。

          from sklearn.linear_model import RandomizedLasso
          from sklearn.datasets import load_boston
          boston = load_boston()

          #using the Boston housing data.
          #Data gets scaled automatically by sklearn's implementation
          X = boston["data"]
          Y = boston["target"]
          names = boston["feature_names"]

          rlasso = RandomizedLasso(alpha=0.025)
          rlasso.fit(X, Y)

          print "Features sorted by their score:"
          print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_),
          names), reverse=True)

          Features sorted by their score: [(1.0, ‘RM’), (1.0, ‘PTRATIO’), (1.0, ‘LSTAT’), (0.62, ‘CHAS’), (0.595, ‘B’), (0.39, ‘TAX’), (0.385, ‘CRIM’), (0.25, ‘DIS’), (0.22, ‘NOX’), (0.125, ‘INDUS’), (0.045, ‘ZN’), (0.02, ‘RAD’), (0.015, ‘AGE’)]

          在上邊這個例子當(dāng)中,最高的3個特征得分是1.0,這表示他們總會被選作有用的特征(當(dāng)然,得分會收到正則化參數(shù)alpha的影響,但是sklearn的隨機lasso能夠自動選擇最優(yōu)的alpha)。接下來的幾個特征得分就開始下降,但是下降的不是特別急劇,這跟純lasso的方法和隨機森林的結(jié)果不一樣。能夠看出穩(wěn)定性選擇對于克服過擬合和對數(shù)據(jù)理解來說都是有幫助的:總的來說,好的特征不會因為有相似的特征、關(guān)聯(lián)特征而得分為0,這跟Lasso是不同的。對于特征選擇任務(wù),在許多數(shù)據(jù)集和環(huán)境下,穩(wěn)定性選擇往往是性能最好的方法之一。

          ?5.2 遞歸特征消除 Recursive feature elimination (RFE)

          遞歸特征消除的主要思想是反復(fù)的構(gòu)建模型(如SVM或者回歸模型)然后選出最好的(或者最差的)的特征(可以根據(jù)系數(shù)來選),把選出來的特征放到一遍,然后在剩余的特征上重復(fù)這個過程,直到所有特征都遍歷了。這個過程中特征被消除的次序就是特征的排序。因此,這是一種尋找最優(yōu)特征子集的貪心算法。

          RFE的穩(wěn)定性很大程度上取決于在迭代的時候底層用哪種模型。例如,假如RFE采用的普通的回歸,沒有經(jīng)過正則化的回歸是不穩(wěn)定的,那么RFE就是不穩(wěn)定的;假如采用的是Ridge,而用Ridge正則化的回歸是穩(wěn)定的,那么RFE就是穩(wěn)定的。

          Sklearn提供了?RFE?包,可以用于特征消除,還提供了?RFECV?,可以通過交叉驗證來對的特征進行排序。

          from sklearn.feature_selection import RFE
          from sklearn.linear_model import LinearRegression

          boston = load_boston()
          X = boston["data"]
          Y = boston["target"]
          names = boston["feature_names"]

          #use linear regression as the model
          lr = LinearRegression()
          #rank all features, i.e continue the elimination until the last one
          rfe = RFE(lr, n_features_to_select=1)
          rfe.fit(X,Y)

          print "Features sorted by their rank:"
          print sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))

          Features sorted by their rank: [(1.0, ‘NOX’), (2.0, ‘RM’), (3.0, ‘CHAS’), (4.0, ‘PTRATIO’), (5.0, ‘DIS’), (6.0, ‘LSTAT’), (7.0, ‘RAD’), (8.0, ‘CRIM’), (9.0, ‘INDUS’), (10.0, ‘ZN’), (11.0, ‘TAX’), (12.0, ‘B’), (13.0, ‘AGE’)]

          總結(jié)

          對于理解數(shù)據(jù)、數(shù)據(jù)的結(jié)構(gòu)、特點來說,單變量特征選擇是個非常好的選擇。盡管可以用它對特征進行排序來優(yōu)化模型,但由于它不能發(fā)現(xiàn)冗余(例如假如一個特征子集,其中的特征之間具有很強的關(guān)聯(lián),那么從中選擇最優(yōu)的特征時就很難考慮到冗余的問題)。

          正則化的線性模型對于特征理解和特征選擇來說是非常強大的工具。L1正則化能夠生成稀疏的模型,對于選擇特征子集來說非常有用;相比起L1正則化,L2正則化的表現(xiàn)更加穩(wěn)定,由于有用的特征往往對應(yīng)系數(shù)非零,因此L2正則化對于數(shù)據(jù)的理解來說很合適。由于響應(yīng)變量和特征之間往往是非線性關(guān)系,可以采用basis expansion的方式將特征轉(zhuǎn)換到一個更加合適的空間當(dāng)中,在此基礎(chǔ)上再考慮運用簡單的線性模型。

          隨機森林是一種非常流行的特征選擇方法,它易于使用,一般不需要feature engineering、調(diào)參等繁瑣的步驟,并且很多工具包都提供了平均不純度下降方法。它的兩個主要問題,1是重要的特征有可能得分很低(關(guān)聯(lián)特征問題),2是這種方法對特征變量類別多的特征越有利(偏向問題)。盡管如此,這種方法仍然非常值得在你的應(yīng)用中試一試。

          特征選擇在很多機器學(xué)習(xí)和數(shù)據(jù)挖掘場景中都是非常有用的。在使用的時候要弄清楚自己的目標(biāo)是什么,然后找到哪種方法適用于自己的任務(wù)。當(dāng)選擇最優(yōu)特征以提升模型性能的時候,可以采用交叉驗證的方法來驗證某種方法是否比其他方法要好。當(dāng)用特征選擇的方法來理解數(shù)據(jù)的時候要留心,特征選擇模型的穩(wěn)定性非常重要,穩(wěn)定性差的模型很容易就會導(dǎo)致錯誤的結(jié)論。對數(shù)據(jù)進行二次采樣然后在子集上運行特征選擇算法能夠有所幫助,如果在各個子集上的結(jié)果是一致的,那就可以說在這個數(shù)據(jù)集上得出來的結(jié)論是可信的,可以用這種特征選擇模型的結(jié)果來理解數(shù)據(jù)。


          Tips

          什么是?卡方檢驗??用方差來衡量某個觀測頻率和理論頻率之間差異性的方法。

          什么是?皮爾森卡方檢驗??這是一種最常用的卡方檢驗方法,它有兩個用途:1是計算某個變量對某種分布的擬合程度,2是根據(jù)兩個觀測變量的?Contingency table?來計算這兩個變量是否是獨立的。主要有三個步驟:第一步用方差和的方式來計算觀測頻率和理論頻率之間卡方值;第二步算出卡方檢驗的自由度(行數(shù)-1乘以列數(shù)-1);第三步比較卡方值和對應(yīng)自由度的卡方分布,判斷顯著性。

          什么是?p-value??簡單地說,p-value就是為了驗證假設(shè)和實際之間一致性的統(tǒng)計學(xué)意義的值,即假設(shè)檢驗。有些地方叫右尾概率,根據(jù)卡方值和自由度可以算出一個固定的p-value。

          什么是?響應(yīng)變量(response value)??簡單地說,模型的輸入叫做explanatroy variables,模型的輸出叫做response variables,其實就是要驗證該特征對結(jié)果造成了什么樣的影響。

          ? 什么是?零假設(shè)(null hypothesis)??在相關(guān)性檢驗中,一般會取“兩者之間無關(guān)聯(lián)”作為零假設(shè),而在獨立性檢驗中,一般會取“兩者之間是獨立”作為零假設(shè)。與零假設(shè)相對的是備擇假設(shè)(對立假設(shè)),即希望證明是正確的另一種可能。


          《數(shù)據(jù)科學(xué)與人工智能》公眾號推薦朋友們學(xué)習(xí)和使用Python語言,需要加入Python語言群的,請掃碼加我個人微信,我誠邀你入群,大家學(xué)習(xí)和分享。


          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕亚洲在线观看 | 精品国产18久久久久久 | 肏逼视频在线观看 | 慢慢操一区二区 | 婷婷色综合 |