[機器學習]特徵工程_特徵選取_SFS

閱讀時間約 12 分鐘

Sequential Feature Selection(SFS)

用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率

SFS 的一些用途包括:

  • 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求。
  • 模型性能提升: 選擇最重要的特徵可以提高模型的性能,降低過擬合的風險,同時提高模型的泛化能力。
  • 解釋性: 減少特徵數目有助於更容易解釋和理解模型,使模型更具可解釋性。


  • 以下用程式碼實作說明,SFS的應用,資料集選用sklearn.數據集,葡萄酒數據集(分類),模型選用LogisticRegression()

實驗方法 : 同樣的資料集訓練,比較使用特徵選取的差異性,此資料夾總共有13種特徵,我們利用SFS來挑選出前三個最重要的特徵,在來評估準確率到底差異多少

範例連結

程式碼說明

導入必要套件

from sklearn.datasets import load_wine
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import seaborn as sns
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 設定中文字型
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# 矯正負號
plt.rcParams['axes.unicode_minus'] = False

from sklearn.datasets import load_wine: 這裡導入了 scikit-learn 中的 load_wine 函數,用於加載葡萄酒數據集

用from 套件 import 函式,當你使用這樣的導入語句時,你就可以直接使用 load_wine 函數而不必在代碼中使用完整的模塊路徑sklearn.datasets.load_wine

import sklearn.datasets
data = sklearn.datasets.load_wine() #繁長的語句
from sklearn.datasets import load_wine
data = load_wine() #簡潔的語句

from sklearn.neighbors import KNeighborsClassifier: 從 scikit-learn 中導入 K 最近鄰(K-Nearest Neighbors)分類器,這是一種基於鄰近點的分類算法

from sklearn.model_selection import train_test_split: 導入了 scikit-learn 中的 train_test_split 函數,用於將數據集分割為訓練集和測試集,以進行模型的訓練和測試

import seaborn as sns: 導入了 Seaborn,這是一個用於繪製統計圖形的 Python 库。它通常與 Matplotlib 搭配使用,提供了更漂亮和更有吸引力的圖形。

import pandas as pd: 導入了 Pandas 庫,用於數據操作和分析。通常在數據科學和機器學習中使用 Pandas 來處理和操作數據。

import numpy as np: 導入了 NumPy 庫,這是一個用於科學計算的 Python 库。在數據處理和數學運算中經常使用 NumPy。

from matplotlib import pyplot as plt: 導入了 Matplotlib 庫,這是一個用於繪製圖形的庫。pyplot 提供了一個類似於 MATLAB 的繪圖接口


載入資料

X, y = load_wine(return_X_y=True, as_frame=True)

導入sklearn.數據集,葡萄酒數據集(分類)

  1. return_X_y=True: 這個參數的作用是讓 load_wine 函數返回特徵矩陣 X 和目標數組 y。默認情況下,load_wine 返回的是一個字典,包含特徵和目標。
  2. as_frame=True: 這個參數的作用是將數據返回為 Pandas 的 DataFrame 格式。當 as_frame=True 時,X 和 y 將被轉換成 DataFrame。

資料分割

X_train, X_test, y_train, y_test = train_test_split(X.values, y, test_size=0.5, random_state=42)

train_test_split 函數將數據集分割為訓練集X_train, y_train和測試集X_test, y_test。

X.values: 這裡的 X 是一個 DataFrame,而 train_test_split 函數通常期望輸入是 NumPy 數組(或類似的數據結構)。X.values 返回 DataFrame 中的數據作為 NumPy 數組,這樣就可以正確地傳遞給 train_test_split

y: 這是目標變數,它通常是一維的數組或列表。

test_size=0.5: 這個參數指定了測試集的大小。在這裡,測試集的大小為整個數據集的一半,即 50%。

random_state=42: 是一個種子值(seed),用來初始化隨機數生成器。在機器學習中,我們經常使用隨機過程(例如數據的分割、初始模型的權重等),而設定種子值可以確保這些隨機過程在不同的運行中保持一致。

特徵縮放

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler() # 創建標準化縮放器
X_train_std = scaler.fit_transform(X_train) # 使用訓練數據擬合並轉換特徵
X_test_std = scaler.transform(X_test) # 使用相同的轉換器對測試數據進行縮放,測試資料請勿用fit轉換
  1. from sklearn.preprocessing import StandardScaler: 導入 scikit-learn 中的 StandardScaler 類別。
  2. scaler = StandardScaler(): 創建一個 StandardScaler 的,這將用於對數據進行標準化。
  3. X_train_std = scaler.fit_transform(X_train): 使用訓練數據 X_train 來擬合(fit)標準化縮放器,同時將其轉換(transform)為標準化的特徵。fit_transform 方法首先計算訓練數據的均值和標準差。
  4. X_test_std = scaler.transform(X_test): 使用相同的標準化縮放器對測試數據 X_test 進行特徵縮放,這是因為我們希望使用訓練數據的均值和標準差來轉換測試數據。在這裡,我們使用 transform 而不是 fit_transform,因為我們不想重新計算均值和標準差,而是使用訓練數據中計算的值,這樣就失去了在訓練數據上學到的轉換規則,可能導致不準確的結果。

選擇演算法

使用scikit-learn中的LogisticRegression模型,這是一種用於二元分類的線性模型。

from sklearn.linear_model import LogisticRegression
# 創建Logistic Regression模型
clf = LogisticRegression()
raw-image

模型訓練

# 使用訓練數據進行模型訓練
#標準化訓練資料 ( X_train_std) 和對應的標籤 ( y_train)
clf.fit(X_train_std, y_train)

模型評估

目前出來的準確率,是使用了全部的特徵,13種,後面會使用SFS來做特徵選取三種,訓練比較其差異性

clf.score(X_test_std, y_test)

score(X_test_std, y_test): 這是一個用於計算模型性能的方法。通常,score 方法接受測試數據 X_test_std 和相應的目標變數 y_test 作為參數,然後返回模型在測試集上的準確度。

測試選取3個特徵的所有組合

from sklearn.metrics import accuracy_score
from sklearn.feature_selection import SequentialFeatureSelector

knn = KNeighborsClassifier(n_neighbors=11) #特徵空間去算距離,適合少量的特徵
sfs = SequentialFeatureSelector(knn, n_features_to_select=3)
sfs.fit(X_train_std, y_train)
# 特徵選取名稱
column_list = np.array(X.columns.to_list())
column_list[sfs.get_support()]
raw-image

結果是挑選出三個特徵對預測結果最具影響力的

  1. from sklearn.metrics import accuracy_score: 導入 accuracy_score 函數,這是一個用於計算準確度的評估指標。
  2. from sklearn.feature_selection import SequentialFeatureSelector: 導入 SequentialFeatureSelector 類,這是 scikit-learn 提供的一個用於特徵選擇的工具。
  3. knn = KNeighborsClassifier(n_neighbors=11): 創建了一個 K 最近鄰分類器的實例 knn,並設置了鄰居的數量為 11。
  4. sfs = SequentialFeatureSelector(knn, n_features_to_select=3): 創建了一個 SequentialFeatureSelector 的實例 sfs,並指定了要選擇的特徵數量為 3。這個類將使用 K 最近鄰分類器來進行特徵選擇。
  5. sfs.fit(X_train_std, y_train): 使用訓練數據 X_train_std 和相應的目標變數 y_train 來擬合 SequentialFeatureSelector。這將執行特徵選擇過程。
  6. column_list = np.array(X.columns.to_list()): 這行代碼假設 X 是一個 DataFrame,通過 X.columns.to_list() 獲取所有特徵的名稱,然後使用 NumPy 將它們轉換為一個 NumPy 數組。
  7. column_list[sfs.get_support()]: 使用 sfs.get_support() 獲取經過特徵選擇後被選中的特徵的bool list,然後使用這個bool list來選擇相應的特徵名稱。這將返回被選中的特徵名稱的 NumPy 數組。

重新載入模型,使用SFS後的訓練集資料,來比較與使用SFS的差異

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()

模型訓練

clf.fit(sfs.transform(X_train_std), y_train)

模型評估

clf.score(sfs.transform(X_test_std), y_test)
raw-image

使用SFS,準確率從0.988下滑至0.85

但在高維度的資料集應用中使用SFS來做特徵選取還是有必要性,反過來想在13種特徵只挑3種特徵來做訓練,還能有0.85,應該算不錯了

謝謝大家觀看,若喜歡,在給點愛心或留言鼓勵 謝謝~



avatar-img
128會員
213內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們從 AI說書 - 從0開始 - 103 至 AI說書 - 從0開始 - 105 的努力,已經完成資料集前處理,現在需要定義一個函數來加載這些清理過的數據集,並在預處
Thumbnail
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
機器學習領域的專業人士可以從這篇文章中獲得寶貴的見解。 追求更大的數據集和更強大的模型一直是提升性能的核心策略。 以下是我在機器學習領域工作7年後的三個重大體悟。 ▋體悟1 - 大數據的重要性 自2009年ImageNet問世以來, 數據集的規模和質量對機器學習的影響越
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
Thumbnail
STP分析—市場細分、目標市場選擇和市場定位—不僅是行銷理論的核心,同時也可以是學術寫作和發表的強大工具。特別是在機器學習這一跨學科領域,運用STP分析可以明顯提高研究的影響力和可讀性。本文分享如何運用STP分析來優化機器學習的學術研究和寫作。
Thumbnail
這篇文章,會帶著大家複習以前學過的DFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): # 邊界條件 if base case or stop cond
Thumbnail
本文探討了監督式學習、分群和相似度這幾個推薦系統算法,分別討論了它們的優點、缺點以及適用場景。這些算法在推薦系統中扮演著重要角色,並透過特徵選擇與預處理、相似度度量和鄰居的選擇等關鍵因素進行深入分析。文章最後提出在選擇推薦系統算法時應該考慮的因素,以及未來的研究方向。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們從 AI說書 - 從0開始 - 103 至 AI說書 - 從0開始 - 105 的努力,已經完成資料集前處理,現在需要定義一個函數來加載這些清理過的數據集,並在預處
Thumbnail
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
機器學習領域的專業人士可以從這篇文章中獲得寶貴的見解。 追求更大的數據集和更強大的模型一直是提升性能的核心策略。 以下是我在機器學習領域工作7年後的三個重大體悟。 ▋體悟1 - 大數據的重要性 自2009年ImageNet問世以來, 數據集的規模和質量對機器學習的影響越
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
Thumbnail
STP分析—市場細分、目標市場選擇和市場定位—不僅是行銷理論的核心,同時也可以是學術寫作和發表的強大工具。特別是在機器學習這一跨學科領域,運用STP分析可以明顯提高研究的影響力和可讀性。本文分享如何運用STP分析來優化機器學習的學術研究和寫作。
Thumbnail
這篇文章,會帶著大家複習以前學過的DFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): # 邊界條件 if base case or stop cond
Thumbnail
本文探討了監督式學習、分群和相似度這幾個推薦系統算法,分別討論了它們的優點、缺點以及適用場景。這些算法在推薦系統中扮演著重要角色,並透過特徵選擇與預處理、相似度度量和鄰居的選擇等關鍵因素進行深入分析。文章最後提出在選擇推薦系統算法時應該考慮的因素,以及未來的研究方向。