1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【機(jī)器學(xué)習(xí)】特征選擇的通俗講解!

        共 9814字,需瀏覽 20分鐘

         ·

        2021-05-20 10:22

        ↑↑↑點(diǎn)擊上方藍(lán)字,回復(fù)資料,10個(gè)G的驚喜

        簡(jiǎn)介

        據(jù)《福布斯》報(bào)道,每天大約會(huì)有 250 萬(wàn)字節(jié)的數(shù)據(jù)被產(chǎn)生。然后,可以使用數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)技術(shù)對(duì)這些數(shù)據(jù)進(jìn)行分析,以便提供分析和作出預(yù)測(cè)。盡管在大多數(shù)情況下,在開(kāi)始任何統(tǒng)計(jì)分析之前,需要先對(duì)最初收集的數(shù)據(jù)進(jìn)行預(yù)處理。有許多不同的原因?qū)е滦枰M(jìn)行預(yù)處理分析,例如:

        • 收集的數(shù)據(jù)格式不對(duì)(如 SQL 數(shù)據(jù)庫(kù)、JSON、CSV 等)
        • 缺失值和異常值
        • 標(biāo)準(zhǔn)化
        • 減少數(shù)據(jù)集中存在的固有噪聲(部分存儲(chǔ)數(shù)據(jù)可能已損壞)
        • 數(shù)據(jù)集中的某些功能可能無(wú)法收集任何信息以供分析

        在本文中,我將通俗介紹如何使用 python 減少 kaggle Mushroom Classification 數(shù)據(jù)集中的特性數(shù)量。

        減少統(tǒng)計(jì)分析期間要使用的特征的數(shù)量可能會(huì)帶來(lái)一些好處,例如:

        • 提高精度
        • 降低過(guò)擬合風(fēng)險(xiǎn)
        • 加快訓(xùn)練速度
        • 改進(jìn)數(shù)據(jù)可視化
        • 增加我們模型的可解釋性

        事實(shí)上,統(tǒng)計(jì)上證明,當(dāng)執(zhí)行機(jī)器學(xué)習(xí)任務(wù)時(shí),存在針對(duì)每個(gè)特定任務(wù)應(yīng)該使用的最佳數(shù)量的特征(圖 1)。如果添加的特征比必要的特征多,那么我們的模型性能將下降(因?yàn)樘砑恿嗽肼暎?。真正的挑?zhàn)是找出哪些特征是最佳的使用特征(這實(shí)際上取決于我們提供的數(shù)據(jù)量和我們正在努力實(shí)現(xiàn)的任務(wù)的復(fù)雜性)。這就是特征選擇技術(shù)能夠幫到我們的地方!

        圖1:分類器性能和維度之間的關(guān)系

        特征選擇

        有許多不同的方法可用于特征選擇。其中最重要的是:

        1. 過(guò)濾方法=過(guò)濾我們的數(shù)據(jù)集,只取包含所有相關(guān)特征的子集(例如,使用 Pearson 相關(guān)的相關(guān)矩陣)。

        2. 遵循過(guò)濾方法的相同目標(biāo),但使用機(jī)器學(xué)習(xí)模型作為其評(píng)估標(biāo)準(zhǔn)(例如,向前/向后/雙向/遞歸特征消除)。我們將一些特征輸入機(jī)器學(xué)習(xí)模型,評(píng)估它們的性能,然后決定是否添加或刪除特征以提高精度。因此,這種方法可以比濾波更精確,但計(jì)算成本更高。

        3. 嵌入方法。與過(guò)濾方法一樣,嵌入方法也使用機(jī)器學(xué)習(xí)模型。這兩種方法的區(qū)別在于,嵌入的方法檢查 ML 模型的不同訓(xùn)練迭代,然后根據(jù)每個(gè)特征對(duì) ML 模型訓(xùn)練的貢獻(xiàn)程度對(duì)每個(gè)特征的重要性進(jìn)行排序。

        圖2:過(guò)濾器、包裝器和嵌入式方法表示 [3]

        實(shí)踐

        在本文中,我將使用 Mushroom Classification 數(shù)據(jù)集,通過(guò)查看給定的特征來(lái)嘗試預(yù)測(cè)蘑菇是否有毒。在這樣做的同時(shí),我們將嘗試不同的特征消除技術(shù),看看它們會(huì)如何影響訓(xùn)練時(shí)間和模型整體的精度。

        數(shù)據(jù)下載:https://github.com/ffzs/dataset/blob/master/mushrooms.csv

        首先,我們需要導(dǎo)入所有必需的庫(kù)。我們將在本例中使用的數(shù)據(jù)集如下圖所示。

        圖3:Mushroom Classification 數(shù)據(jù)集

        在將這些數(shù)據(jù)輸入機(jī)器學(xué)習(xí)模型之前,我決定對(duì)所有分類變量進(jìn)行 one hot 編碼,將數(shù)據(jù)分為特征(x)和標(biāo)簽(y),最后在訓(xùn)練集和測(cè)試集中進(jìn)行。

        X = df.drop(['class'], axis = 1)
        Y = df['class']
        X = pd.get_dummies(X, prefix_sep='_')
        Y = LabelEncoder().fit_transform(Y)

        X2 = StandardScaler().fit_transform(X)

        X_Train, X_Test, Y_Train, Y_Test = train_test_split(X2, Y, test_size = 0.30,  random_state = 101)

        特征重要性

        基于集合的決策樹(shù)模型(如隨機(jī)森林)可以用來(lái)對(duì)不同特征的重要性進(jìn)行排序。了解我們的模型最重要的特征對(duì)于理解我們的模型如何做出預(yù)測(cè)(使其更易于解釋)是至關(guān)重要的。同時(shí),我們可以去掉那些對(duì)我們的模型沒(méi)有任何好處的特征。

        start = time.process_time()
        trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train,Y_Train)
        print(time.process_time() - start)
        predictionforest = trainedforest.predict(X_Test)
        print(confusion_matrix(Y_Test,predictionforest))
        print(classification_report(Y_Test,predictionforest))

        如下圖所示,使用所有特征訓(xùn)練一個(gè)隨機(jī)森林分類器,在大約 2.2 秒的訓(xùn)練時(shí)間內(nèi)獲得 100% 的準(zhǔn)確率。在下面的每個(gè)示例中,每個(gè)模型的訓(xùn)練時(shí)間都將打印在每個(gè)片段的第一行,供你參考。一旦我們的隨機(jī)森林分類器得到訓(xùn)練,我們就可以創(chuàng)建一個(gè)特征重要性圖,看看哪些特征對(duì)我們的模型預(yù)測(cè)來(lái)說(shuō)是最重要的(圖 4)。在本例中,下面只顯示了前 7 個(gè)特性。

        figure(num=None, figsize=(20, 22), dpi=80, facecolor='w', edgecolor='k')

        feat_importances = pd.Series(trainedforest.feature_importances_, index= X.columns)
        feat_importances.nlargest(7).plot(kind='barh')
        圖4:特征重要性圖

        現(xiàn)在我們知道了哪些特征被我們的隨機(jī)森林認(rèn)為是最重要的,我們可以嘗試使用前 3 個(gè)來(lái)訓(xùn)練我們的模型。

        X_Reduced = X[['odor_n','odor_f''gill-size_n','gill-size_b']]
        X_Reduced = StandardScaler().fit_transform(X_Reduced)
        X_Train2, X_Test2, Y_Train2, Y_Test2 = train_test_split(X_Reduced, Y, test_size = 0.30,  random_state = 101)

        start = time.process_time()
        trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train2,Y_Train2)
        print(time.process_time() - start)
        predictionforest = trainedforest.predict(X_Test2)
        print(confusion_matrix(Y_Test2,predictionforest))
        print(classification_report(Y_Test2,predictionforest))

        正如我們?cè)谙旅婵吹降?,僅僅使用 3 個(gè)特征,只會(huì)導(dǎo)致準(zhǔn)確率下降 0.03%,訓(xùn)練時(shí)間減少一半。我們還可以通過(guò)可視化一個(gè)訓(xùn)練過(guò)的決策樹(shù)來(lái)理解如何進(jìn)行特征選擇。

        start = time.process_time()
        trainedtree = tree.DecisionTreeClassifier().fit(X_Train, Y_Train)
        print(time.process_time() - start)
        predictionstree = trainedtree.predict(X_Test)
        print(confusion_matrix(Y_Test,predictionstree))
        print(classification_report(Y_Test,predictionstree))

        樹(shù)結(jié)構(gòu)頂部的特征是我們的模型為了執(zhí)行分類而保留的最重要的特征。因此,只選擇頂部的前幾個(gè)特征,而放棄其他特征,可能創(chuàng)建一個(gè)準(zhǔn)確度非??捎^的模型。

        import graphviz
        from sklearn.tree import DecisionTreeClassifier, export_graphviz


        data = export_graphviz(trainedtree,out_file=None,feature_names= X.columns,
                class_names=['edible''poisonous'], 
                filled=True, rounded=True, 
                max_depth=2,
                special_characters=True)
        graph = graphviz.Source(data)
        graph
        圖5:決策樹(shù)可視化

        遞歸特征消除(RFE)

        遞歸特征消除(RFE)將機(jī)器學(xué)習(xí)模型的實(shí)例和要使用的最終期望特征數(shù)作為輸入。然后,它遞歸地減少要使用的特征的數(shù)量,采用的方法是使用機(jī)器學(xué)習(xí)模型精度作為度量對(duì)它們進(jìn)行排序。

        創(chuàng)建一個(gè) for 循環(huán),其中輸入特征的數(shù)量是我們的變量,這樣就可以通過(guò)跟蹤在每個(gè)循環(huán)迭代中注冊(cè)的精度,找出我們的模型所需的最佳特征數(shù)量。使用 RFE 支持方法,我們可以找出被評(píng)估為最重要的特征的名稱(rfe.support 返回一個(gè)布爾列表,其中 true 表示一個(gè)特征被視為重要,false 表示一個(gè)特征不重要)。

        from sklearn.feature_selection import RFE

        model = RandomForestClassifier(n_estimators=700)
        rfe = RFE(model, 4)
        start = time.process_time()
        RFE_X_Train = rfe.fit_transform(X_Train,Y_Train)
        RFE_X_Test = rfe.transform(X_Test)
        rfe = rfe.fit(RFE_X_Train,Y_Train)
        print(time.process_time() - start)
        print("Overall Accuracy using RFE: ", rfe.score(RFE_X_Test,Y_Test))

        SelecFromModel

        selectfrommodel 是另一種 scikit 學(xué)習(xí)方法,可用于特征選擇。此方法可用于具有 coef 或 feature 重要性屬性的所有不同類型的 scikit 學(xué)習(xí)模型(擬合后)。與 rfe 相比,selectfrommodel 是一個(gè)不太可靠的解決方案。實(shí)際上,selectfrommodel 只是根據(jù)計(jì)算出的閾值(不涉及優(yōu)化迭代過(guò)程)刪除不太重要的特性。

        為了測(cè)試 selectfrommodel 的有效性,我決定在這個(gè)例子中使用一個(gè) ExtraTreesClassifier。

        ExtratreesClassifier(極端隨機(jī)樹(shù))是基于樹(shù)的集成分類器,與隨機(jī)森林方法相比,它可以產(chǎn)生更少的方差(因此減少了過(guò)擬合的風(fēng)險(xiǎn))。隨機(jī)森林和極隨機(jī)樹(shù)的主要區(qū)別在于極隨機(jī)樹(shù)中節(jié)點(diǎn)的采樣不需要替換。

        from sklearn.ensemble import ExtraTreesClassifier
        from sklearn.feature_selection import SelectFromModel

        model = ExtraTreesClassifier()
        start = time.process_time()
        model = model.fit(X_Train,Y_Train)
        model = SelectFromModel(model, prefit=True)
        print(time.process_time() - start)
        Selected_X = model.transform(X_Train)

        start = time.process_time()
        trainedforest = RandomForestClassifier(n_estimators=700).fit(Selected_X, Y_Train)
        print(time.process_time() - start)
        Selected_X_Test = model.transform(X_Test)
        predictionforest = trainedforest.predict(Selected_X_Test)
        print(confusion_matrix(Y_Test,predictionforest))
        print(classification_report(Y_Test,predictionforest))

        相關(guān)矩陣分析

        為了減少數(shù)據(jù)集中的特征數(shù)量,另一種可能的方法是檢查特征與標(biāo)簽的相關(guān)性。

        使用皮爾遜相關(guān),我們的返回系數(shù)值將在-1 和 1 之間變化:

        • 如果兩個(gè)特征之間的相關(guān)性為 0,則意味著更改這兩個(gè)特征中的任何一個(gè)都不會(huì)影響另一個(gè)。

        • 如果兩個(gè)特征之間的相關(guān)性大于 0,這意味著增加一個(gè)特征中的值也會(huì)增加另一個(gè)特征中的值(相關(guān)系數(shù)越接近 1,兩個(gè)不同特征之間的這種聯(lián)系就越強(qiáng))。

        • 如果兩個(gè)特征之間的相關(guān)性小于 0,這意味著增加一個(gè)特征中的值將使減少另一個(gè)特征中的值(相關(guān)性系數(shù)越接近-1,兩個(gè)不同特征之間的這種關(guān)系將越強(qiáng))。

        在這種情況下,我們將只考慮與輸出變量至少 0.5 相關(guān)的特性。

        Numeric_df = pd.DataFrame(X)
        Numeric_df['Y'] = Y
        corr= Numeric_df.corr()
        corr_y = abs(corr["Y"])
        highest_corr = corr_y[corr_y >0.5]
        highest_corr.sort_values(ascending=True)

        我們現(xiàn)在可以通過(guò)創(chuàng)建一個(gè)相關(guān)矩陣來(lái)更仔細(xì)地研究不同相關(guān)特征之間的關(guān)系。

        figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')

        corr2 = Numeric_df[['bruises_f' , 'bruises_t' , 'gill-color_b' , 'gill-size_b' ,  'gill-size_n' , 'ring-type_p' , 'stalk-surface-below-ring_k' ,  'stalk-surface-above-ring_k' , 'odor_f''odor_n']].corr()

        sns.heatmap(corr2, annot=True, fmt=".2g")
        圖6:最高相關(guān)特征的相關(guān)矩陣

        在這項(xiàng)分析中,另一個(gè)可能要控制的方面是檢查所選變量是否彼此高度相關(guān)。如果是的話,我們就只需要保留其中一個(gè)相關(guān)的,去掉其他的。

        最后,我們現(xiàn)在可以只選擇與 y 相關(guān)度最高的特征,訓(xùn)練/測(cè)試一個(gè)支持向量機(jī)模型來(lái)評(píng)估該方法的結(jié)果。

        單變量選擇

        單變量特征選擇是一種統(tǒng)計(jì)方法,用于選擇與我們對(duì)應(yīng)標(biāo)簽關(guān)系最密切的特征。使用 selectkbest 方法,我們可以決定使用哪些指標(biāo)來(lái)評(píng)估我們的特征,以及我們希望保留的 k 個(gè)最佳特征的數(shù)量。根據(jù)我們的需要,提供不同類型的評(píng)分函數(shù):

        Classification = chi2, f_classif, mutual_info_classif
        Regression = f_regression, mutual_info_regression

        在本例中,我們將使用 chi2(圖7)。

        圖7:卡方公式 [4]

        卡方(chi-squared,chi2)可以將非負(fù)值作為輸入,因此,首先,我們?cè)?0 到 1 之間的范圍內(nèi)縮放輸入數(shù)據(jù)。

        from sklearn.feature_selection import SelectKBest
        from sklearn.feature_selection import chi2

        min_max_scaler = preprocessing.MinMaxScaler()
        Scaled_X = min_max_scaler.fit_transform(X2)

        X_new = SelectKBest(chi2, k=2).fit_transform(Scaled_X, Y)
        X_Train3, X_Test3, Y_Train3, Y_Test3 = train_test_split(X_new, Y, test_size = 0.30,  random_state = 101)
        start = time.process_time()
        trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train3,Y_Train3)
        print(time.process_time() - start)
        predictionforest = trainedforest.predict(X_Test3)
        print(confusion_matrix(Y_Test3,predictionforest))
        print(classification_report(Y_Test3,predictionforest))

        套索回歸

        當(dāng)將正則化應(yīng)用于機(jī)器學(xué)習(xí)模型時(shí),我們?cè)谀P蛥?shù)上加上一個(gè)懲罰,以避免我們的模型試圖太接近我們的輸入數(shù)據(jù)。通過(guò)這種方式,我們可以使我們的模型不那么復(fù)雜,并且我們可以避免過(guò)度擬合(使我們的模型不僅學(xué)習(xí)關(guān)鍵的數(shù)據(jù)特征,而且學(xué)習(xí)它的內(nèi)在噪聲)。

        其中一種可能的正則化方法是套索回歸。當(dāng)使用套索回歸時(shí),如果輸入特征的系數(shù)對(duì)我們的機(jī)器學(xué)習(xí)模型訓(xùn)練沒(méi)有積極的貢獻(xiàn),則它們會(huì)縮小。這樣,一些特征可能會(huì)被自動(dòng)丟棄,即將它們的系數(shù)指定為零。

        from sklearn.linear_model import LassoCV

        regr = LassoCV(cv=5, random_state=101)
        regr.fit(X_Train,Y_Train)
        print("LassoCV Best Alpha Scored: ", regr.alpha_)
        print("LassoCV Model Accuracy: ", regr.score(X_Test, Y_Test))
        model_coef = pd.Series(regr.coef_, index = list(X.columns[:-1]))
        print("Variables Eliminated: ", str(sum(model_coef == 0)))
        print("Variables Kept: ", str(sum(model_coef != 0)))

        一旦訓(xùn)練了我們的模型,我們就可以再次創(chuàng)建一個(gè)特征重要性圖來(lái)了解哪些特征被我們的模型認(rèn)為是最重要的(圖 8)。這是非常有用的,尤其是在試圖理解我們的模型是如何決定做出預(yù)測(cè)的時(shí)候,因此使我們的模型更易于解釋。

        figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')

        top_coef = model_coef.sort_values()
        top_coef[top_coef != 0].plot(kind = "barh")
        plt.title("Most Important Features Identified using Lasso (!0)")
        圖8:套索特征重要性圖


        本文轉(zhuǎn)載自公眾號(hào)Python數(shù)據(jù)之道

        來(lái)源:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784

        也可以加一下老胡的微信
        圍觀朋友圈~~~


        推薦閱讀

        (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

        微軟這個(gè)太強(qiáng)了

        人工智能有多智障?

        在公司內(nèi)網(wǎng)搭建 pip 鏡像站

        【收藏】最全的Python常用標(biāo)準(zhǔn)庫(kù)及第三方庫(kù)

        為什么美國(guó)學(xué)生學(xué)的數(shù)學(xué)比我們簡(jiǎn)單,卻能做出很牛逼的東西?

        老鐵,三連支持一下,好嗎?↓↓↓


        瀏覽 46
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产日韩在线观看视频 | 青青草中文字幕在线 | 女人19毛片水真多免费视频 | 雷电将军和丘丘人繁衍后代视频 | 久久黄视频 | 一级片99| 婷婷五月丁香在线 | 亲嘴还扔衣服亲嘴 | 午夜精品美女久久久久av福利 | 蜜臀久久99精品久久久久久牛牛 |