[機器學習]特徵工程_特徵選取_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
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
147會員
276內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。
螃蟹_crab的沙龍的其他內容
2024/05/18
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
2024/05/18
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
2024/01/06
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
2024/01/06
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
2024/01/06
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考
Thumbnail
2024/01/06
前言 上一篇討論到如何訓練出模型,此篇將說明Streamlit建立的簡單Web應用程式的解說 Streamlit網頁App_貓狗辨識 連結 程式碼Github連結 [機器學習]CNN學習MNIST 手寫英文字母資料,用網頁展現成果_模型訓練篇 如何連動github與stramlit可以參考
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文主要介紹,如何利用VAE變分自編碼器來訓練生成圖片。 訓練集資料將採用TF影像資料庫中的fashion_mnist VAE變分自編碼器簡單介紹 •VAE(Variational Auto-Encoder)中文名稱變分自編碼器,主要是一種將原始資料編碼到潛在向量空間,再編碼回來的神經網路。
Thumbnail
本文主要介紹,如何利用VAE變分自編碼器來訓練生成圖片。 訓練集資料將採用TF影像資料庫中的fashion_mnist VAE變分自編碼器簡單介紹 •VAE(Variational Auto-Encoder)中文名稱變分自編碼器,主要是一種將原始資料編碼到潛在向量空間,再編碼回來的神經網路。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
GNN發展背景 傳統的深度學習模型如在計算機視覺(CV)和自然語言處理(NLP)領域中極為成功,主要是處理結構化數據如影像和文本。這些數據類型通常具有固定且規律的結構,例如影像是由有序的像素點組成。然而,在真實世界中,許多數據是非結構化的,如化合物結構(原子和分子)。這些數據雖然具有一定的規則性,
Thumbnail
GNN發展背景 傳統的深度學習模型如在計算機視覺(CV)和自然語言處理(NLP)領域中極為成功,主要是處理結構化數據如影像和文本。這些數據類型通常具有固定且規律的結構,例如影像是由有序的像素點組成。然而,在真實世界中,許多數據是非結構化的,如化合物結構(原子和分子)。這些數據雖然具有一定的規則性,
Thumbnail
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
寬景Wide view 鳥瞰Bird view 前景Foreground 背景Background 正面Front View 側面Side View 俯視Top View 景深Depth of field 微距鏡頭Macro Shot 超特寫Extreme Close up
Thumbnail
寬景Wide view 鳥瞰Bird view 前景Foreground 背景Background 正面Front View 側面Side View 俯視Top View 景深Depth of field 微距鏡頭Macro Shot 超特寫Extreme Close up
Thumbnail
高細節-- high details 高解析度-- high resolution 高清--1080P/4K/8K 細節-- detailed 無縫-- seamless 高清畫質--full HD 電影感-- Cinematic 攝影-- photography 生動色彩-
Thumbnail
高細節-- high details 高解析度-- high resolution 高清--1080P/4K/8K 細節-- detailed 無縫-- seamless 高清畫質--full HD 電影感-- Cinematic 攝影-- photography 生動色彩-
Thumbnail
在數位設計的世界中,我們總是被色彩所包圍,而其中一個關鍵的元素就是色彩描述檔(又稱:描述檔、ICC色彩描述檔)。 它是一個將印表機、螢幕等裝置具備的色域資訊數值化的檔案唷!或許你也曾經思考過,當我們看到[R:0/G:0/B:255]或是[C:100%/M:100%/Y:0%]這樣的數值時,心中
Thumbnail
在數位設計的世界中,我們總是被色彩所包圍,而其中一個關鍵的元素就是色彩描述檔(又稱:描述檔、ICC色彩描述檔)。 它是一個將印表機、螢幕等裝置具備的色域資訊數值化的檔案唷!或許你也曾經思考過,當我們看到[R:0/G:0/B:255]或是[C:100%/M:100%/Y:0%]這樣的數值時,心中
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News