在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用python減少數據集中的特性數量

QQ475400555 ? 來源:機器視覺沙龍 ? 作者:機器視覺沙龍 ? 2022-11-15 09:40 ? 次閱讀

簡 介:據《福布斯》報道,每天大約會有 250 萬字節的數據被產生。然后,可以使用數據科學和機器學習技術對這些數據進行分析,以便提供分析和作出預測。盡管在大多數情況下,在開始任何統計分析之前,需要先對最初收集的數據進行預處理。有許多不同的原因導致需要進行預處理分析,例如:

收集的數據格式不對(如 SQL 數據庫、JSON、CSV 等)

缺失值和異常值

標準化

減少數據集中存在的固有噪聲(部分存儲數據可能已損壞)

數據集中的某些功能可能無法收集任何信息以供分析

在本文中,我將介紹如何使用 python 減少 kaggle Mushroom Classification 數據集中的特性數量。本文中使用的所有代碼在?kaggle 和我的?github 帳號上都有。減少統計分析期間要使用的特征的數量可能會帶來一些好處,例如:

高精度

降低過擬合風險

加快訓練速度

改進數據可視化

增加我們模型的可解釋性

事實上,統計上證明,當執行機器學習任務時,存在針對每個特定任務應該使用的最佳數量的特征(圖 1)。如果添加的特征比必要的特征多,那么我們的模型性能將下降(因為添加了噪聲)。真正的挑戰是找出哪些特征是最佳的使用特征(這實際上取決于我們提供的數據量和我們正在努力實現的任務的復雜性)。這就是特征選擇技術能夠幫到我們的地方!

圖 1:分類器性能和維度之間的關系特征選擇 有許多不同的方法可用于特征選擇。其中最重要的是:1.過濾方法=過濾我們的數據集,只取包含所有相關特征的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向后/雙向/遞歸特征消除)。我們將一些特征輸入機器學習模型,評估它們的性能,然后決定是否添加或刪除特征以提高精度。因此,這種方法可以比濾波更精確,但計算成本更高。3.嵌入方法。與過濾方法一樣,嵌入方法也使用機器學習模型。這兩種方法的區別在于,嵌入的方法檢查 ML 模型的不同訓練迭代,然后根據每個特征對 ML 模型訓練的貢獻程度對每個特征的重要性進行排序。

圖 2:過濾器、包裝器和嵌入式方法表示 [3]實踐 在本文中,我將使用 Mushroom Classification 數據集,通過查看給定的特征來嘗試預測蘑菇是否有毒。在這樣做的同時,我們將嘗試不同的特征消除技術,看看它們會如何影響訓練時間和模型整體的精度。首先,我們需要導入所有必需的庫。

152b247e-6479-11ed-8abf-dac502259ad0.png

我們將在本例中使用的數據集如下圖所示。

153410b6-6479-11ed-8abf-dac502259ad0.png

圖 3:Mushroom Classification 數據集在將這些數據輸入機器學習模型之前,我決定對所有分類變量進行 one hot 編碼,將數據分為特征(x)和標簽(y),最后在訓練集和測試集中進行。
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, 

特征重要性

基于集合的決策樹模型(如隨機森林)可以用來對不同特征的重要性進行排序。了解我們的模型最重要的特征對于理解我們的模型如何做出預測(使其更易于解釋)是至關重要的。同時,我們可以去掉那些對我們的模型沒有任何好處的特征。

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))
如下圖所示,使用所有特征訓練一個隨機森林分類器,在大約 2.2 秒的訓練時間內獲得 100% 的準確率。在下面的每個示例中,每個模型的訓練時間都將打印在每個片段的第一行,供你參考。

15411374-6479-11ed-8abf-dac502259ad0.png

一旦我們的隨機森林分類器得到訓練,我們就可以創建一個特征重要性圖,看看哪些特征對我們的模型預測來說是最重要的(圖 4)。在本例中,下面只顯示了前 7 個特性。
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')

154acd6a-6479-11ed-8abf-dac502259ad0.png

圖 4:特征重要性圖現在我們知道了哪些特征被我們的隨機森林認為是最重要的,我們可以嘗試使用前 3 個來訓練我們的模型。
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))
正如我們在下面看到的,僅僅使用 3 個特征,只會導致準確率下降 0.03%,訓練時間減少一半。

1554232e-6479-11ed-8abf-dac502259ad0.png

我們還可以通過可視化一個訓練過的決策樹來理解如何進行特征選擇。
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))

15616138-6479-11ed-8abf-dac502259ad0.png

樹結構頂部的特征是我們的模型為了執行分類而保留的最重要的特征。因此,只選擇頂部的前幾個特征,而放棄其他特征,可能創建一個準確度非常可觀的模型。
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

156cb6d2-6479-11ed-8abf-dac502259ad0.png

圖 5:決策樹可視化

遞歸特征消除(RFE)

遞歸特征消除(RFE)將機器學習模型的實例和要使用的最終期望特征數作為輸入。然后,它遞歸地減少要使用的特征的數量,采用的方法是使用機器學習模型精度作為度量對它們進行排序。創建一個 for 循環,其中輸入特征的數量是我們的變量,這樣就可以通過跟蹤在每個循環迭代中注冊的精度,找出我們的模型所需的最佳特征數量。使用 RFE 支持方法,我們可以找出被評估為最重要的特征的名稱(rfe.support 返回一個布爾列表,其中 true 表示一個特征被視為重要,false 表示一個特征不重要)。

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))

1576e5c6-6479-11ed-8abf-dac502259ad0.png

SelecFromModel

selectfrommodel 是另一種 scikit 學習方法,可用于特征選擇。此方法可用于具有 coef 或 feature 重要性屬性的所有不同類型的 scikit 學習模型(擬合后)。與 rfe 相比,selectfrommodel 是一個不太可靠的解決方案。實際上,selectfrommodel 只是根據計算出的閾值(不涉及優化迭代過程)刪除不太重要的特性。為了測試 selectfrommodel 的有效性,我決定在這個例子中使用一個 ExtraTreesClassifier。ExtratreesClassifier(極端隨機樹)是基于樹的集成分類器,與隨機森林方法相比,它可以產生更少的方差(因此減少了過擬合的風險)。隨機森林和極隨機樹的主要區別在于極隨機樹中節點的采樣不需要替換。

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))

15840c6a-6479-11ed-8abf-dac502259ad0.png

相關矩陣分析為了減少數據集中的特征數量,另一種可能的方法是檢查特征與標簽的相關性。使用皮爾遜相關,我們的返回系數值將在-1 和 1 之間變化:
  • 如果兩個特征之間的相關性為 0,則意味著更改這兩個特征中的任何一個都不會影響另一個。

  • 如果兩個特征之間的相關性大于 0,這意味著增加一個特征中的值也會增加另一個特征中的值(相關系數越接近 1,兩個不同特征之間的這種聯系就越強)。

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

在這種情況下,我們將只考慮與輸出變量至少 0.5 相關的特性。
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)

1591ee84-6479-11ed-8abf-dac502259ad0.png

我們現在可以通過創建一個相關矩陣來更仔細地研究不同相關特征之間的關系。
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")

159a614a-6479-11ed-8abf-dac502259ad0.png

圖 6:最高相關特征的相關矩陣在這項分析中,另一個可能要控制的方面是檢查所選變量是否彼此高度相關。如果是的話,我們就只需要保留其中一個相關的,去掉其他的。最后,我們現在可以只選擇與 y 相關度最高的特征,訓練/測試一個支持向量機模型來評估該方法的結果。

15aabbf8-6479-11ed-8abf-dac502259ad0.jpg

15b7b9c0-6479-11ed-8abf-dac502259ad0.png

單變量選擇單變量特征選擇是一種統計方法,用于選擇與我們對應標簽關系最密切的特征。使用 selectkbest 方法,我們可以決定使用哪些指標來評估我們的特征,以及我們希望保留的 k 個最佳特征的數量。根據我們的需要,提供不同類型的評分函數:
  • Classification = chi2, f_classif, mutual_info_classif

  • Regression = f_regression, mutual_info_regression

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

15c32b98-6479-11ed-8abf-dac502259ad0.png

圖 7:卡方公式 [4]卡方(chi-squared,chi2)可以將非負值作為輸入,因此,首先,我們在 0 到 1 之間的范圍內縮放輸入數據。
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))

15cca8a8-6479-11ed-8abf-dac502259ad0.png

套索回歸當將正則化應用于機器學習模型時,我們在模型參數上加上一個懲罰,以避免我們的模型試圖太接近我們的輸入數據。通過這種方式,我們可以使我們的模型不那么復雜,并且我們可以避免過度擬合(使我們的模型不僅學習關鍵的數據特征,而且學習它的內在噪聲)。其中一種可能的正則化方法是套索回歸。當使用套索回歸時,如果輸入特征的系數對我們的機器學習模型訓練沒有積極的貢獻,則它們會縮小。這樣,一些特征可能會被自動丟棄,即將它們的系數指定為零。
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)))

15d90d00-6479-11ed-8abf-dac502259ad0.png

一旦訓練了我們的模型,我們就可以再次創建一個特征重要性圖來了解哪些特征被我們的模型認為是最重要的(圖 8)。這是非常有用的,尤其是在試圖理解我們的模型是如何決定做出預測的時候,因此使我們的模型更易于解釋。
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)")

15e6b6bc-6479-11ed-8abf-dac502259ad0.png

圖 8:套索特征重要性圖 審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4802

    瀏覽量

    84890
  • 數據集
    +關注

    關注

    4

    文章

    1208

    瀏覽量

    24759

原文標題:收藏 | 機器學習特征選擇方法總結

文章出處:【微信號:機器視覺沙龍,微信公眾號:機器視覺沙龍】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    適用于MySQL和MariaDB的Python連接器:可靠的MySQL數據連接器和數據

    和 MariaDB 數據庫服務器以及托管數據庫服務,以對存儲的數據執行創建、讀取、更新和刪除操作。該解決方案完全實現了 Python DB API 2.0 規范,并作為 Window
    的頭像 發表于 01-17 12:18 ?63次閱讀
    適用于MySQL和MariaDB的<b class='flag-5'>Python</b>連接器:可靠的MySQL<b class='flag-5'>數據</b>連接器和<b class='flag-5'>數據</b>庫

    CAN通信節點多時,如何減少寄生電容和保障節點數量

    導讀在汽車電子與工業控制等領域,CAN通信至關重要。本文圍繞CAN通信,闡述節點增多時如何減少寄生電容的策略,同時從發送、接收節點等方面,講解保障節點數量及通信可靠性的方法。如何減少寄生電容?增加
    的頭像 發表于 01-03 11:41 ?801次閱讀
    CAN通信節點多時,如何<b class='flag-5'>減少</b>寄生電容和保障節點<b class='flag-5'>數量</b>?

    設計帶ADC電路時,如何用模擬地與數字地進行分割來減少數字地對模擬地的影響?

    我在設計帶ADC 電路時,希望用模擬地與數字地進行分割來減少數字地對模擬地的影響。但是,查詢一些資料得知推薦在ADC 的附近將數字地與模擬地進行單點連接。 但是,數字地與模擬地難道不是應該在總電源
    發表于 12-03 07:56

    樓宇集中控制照明系統

    在大型商業綜合體、辦公大樓等場所,照明設備數量眾多,分布廣泛,傳統的人工管理方式不僅耗時費力,還容易出現疏漏。樓宇集中控制照明系統,作為現代智能建筑和家居環境中的關鍵組成部分,通過集中管理、智能控制
    的頭像 發表于 11-21 16:44 ?193次閱讀

    怎么判斷需要集中補償還是分組補償

    判斷是否需要集中補償還是分組補償,主要取決于系統的負荷特性和補償的目的。以下是一些關鍵因素: 1、負荷類型和分布 集中負荷:如果系統中的負荷較為集中,例如在一個大型車間或工廠內的主要配
    的頭像 發表于 08-15 14:08 ?327次閱讀
    怎么判斷需要<b class='flag-5'>集中</b>補償還是分組補償

    pytorch和python的關系是什么

    在當今的人工智能領域,Python已經成為了最受歡迎的編程語言之一。Python的易學易用、豐富的庫和框架以及強大的社區支持,使其成為了數據科學、機器學習和深度學習等領域的首選語言。而在深度學習領域
    的頭像 發表于 08-01 15:27 ?2143次閱讀

    網絡爬蟲,Python數據分析

    電子發燒友網站提供《網絡爬蟲,Python數據分析.pdf》資料免費下載
    發表于 07-13 09:27 ?2次下載

    如何減少構建中的組件數量

    large to enter in my module. 由于我的應用程序不需要某些組件,因此我想知道如何減少我的項目中鏈接的組件數量
    發表于 07-09 07:46

    小i機器人:總負債5.31億,員工數量減少,銀行借款在增加,凈利潤已下降-362.68%

    小i機器人:總負債5.31億,員工數量減少,銀行借款在增加,總收入在增長,凈利潤已下降-362.68%
    的頭像 發表于 06-23 10:20 ?388次閱讀
    小i機器人:總負債5.31億,員工<b class='flag-5'>數量</b>在<b class='flag-5'>減少</b>,銀行借款在增加,凈利潤已下降-362.68%

    工業邊緣計算網關的技術特性和關鍵功能

    邊緣計算網關的技術特性 實時數據處理:工業邊緣計算網關具備強大的本地計算能力,能夠在數據產生的源頭即時處理,減少數據傳輸延遲,提高響應速度,這對于需要快速響應的自動化控制場景至關重要。
    的頭像 發表于 05-29 14:35 ?478次閱讀

    Python怎么讀取STM32串口數據

    =ser.readlines()print(s) 可是什么都讀取不了。如果用買的STM32開發板送的串口助手,能接收到數據。板子上燒錄的printf輸出程序。 請問各位大神,Python程序要怎么寫才能讀取串口數據呢?跪求大神解
    發表于 04-24 07:30

    Python:從串口讀取數據并以16進制格式展示

    本文凌順實驗室(lingshunlab.com)簡單實現Python讀取串口數據,并且按16進制格式顯示出來。
    的頭像 發表于 03-05 14:25 ?1161次閱讀
    <b class='flag-5'>Python</b>:從串口讀取<b class='flag-5'>數據</b>并以16進制格式展示

    請問用算力強大的SOC來控制汽車是不是能夠大幅減少MCU的使用數量

    來自一位用戶的咨詢,麻煩幫忙解答,越詳細越好,有圖有真相,可以適當提供一些英飛凌解決方案和產品推薦。 用算力強大的SOC來控制汽車是不是能夠大幅減少MCU的使用數量? 未來電動汽車會使用SOC來代替大量MCU?
    發表于 02-02 07:16

    集中電源控制器在數據中心的應用

    集中電源控制器在數據中心的應用非常廣泛。數據中心通常需要大量的電源來支持服務器、網絡設備和存儲設備等關鍵基礎設施的運行。集中電源控制器可以提供穩定、可靠的電源供應,確保
    的頭像 發表于 01-30 15:24 ?540次閱讀
    <b class='flag-5'>集中</b>電源控制器在<b class='flag-5'>數據</b>中心的應用
    主站蜘蛛池模板: 国产色秀视频| 午夜视频免费国产在线| 毛片免费看网站| 六月婷婷激情| 国产拍拍视频| 夜色剧场| 欧美高清激情毛片| 亚洲人成影院在线高清| 亚洲免费观看视频| 妖精视频永久在线入口| 四虎影视最新| 欧美瑟瑟| 岛国毛片一级一级特级毛片| 国产精品久久久久久吹潮| 九月婷婷综合| 四虎永久免费地址| 美女又黄又免费的视频| 国产 麻豆| 女bbbbxxxx另类亚洲| 网站啪啪| 国产片一级| 好硬好湿好爽再深一点h视频| 女攻各种play男受h| 婷婷丁香综合网| 亚洲成人网在线| 日本动漫天堂| 国产妇女在线| 美女久久久久久| 亚洲综合免费| 久久国产热| 色婷婷久| 国产成人一区二区三中文| 奇米影视婷婷| 夜夜狠狠| 特别毛片| 成人丁香婷婷| 高清视频在线观看+免费| 国产精品久久久久久一级毛片| 三级黄色片在线播放| 二级黄色大片| 国产免费福利网站|