丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給skura
發(fā)送

0

特征選擇怎么做?這篇文章告訴你

本文作者: skura 2019-10-19 19:35
導(dǎo)語(yǔ):實(shí)用實(shí)踐指南

特征選擇怎么做?這篇文章告訴你

照片由 Clem Onojeghuo 發(fā)布在 Unsplash 上面

簡(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ù)情況下,在開始任何統(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ù)量。本文中使用的所有代碼在 kaggle 和我的 github 帳號(hào)上都有。

減少統(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í)間和模型整體的精度。

首先,我們需要導(dǎo)入所有必需的庫(kù)。

import time

import numpy as np 

import pandas as pd 

import matplotlib.pyplot as plt from matplotlib.pyplot

import figure

import seaborn as sns from sklearn

import preprocessing from sklearn.preprocessing

import LabelEncoder from sklearn.preprocessing

import StandardScaler from sklearn.model_selection

import train_test_split from sklearn.metrics

import classification_report,confusion_matrix from sklearn

import tree from sklearn.ensemble

import RandomForestClassifier from sklearn

import svm

我們將在本例中使用的數(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)

特征重要性

基于集合的決策樹模型(如隨機(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ò)的決策樹來(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))

特征選擇怎么做?這篇文章告訴你

樹結(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:決策樹可視化

遞歸特征消除(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ī)樹)是基于樹的集成分類器,與隨機(jī)森林方法相比,它可以產(chǎn)生更少的方差(因此減少了過(guò)擬合的風(fēng)險(xiǎn))。隨機(jī)森林和極隨機(jī)樹的主要區(qū)別在于極隨機(jī)樹中節(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:套索特征重要性圖

via:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。

特征選擇怎么做?這篇文章告訴你

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)