【機器學習基礎(chǔ)】機器學習中必知必會的 3 種特征選取方法!
隨著深度學習的蓬勃發(fā)展,越來越多的小伙伴開始嘗試搭建深層神經(jīng)網(wǎng)絡應用于工作場景中,認為只需要把數(shù)據(jù)放入模型中,調(diào)優(yōu)模型參數(shù)就可以讓模型利用自身機制來選擇重要特征,輸出較好的數(shù)據(jù)結(jié)果。
在現(xiàn)實工作場景中,受限制數(shù)據(jù)和時間,這樣的做法其實并不可取,一方面大量數(shù)據(jù)輸入將導致模型訓練周期增長,另一方面在當前細分市場中,并非所有場景都有海量數(shù)據(jù),尋找海量數(shù)據(jù)中的重要特征迫在眉睫。
本文我將教你三個選擇特征的方法,這是任何想從事數(shù)據(jù)科學領(lǐng)域的都應該知道。本文的結(jié)構(gòu)如下:
數(shù)據(jù)集加載和準備 方法1:從系數(shù)獲取特征重要性 方法2:從樹模型獲取特征重要性 方法3:從 PCA 分數(shù)中獲取特征重要性 結(jié)論
數(shù)據(jù)集加載和準備
為了方便介紹,我這里使用"load_breast_cancer"數(shù)據(jù)集,該數(shù)據(jù)內(nèi)置于 Scikit-Learn 中。
以下代碼段演示如何導入庫和加載數(shù)據(jù)集:
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['figure.figsize'] = 14, 7
rcParams['axes.spines.top'] = False
rcParams['axes.spines.right'] = False
# Load data
data = load_breast_cancer()
調(diào)用以下代碼,輸出結(jié)果。
df = pd.concat([pd.DataFrame(data.data, columns=data.feature_names),pd.DataFrame(data.target, columns=['y'])], axis=1)
df.head()

上述數(shù)據(jù)中有 30 個特征變量和一個目標變量。所有值都是數(shù)值,并且沒有缺失的值。在解決縮放問題之前,還需要執(zhí)行訓練、測試拆分。
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
ss = StandardScaler()
X_train_scaled = ss.fit_transform(X_train)
X_test_scaled = ss.transform(X_test)
方法1:從系數(shù)獲取特征重要性
檢查特征重要性的最簡單方法是檢查模型的系數(shù)。例如,線性回歸和邏輯回歸都歸結(jié)為一個方程,其中將系數(shù)(重要性)分配給每個輸入值。
簡單地說,如果分配的系數(shù)是一個大(負或正)數(shù)字,它會對預測產(chǎn)生一些影響。相反,如果系數(shù)為零,則對預測沒有任何影響。
邏輯非常簡單,讓我們來測試一下,邏輯回歸是一種合適的算法。擬合模型后,系數(shù)將存儲在屬性中coef_。
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
importances = pd.DataFrame(data={
'Attribute': X_train.columns,
'Importance': model.coef_[0]
})
importances = importances.sort_values(by='Importance', ascending=False)
# 可視化
plt.bar(x=importances['Attribute'], height=importances['Importance'], color='#087E8B')
plt.title('Feature importances obtained from coefficients', size=20)
plt.xticks(rotation='vertical')
plt.show()
下面是相應的可視化效果:
該方法最大特點:「簡單」、「高效」。系數(shù)越大(在正方向和負方向),越影響預測效果。
方法2:從樹模型獲取重要性
訓練任何樹模型后,你都可以訪問 feature_importances 屬性。這是獲取功特征重要性的最快方法之一。
以下代碼演示如何導入模型并在訓練數(shù)據(jù)上擬合模型,以及重要性的獲取:
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X_train_scaled, y_train)
importances = pd.DataFrame(data={
'Attribute': X_train.columns,
'Importance': model.feature_importances_
})
importances = importances.sort_values(by='Importance', ascending=False)
# 可視化
plt.bar(x=importances['Attribute'], height=importances['Importance'], color='#087E8B')
plt.title('Feature importances obtained from coefficients', size=20)
plt.xticks(rotation='vertical')
plt.show()
相應的可視化效果如下所示:
方法3:從 PCA 分數(shù)獲取特征重要性
主成分分析(PCA)是一種出色的降維技術(shù),也可用于確定特征的重要性。
PCA 不會像前兩種技術(shù)那樣直接顯示最重要的功能。相反,它將返回 N 個主組件,其中 N 等于原始特征的數(shù)量。
from sklearn.decomposition import PCA
pca = PCA().fit(X_train_scaled)
# 可視化
plt.plot(pca.explained_variance_ratio_.cumsum(), lw=3, color='#087E8B')
plt.title('Cumulative explained variance by number of principal components', size=20)
plt.show()

但這是什么意思呢?這意味著你可以使用前五個主要組件解釋源數(shù)據(jù)集中 90%的方差。同樣,如果你不知道這意味著什么,繼續(xù)往下看。
loadings = pd.DataFrame(
data=pca.components_.T * np.sqrt(pca.explained_variance_),
columns=[f'PC{i}' for i in range(1, len(X_train.columns) + 1)],
index=X_train.columns
)
loadings.head()

第一個主要組成部分至關(guān)重要。它只是一個要素,但它解釋了數(shù)據(jù)集中超過 60% 的方差。從上圖中可以看到,它與平均半徑特征之間的相關(guān)系數(shù)接近 0.8,這被認為是強正相關(guān)。
讓我們可視化所有輸入要素與第一個主組件之間的相關(guān)性。下面是整個代碼段(包括可視化):
pc1_loadings = loadings.sort_values(by='PC1', ascending=False)[['PC1']]
pc1_loadings = pc1_loadings.reset_index()
pc1_loadings.columns = ['Attribute', 'CorrelationWithPC1']
plt.bar(x=pc1_loadings['Attribute'], height=pc1_loadings['CorrelationWithPC1'], color='#087E8B')
plt.title('PCA loading scores (first principal component)', size=20)
plt.xticks(rotation='vertical')
plt.show()

這就是如何"破解"PCA,使用它作為特征重要性的方法。
結(jié)論
上述總結(jié)來 3 個機器學習特征重要性的方法,這三個可根據(jù)場景靈活運用。
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
