首頁>技術>

隨著深度學習的蓬勃發展,越來越多的小夥伴開始嘗試搭建深層神經網路應用於工作場景中,認為只需要把資料放入模型中,調優模型引數就可以讓模型利用自身機制來選擇重要特徵,輸出較好的資料結果。

在現實工作場景中,受限制資料和時間,這樣的做法其實並不可取,一方面大量資料輸入將導致模型訓練週期增長,另一方面在當前細分市場中,並非所有場景都有海量資料,尋找海量資料中的重要特徵迫在眉睫。

本文我將教你三個選擇特徵的方法,這是任何想從事資料科學領域的都應該知道。本文的結構如下:

資料集載入和準備方法1:從係數獲取特徵重要性方法2:從樹模型獲取特徵重要性方法3:從 PCA 分數中獲取特徵重要性結論資料集載入和準備

為了方便介紹,我這裡使用"load_breast_cancer"資料集,該資料內置於 Scikit-Learn 中。

以下程式碼段演示如何匯入庫和載入資料集:

import numpy as npimport pandas as pdfrom sklearn.datasets import load_breast_cancerimport matplotlib.pyplot as pltfrom matplotlib import rcParamsrcParams['figure.figsize'] = 14, 7rcParams['axes.spines.top'] = FalsercParams['axes.spines.right'] = False# Load datadata = load_breast_cancer()

呼叫以下程式碼,輸出結果。

df = pd.concat([pd.DataFrame(data.data, columns=data.feature_names),pd.DataFrame(data.target, columns=['y'])], axis=1)df.head()

上述資料中有 30 個特徵變數和一個目標變數。所有值都是數值,並且沒有缺失的值。在解決縮放問題之前,還需要執行訓練、測試拆分。

from sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitX = 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:從係數獲取特徵重要性

檢查特徵重要性的最簡單方法是檢查模型的係數。例如,線性迴歸和邏輯迴歸都歸結為一個方程,其中將係數(重要性)分配給每個輸入值。

簡單地說,如果分配的係數是一個大(負或正)數字,它會對預測產生一些影響。相反,如果係數為零,則對預測沒有任何影響。

邏輯非常簡單,讓我們來測試一下,邏輯迴歸是一種合適的演算法。擬合模型後,係數將儲存在屬性中coef_。

from sklearn.linear_model import LogisticRegressionmodel = 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()

下面是相應的視覺化效果:

該方法最大特點:簡單高效。係數越大(在正方向和負方向),越影響預測效果。

方法2:從樹模型獲取重要性

訓練任何樹模型後,你都可以訪問 feature_importances 屬性。這是獲取功特徵重要性的最快方法之一。

以下程式碼演示如何匯入模型並在訓練資料上擬合模型,以及重要性的獲取:

from xgboost import XGBClassifiermodel = 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 分數獲取特徵重要性

主成分分析(PCA)是一種出色的降維技術,也可用於確定特徵的重要性。

PCA 不會像前兩種技術那樣直接顯示最重要的功能。相反,它將返回 N 個主元件,其中 N 等於原始特徵的數量。

from sklearn.decomposition import PCApca = 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()

但這是什麼意思呢?這意味著你可以使用前五個主要元件解釋源資料集中 90%的方差。同樣,如果你不知道這意味著什麼,繼續往下看。

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

第一個主要組成部分至關重要。它只是一個要素,但它解釋了資料集中超過 60% 的方差。從上圖中可以看到,它與平均半徑特徵之間的相關係數接近 0.8,這被認為是強正相關。

讓我們視覺化所有輸入要素與第一個主元件之間的相關性。下面是整個程式碼段(包括視覺化):

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,使用它作為特徵重要性的方法。

19
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 看完此文章你若還是不瞭解python,那我願意退出程式設計界