特征重要性評分是一種為輸入特征評分的手段,其依據是輸入特征在預測目標變量過程中的有用程度。
特征重要性有許多類型和來源,盡管有許多比較常見,比如說統計相關性得分,線性模型的部分系數,基于決策樹的特征重要性和經過隨機排序得到重要性得分。
特征重要性在預測建模項目中起著重要作用,包括提供對數據、模型的見解,以及如何降維和選擇特征,從而提高預測模型的的效率和有效性。
在本教程中,我將會闡述用于python機器學習的特征重要性。完成本教程后,你將會知道:
特征重要性在預測建模中的作用
如何計算和查看來自線性模型和決策樹的特征重要性
如何計算和查看隨機排序重要性得分
現在讓我們開始吧。
教程概述
本教程分為五部分,分別是:
1.特征重要性
2.準備
2.1. 檢查Scikit-Learn版本
2.2. 創建測試數據集
3.特征重要性系數
3.1. 基于線性回歸系數的特征重要性
3.2. 基于Logistic回歸的特征重要性
4.基于決策樹的特征重要性
4.1. 基于CART的特征重要性
4.2. 基于隨機森林的特征重要性
4.3. 基于XGBoost的特征重要性
5.隨機排序特征重要性
5.1. 隨機排序(回歸)中的特征重要性
5.2. 隨機排序(分類)中的特征重要性
1.特征重要性
特征重要性是一種為預測模型的輸入特征評分的方法,該方法揭示了進行預測時每個特征的相對重要性。
可以為涉及預測數值的問題(稱為回歸)和涉及預測類別標簽的問題(稱為分類)計算特征重要性得分。
這些得分非常有用,可用于預測建模問題中的多種情況,例如:
更好地理解數據
更好地理解模型
減少輸入特征的數量
特征重要性得分可以幫助了解數據集
相對得分可以突出顯示哪些特征可能與目標最相關,反之則突出哪些特征最不相關。這可以由一個領域專家解釋,并且可以用作收集更多的或不同的數據的基礎。
特征重要性得分可以幫助了解模型
大多數重要性得分是通過數據集擬合出的預測模型計算的。查看重要性得分可以洞悉該特定模型,以及知道在進行預測時哪些特征最重要和哪些最不重要。這是一種模型解釋,適用于那些支持它的模型。
特征重要性可用于改進預測模型
可以使用的重要性得分來選擇要刪除的特征(最低得分)或要保留的特征(最高得分)。這是一種特征選擇,可以簡化正在建模的問題,加快建模過程(刪除特征稱為降維),在某些情況下,還可以改善模型的性能。
特征重要性得分可以被輸入到包裝器模型,如SelectFromModel或SelectKBest,以進行特征選擇。
有許多方法和模型可以計算特征重要性得分。
也許最簡單的方法是計算每個特征和目標變量之間的統計學相關系數。
在本教程中,我們將研究三種比較高級的特征重要性,即:
從模型系數得知的特征重要性。
決策樹中的特征重要性。
隨機排序檢驗中的特征重要性。
現在讓我們深入了解這三個!
2.準備
在深入學習之前,我們先確認我們的環境并準備一些測試數據集。
檢查Scikit-Learn版本
首先,確認你已安裝最新版本的scikit-learn庫。這非常重要,因為在本教程中,我們我們研究的一些模型需要最新版的庫。
您可以使用以下示例代碼來查看已安裝的庫的版本:
# check scikit-learn version
import sklearn
print(sklearn.__version__)
運行示例代碼將會打印出庫的版本。在撰寫本文時,大概是version 0.22。你需要使用此版本或更高版本的scikit-learn。
0.22.1
生成測試數據集
接下來,讓我們生成一些測試數據集,這些數據集可以作為基礎來證明和探索特征重要性得分。每個測試問題有五個重要特征和五不重要的特征,看看哪種方法可以根據其重要性找到或區分特征可能會比較有意思。
分類數據集
我們將使用make_classification()函數創建一個用于測試的二進制分類數據集。
數據集將包含1000個實例,且包含10個輸入特征,其中五個將會提供信息,其余五個是多余的。
為了確保每次運行代碼時都得到相同的實例,我們將使用假隨機數種子。下面列出了創建數據集的示例。
# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# summarize the dataset
print(X.shape, y.shape)
運行示例,創建數據集,并確保所需的樣本和特征數量。
(1000, 10) (1000,)
回歸數據集
我們將使用make_regression()函數創建一個用于測試的回歸數據集。
像分類數據集一樣,回歸數據集將包含1000個實例,且包含10個輸入特征,其中五個將會提供信息,其余五個是多余的。
# test regression dataset
from sklearn.datasets import make_regression
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# summarize the dataset
print(X.shape, y.shape)
運行示例,創建數據集,并確保所需的樣本和特征數量。
(1000, 10) (1000,)
接下來,我們仔細看一下特征重要性系數。
3.特征重要性系數
線性的機器學習能夠擬合出預測是輸入值的加權和的模型。
案例包括線性回歸,邏輯回歸,和正則化的擴展案例,如嶺回歸和彈性網絡。
所有這些算法都是找到一組要在加權求和中使用的系數,以便進行預測。這些系數可以直接用作粗略類型的特征重要性得分。
我們來仔細研究一下分類和回歸中的特征重要性系數。我們將在數據集中擬合出一個模型以找到系數,然后計算每個輸入特征的重要性得分,最終創建一個條形圖來了解特征的相對重要性。
3.1線性回歸特征重要性
我們可以在回歸數據集中擬合出一個LinearRegression模型,并檢索coeff_屬性,該屬性包含為每個輸入變量(特征)找到的系數。這些系數可以為粗略特征重要性評分提供依據。該模型假設輸入變量具有相同的比例或者在擬合模型之前已被按比例縮放。
下面列出了針對特征重要性的線性回歸系數的完整示例。
# linear regression feature importance
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# define the model
model = LinearRegression()
# fit the model
model.fit(X, y)
# get importance
importance = model.coef_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
得分表明,模型找到了五個重要特征,并用零標記了剩下的特征,實際上,將他們從模型中去除了。
Feature: 0, Score: 0.00000
Feature: 1, Score: 12.44483
Feature: 2, Score: -0.00000
Feature: 3, Score: -0.00000
Feature: 4, Score: 93.32225
Feature: 5, Score: 86.50811
Feature: 6, Score: 26.74607
Feature: 7, Score: 3.28535
Feature: 8, Score: -0.00000
Feature: 9, Score: 0.00000
然后為特征重要性得分創建條形圖。
這種方法也可以用于嶺回歸和彈性網絡模型。
3.2 Logistic回歸特征重要性
就像線性回歸模型一樣,我們也可以在回歸數據集中擬合出一個LogisticRegression模型,并檢索coeff_屬性。這些系數可以為粗略特征重要性評分提供依據。該模型假設輸入變量具有相同的比例或者在擬合模型之前已被按比例縮放。
下面列出了針對特征重要性的Logistic回歸系數的完整示例。
# logistic regression for feature importance
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# define the model
model = LogisticRegression()
# fit the model
model.fit(X, y)
# get importance
importance = model.coef_[0]
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
回想一下,這是有關0和1的分類問題。請注意系數既可以為正,也可以為負。正數表示預測類別1的特征,而負數表示預測類別0的特征。
從這些結果,至少從我所知道的結果中,無法清晰的確定出重要和不重要特征。
Feature: 0, Score: 0.16320
Feature: 1, Score: -0.64301
Feature: 2, Score: 0.48497
Feature: 3, Score: -0.46190
Feature: 4, Score: 0.18432
Feature: 5, Score: -0.11978
Feature: 6, Score: -0.40602
Feature: 7, Score: 0.03772
Feature: 8, Score: -0.51785
Feature: 9, Score: 0.26540
然后為特征重要性得分創建條形圖。
現在我們已經看到了將系數用作重要性得分的示例,接下來讓我們看向基于決策樹的重要性得分的常見示例
4.基于決策樹的特征重要性
決策樹算法,比如說classification and regression trees(CART)根據Gini系數或熵的減少來提供重要性得分。這個方法也可用于隨機森林和梯度提升算法。
OK.現在讓我們看看相應的運行示例。
4.1基于CART的特征重要性
對于在scikit-learn中實現的特征重要性,我們可以將CART算法用于DecisionTreeRegressor和DecisionTreeClassifier類
擬合后,模型提供feature_importances_屬性,可以訪問該屬性以檢索每個輸入特征的相對重要性得分。
讓我們看一個用于回歸和分類的示例。
基于CART(回歸)的特征重要性
下面列出了擬合DecisionTreeRegressor和計算特征重要性得分的完整示例。
# decision tree for feature importance on a regression problem
from sklearn.datasets import make_regression
from sklearn.tree import DecisionTreeRegressor
from matplotlib import pyplot
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# define the model
model = DecisionTreeRegressor()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的三個可能對預測很重要。
Feature: 0, Score: 0.00294
Feature: 1, Score: 0.00502
Feature: 2, Score: 0.00318
Feature: 3, Score: 0.00151
Feature: 4, Score: 0.51648
Feature: 5, Score: 0.43814
Feature: 6, Score: 0.02723
Feature: 7, Score: 0.00200
Feature: 8, Score: 0.00244
Feature: 9, Score: 0.00106
然后為特征重要性得分創建條形圖。
基于CART(分類)的特征重要性
下面列出了擬合DecisionTreeClassifier和計算特征重要性得分的完整示例
# decision tree for feature importance on a classification problem
from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# define the model
model = DecisionTreeClassifier()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的四個可能對預測很重要。
Feature: 0, Score: 0.01486
Feature: 1, Score: 0.01029
Feature: 2, Score: 0.18347
Feature: 3, Score: 0.30295
Feature: 4, Score: 0.08124
Feature: 5, Score: 0.00600
Feature: 6, Score: 0.19646
Feature: 7, Score: 0.02908
Feature: 8, Score: 0.12820
Feature: 9, Score: 0.04745
然后為特征重要性得分創建條形圖。
4.2隨機森林中的特征重要性
對于在scikit-learn中實現的特征重要性,我們可以將Random Forest算法用于DecisionTreeRegressor和DecisionTreeClassifier類。
擬合后,模型提供feature_importances_屬性,可以訪問該屬性以檢索每個輸入特征的相對重要性得分。
這種方法也可以與裝袋和極端隨機樹(extraTree)算法一起使用。
讓我們看一個用于回歸和分類的示例。
隨機森林(回歸)中的特征重要性
下面列出了擬合RandomForestRegressor和計算特征重要性得分的完整示例
# random forest for feature importance on a regression problem
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor
from matplotlib import pyplot
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# define the model
model = RandomForestRegressor()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的兩個或三個可能對預測很重要。
Feature: 0, Score: 0.00280
Feature: 1, Score: 0.00545
Feature: 2, Score: 0.00294
Feature: 3, Score: 0.00289
Feature: 4, Score: 0.52992
Feature: 5, Score: 0.42046
Feature: 6, Score: 0.02663
Feature: 7, Score: 0.00304
Feature: 8, Score: 0.00304
Feature: 9, Score: 0.00283
然后為特征重要性得分創建條形圖。
隨機森林(分類)中的特征重要性
下面列出了擬合RandomForestClassifier和計算特征重要性得分的完整示例
# random forest for feature importance on a classification problem
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# define the model
model = RandomForestClassifier()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的兩個或三個可能對預測很重要。
Feature: 0, Score: 0.06523
Feature: 1, Score: 0.10737
Feature: 2, Score: 0.15779
Feature: 3, Score: 0.20422
Feature: 4, Score: 0.08709
Feature: 5, Score: 0.09948
Feature: 6, Score: 0.10009
Feature: 7, Score: 0.04551
Feature: 8, Score: 0.08830
Feature: 9, Score: 0.04493
然后為特征重要性得分創建條形圖。
4.3基于XGBoost的特征重要性
XGBoost是一個庫,它提供了隨機梯度提升算法的高效實現。可以通過XGBRegressor和XGBClassifier類將此算法與scikit-learn一起使用。
擬合后,模型提供feature_importances_屬性,可以訪問該屬性以檢索每個輸入特征的相對重要性得分。
scikit-learn還通過GradientBoostingClassifier和GradientBoostingRegressor提供了該算法,并且可以使用相同的特征選擇方法
首先,安裝XGBoost庫,例如:
sudo pip install xgboost
然后,通過檢查版本號來確認該庫已正確安裝并且可以正常工作。
# check xgboost version
import xgboost
print(xgboost.__version__)
運行該示例,你應該看到以下版本號或者更高版本。
0.90
有關XGBoost庫的更多信息,請看:
XGBoost with Python
讓我們看一個用于回歸和分類問題的示例。
基于XGBoost(回歸)的特征重要性
下面列出了擬合XGBRegressor并且計算特征重要性得分的完整示例
# xgboost for feature importance on a regression problem
from sklearn.datasets import make_regression
from xgboost import XGBRegressor
from matplotlib import pyplot
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# define the model
model = XGBRegressor()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的兩個或三個可能對預測很重要。
Feature: 0, Score: 0.00060
Feature: 1, Score: 0.01917
Feature: 2, Score: 0.00091
Feature: 3, Score: 0.00118
Feature: 4, Score: 0.49380
Feature: 5, Score: 0.42342
Feature: 6, Score: 0.05057
Feature: 7, Score: 0.00419
Feature: 8, Score: 0.00124
Feature: 9, Score: 0.00491
然后為特征重要性得分創建條形圖。
基于XGBoost(分類)的特征重要性
下面列出了擬合XGBClassifier并且計算特征重要性得分的完整示例
# xgboost for feature importance on a classification problem
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# define the model
model = XGBClassifier()
# fit the model
model.fit(X, y)
# get importance
importance = model.feature_importances_
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中有七個可能對預測很重要。
Feature: 0, Score: 0.02464
Feature: 1, Score: 0.08153
Feature: 2, Score: 0.12516
Feature: 3, Score: 0.28400
Feature: 4, Score: 0.12694
Feature: 5, Score: 0.10752
Feature: 6, Score: 0.08624
Feature: 7, Score: 0.04820
Feature: 8, Score: 0.09357
Feature: 9, Score: 0.02220
然后為特征重要性得分創建條形圖。
5.基于隨機排序的特征重要性
隨機排序特征重要性(Permutation feature importance)可以計算相對重要性,與所使用的模型無關。
首先,在數據集中擬合出一個模型,比如說一個不支持本地特征重要性評分的模型。然后,盡管對數據集中的特征值進行了干擾,但仍可以使用該模型進行預測。對數據集中的每個特征進行此操作。然后,再將整個流程重新操作3、5、10或更多次。我們得到每個輸入特征的平均重要性得分(以及在重復的情況下得分的分布)。
此方法可以用于回歸或分類,要求選擇性能指標作為重要性得分的基礎,例如回歸中的均方誤差和分類中的準確性。
可以通過permutation_importance()函數(以模型和數據集為參數)和評分函數進行隨機排序特性選擇。
讓我們看下這個特征選擇方法,其算法并不支持特征選擇,尤其是k近鄰算法( k-nearest neighbors)。
5.1隨機排序(回歸)特征重要性
下面列出了擬合KNeighborsRegressor并且計算特征重要性得分的完整示例。
# permutation feature importance with knn for regression
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.inspection import permutation_importance
from matplotlib import pyplot
# define dataset
X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1)
# define the model
model = KNeighborsRegressor()
# fit the model
model.fit(X, y)
# perform permutation importance
results = permutation_importance(model, X, y, scoring=‘neg_mean_squared_error’)
# get importance
importance = results.importances_mean
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的兩個或三個可能對預測很重要。
Feature: 0, Score: 175.52007
Feature: 1, Score: 345.80170
Feature: 2, Score: 126.60578
Feature: 3, Score: 95.90081
Feature: 4, Score: 9666.16446
Feature: 5, Score: 8036.79033
Feature: 6, Score: 929.58517
Feature: 7, Score: 139.67416
Feature: 8, Score: 132.06246
Feature: 9, Score: 84.94768
然后為特征重要性得分創建條形圖。
5.2隨機排序(分類)特征重要性
下面列出了擬合KNeighborsClassifier并且計算特征重要性得分的完整示例。
# permutation feature importance with knn for classification
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.inspection import permutation_importance
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1)
# define the model
model = KNeighborsClassifier()
# fit the model
model.fit(X, y)
# perform permutation importance
results = permutation_importance(model, X, y, scoring=‘accuracy’)
# get importance
importance = results.importances_mean
# summarize feature importance
for i,v in enumerate(importance):
print(‘Feature: %0d, Score: %.5f’ % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
運行示例,擬合模型,然后輸出每個特征的系數值。
結果表明,這十個特征中的兩個或三個可能對預測很重要。
Feature: 0, Score: 0.04760
Feature: 1, Score: 0.06680
Feature: 2, Score: 0.05240
Feature: 3, Score: 0.09300
Feature: 4, Score: 0.05140
Feature: 5, Score: 0.05520
Feature: 6, Score: 0.07920
Feature: 7, Score: 0.05560
Feature: 8, Score: 0.05620
Feature: 9, Score: 0.03080
然后為特征重要性得分創建條形圖。
總結
在本教程中,您知道了在Python機器學習中的特征重要性得分。
具體來說,您了解到:
特征重要性在預測建模問題中的作用
如何從線性模型和決策樹中計算和查看特征重要性
如何計算和查看隨機排序特征重要性得分
-
代碼
+關注
關注
30文章
4802瀏覽量
68735 -
數據集
+關注
關注
4文章
1208瀏覽量
24737 -
網絡模型
+關注
關注
0文章
44瀏覽量
8445
發布評論請先 登錄
相關推薦
評論