「日拱一碼」021 機器學習——特征工程

目錄

特征選擇

過濾法(Filter Methods)

方差選擇法

相關系數法

卡方檢驗

包裹法(Wrapper Methods)

遞歸特征消除(RFE)

嵌入法(Embedded Methods)

L1正則化(Lasso回歸)

基于樹模型的特征重要性

特征降維

主成分分析(PCA)

線性判別分析(LDA)

自動特征生成

使用Featuretools生成特征

特征交互

多項式特征

手動組合特征

特征編碼

獨熱編碼(One-Hot Encoding)

標簽編碼(Label Encoding)

基于頻率或目標的編碼(Frequency/Target Encoding)

基于頻率的編碼(Frequency Encoding)

基于目標的編碼(Target Encoding)

基于目標的編碼(平滑處理)

時間特征提取

文本特征提取

詞袋模型(Bag of Words)

TF-IDF


特征選擇

特征選擇是減少特征數量、提高模型性能的關鍵步驟,常見的方法包括過濾法、包裹法和嵌入法

過濾法(Filter Methods)

過濾法通過統計指標來篩選特征,獨立于模型

  • 方差選擇法

選擇方差大于閾值的特征

## 特征選擇
# 過濾法(Filter Methods)
# 1. 方差選擇法
import numpy as np
from sklearn.feature_selection import VarianceThresholddata = np.array([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
selector = VarianceThreshold(threshold=0.5)
selected_data = selector.fit_transform(data)
print(selected_data)
# [[0]
#  [4]
#  [1]]
  • 相關系數法

選擇與目標變量相關性高的特征

# 2. 相關系數法
import numpy as np
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonrX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])# 定義score_func,計算每個特征與目標變量y的皮爾遜相關系數
def pearsonr_score(X, y):scores = []for feature in X.T:  # 遍歷每個特征corr, _ = pearsonr(feature, y)  # 計算皮爾遜相關系數scores.append(abs(corr))  # 取絕對值作為評分return np.array(scores)# 使用SelectKBest選擇相關性最高的2個特征
selector = SelectKBest(score_func=pearsonr_score, k=2)
selected_data = selector.fit_transform(X, y)print(selected_data)
# [[2 3]
#  [5 6]
#  [8 9]]
  • 卡方檢驗

選擇與目標變量相關性高的特征

# 卡方檢驗
import numpy as np
from sklearn.feature_selection import SelectKBest, chi2X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
selector = SelectKBest(chi2, k=2)
selected_data = selector.fit_transform(X, y)
print(selected_data)
# [[2 3]
#  [5 6]
#  [8 9]]

包裹法(Wrapper Methods)

包裹法通過訓練模型來評估特征子集的性能

  • 遞歸特征消除(RFE)

遞歸地移除最不重要的特征

# 包裹法(Wrapper Methods)
# 遞歸特征消除(RFE)import numpy as np
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegressionX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
model = LogisticRegression()
selector = RFE(model, n_features_to_select=2)
selected_data = selector.fit_transform(X, y)
print(selected_data)
# [[1 3]
#  [4 6]
#  [7 9]]

嵌入法(Embedded Methods)

?嵌入法在模型訓練過程中自動進行特征選擇

  • L1正則化(Lasso回歸)

通過L1正則化將不重要的特征權重壓縮為0

# 嵌入法(Embedded Methods)
# 1. L1正則化(Lasso回歸)
import numpy as np
from sklearn.linear_model import LassoX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
print(lasso.coef_)
# [0. 0. 0.]
  • 基于樹模型的特征重要性

使用樹模型(如隨機森林)評估特征重要性

# 2. 基于樹模型的特征重要性
import numpy as np
from sklearn.ensemble import RandomForestClassifierX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
model = RandomForestClassifier()
model.fit(X, y)
print(model.feature_importances_)
# [0.37857143 0.30357143 0.31785714]

特征降維

特征降維是將高維特征投影到低維空間,常見的方法包括PCA和LDA

主成分分析(PCA)

通過線性變換將數據投影到方差最大的方向

## 特征降維
# 1. 主成分分析(PCA)
import numpy as np
from sklearn.decomposition import PCAX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(X)
print(reduced_data)
# [[-5.19615242e+00  3.62353582e-16]
#  [ 0.00000000e+00  0.00000000e+00]
#  [ 5.19615242e+00  3.62353582e-16]]

線性判別分析(LDA)

通過線性變換將數據投影到最大化類間區分度的方向

# 2. 線性判別分析(LDA)
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysisX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = np.array([1, 0, 1, 2])
lda = LinearDiscriminantAnalysis(n_components=2) # 注意: n_components不能超過類別數量減1
reduced_data = lda.fit_transform(X, y)
print(reduced_data)
# [[ 1.06066017]
#  [ 0.35355339]
#  [-0.35355339]
#  [-1.06066017]]

自動特征生成

自動特征生成是通過工具或算法自動生成新的特征

使用Featuretools生成特征

自動從關系型數據中生成聚合和轉換特征

## 自動特征生成
# 1. 使用Featuretools生成特征
import numpy as np
import featuretools as ft
import pandas as pd# 創建數據
data = pd.DataFrame({'transaction_id': range(1, 6),  # 添加 transaction_id 列'customer_id': [1, 2, 1, 2, 3],'amount': [100, 150, 200, 300, 500],'timestamp': pd.date_range('2025-01-01', periods=5)
})# 創建 EntitySet
es = ft.EntitySet(id='transactions')# 添加 transactions 數據
es.add_dataframe(dataframe=data,dataframe_name='transactions',index='transaction_id',  # 指定索引列time_index='timestamp'  # 指定時間索引列
)# 定義客戶實體
customers = pd.DataFrame({'customer_id': [1, 2, 3]})# 添加 customers 數據
es.add_dataframe(dataframe=customers,dataframe_name='customers',index='customer_id'  # 指定索引列
)# 建立關系
es.add_relationship(parent_dataframe_name='customers',parent_column_name='customer_id',child_dataframe_name='transactions',child_column_name='customer_id'
)# 自動特征生成
feature_matrix, feature_defs = ft.dfs(entityset=es,target_dataframe_name='customers',agg_primitives=['mean', 'max', 'std'],trans_primitives=['day', 'month']
)print(feature_matrix)
#              MAX(transactions.amount)  ...  STD(transactions.amount)
# customer_id                            ...                          
# 1                               200.0  ...                 70.710678
# 2                               300.0  ...                106.066017
# 3                               500.0  ...                       NaN
#
# [3 rows x 3 columns]

特征交互

特征交互是通過組合特征來發現新的信息,常見的方法包括多項式特征和手動組合特征

多項式特征

生成特征的多項式組合

## 特征交互
# 1. 多項式特征
import numpy as np
from sklearn.preprocessing import PolynomialFeaturesX = np.array([[1, 2], [3, 4], [5, 6]])
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(X)
print(poly_features)
# [[ 1.  2.  1.  2.  4.]
#  [ 3.  4.  9. 12. 16.]
#  [ 5.  6. 25. 30. 36.]]

手動組合特征

根據業務知識手動組合特征

# 2. 手動組合特征
import pandas as pddata = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
data['A_plus_B'] = data['A'] + data['B']
data['A_times_B'] = data['A'] * data['B']
print(data)
#    A  B  A_plus_B  A_times_B
# 0  1  4         5          4
# 1  2  5         7         10
# 2  3  6         9         18

特征編碼

特征編碼是將非數值特征轉換為數值特征,常見的方法包括獨熱編碼(One-Hot Encoding)、標簽編碼(Label Encoding)和基于頻率或目標的編碼(Frequency/Target Encoding)

獨熱編碼(One-Hot Encoding)

將分類特征轉換為獨熱向量

## 特征編碼
# 1. 獨熱編碼(One-Hot Encoding)
from sklearn.preprocessing import OneHotEncoderdata = np.array([['cat'], ['dog'], ['bird']])
encoder = OneHotEncoder(sparse=False)
encoded_data = encoder.fit_transform(data)
print(encoded_data)
# [[0. 1. 0.]
#  [0. 0. 1.]
#  [1. 0. 0.]]

標簽編碼(Label Encoding)

將分類特征轉換為整數標簽

# 2. 標簽編碼(Label Encoding)
from sklearn.preprocessing import LabelEncoderdata = np.array(['cat', 'dog', 'bird'])
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)
print(encoded_data)
# [1 2 0]

基于頻率或目標的編碼(Frequency/Target Encoding)

對于一些具有大量類別的分類特征,可以使用基于頻率或目標的編碼方法

  • 基于頻率的編碼(Frequency Encoding)

將每個類別值替換為它在數據集中出現的頻率

# 3. 基于頻率或目標的編碼
# 3.1 基于頻率的編碼(Frequency Encoding)
import pandas as pd# 示例數據
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B']})# 計算每個類別的頻率
frequency_map = data['category'].value_counts(normalize=True).to_dict()# 替換類別值為頻率
data['frequency_encoded'] = data['category'].map(frequency_map)
print(data)
#   category  frequency_encoded
# 0        A           0.333333
# 1        B           0.333333
# 2        A           0.333333
# 3        C           0.333333
# 4        B           0.333333
# 5        A           0.333333
# 6        C           0.333333
# 7        C           0.333333
# 8        B           0.333333
  • 基于目標的編碼(Target Encoding)

將每個類別值替換為目標變量的統計值(如均值、中位數等)

# 3.2 基于目標的編碼(Target Encoding)
import pandas as pd
import numpy as np# 示例數據
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B'],'target': [1, 0, 1, 1, 0, 1, 0, 1, 0]
})# 計算每個類別的目標均值
target_mean = data.groupby('category')['target'].mean().to_dict()# 替換類別值為目標均值
data['target_encoded'] = data['category'].map(target_mean)
print(data)
#   category  target  target_encoded
# 0        A       1        1.000000
# 1        B       0        0.000000
# 2        A       1        1.000000
# 3        C       1        0.666667
# 4        B       0        0.000000
# 5        A       1        1.000000
# 6        C       0        0.666667
# 7        C       1        0.666667
# 8        B       0        0.000000
  • 基于目標的編碼(平滑處理)

為了避免過擬合,結合全局目標均值和類別目標均值,通過平滑參數控制兩者的權重

# 基于目標的編碼(平滑處理)
import pandas as pd
import numpy as np# 示例數據
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B'],'target': [1, 0, 1, 1, 0, 1, 0, 1, 0]
})# 全局目標均值
global_mean = data['target'].mean()# 每個類別的目標均值
target_mean = data.groupby('category')['target'].mean()# 類別出現的次數
category_count = data['category'].value_counts()# 平滑參數
alpha = 10# 計算平滑后的目標均值
smoothed_target_mean = (target_mean * category_count + global_mean * alpha) / (category_count + alpha)# 替換類別值為平滑后的目標均值
data['smoothed_target_encoded'] = data['category'].map(smoothed_target_mean)
print(data)
#   category  target  smoothed_target_encoded
# 0        A       1                 0.658120
# 1        B       0                 0.427350
# 2        A       1                 0.658120
# 3        C       1                 0.581197
# 4        B       0                 0.427350
# 5        A       1                 0.658120
# 6        C       0                 0.581197
# 7        C       1                 0.581197
# 8        B       0                 0.427350

時間特征提取

時間特征提取是從時間戳中提取有用信息,如年、月、日、小時等

## 時間特征提取
import pandas as pddata = pd.DataFrame({'timestamp': pd.date_range('2025-01-01', periods=5)})
data['year'] = data['timestamp'].dt.year
data['month'] = data['timestamp'].dt.month
data['day'] = data['timestamp'].dt.day
data['hour'] = data['timestamp'].dt.hour
print(data)
#    timestamp  year  month  day  hour
# 0 2025-01-01  2025      1    1     0
# 1 2025-01-02  2025      1    2     0
# 2 2025-01-03  2025      1    3     0
# 3 2025-01-04  2025      1    4     0
# 4 2025-01-05  2025      1    5     0

文本特征提取

文本特征提取是從文本數據中提取有用信息,常見的方法包括詞袋模型(Bag of Words)和TF-IDF

詞袋模型(Bag of Words)

將文本轉換為單詞頻率向量

## 文本特征提取
# 1. 詞袋模型(Bag of Words)
from sklearn.feature_extraction.text import CountVectorizercorpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?']
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out()) # ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
print(X.toarray())
# [[0 1 1 1 0 0 1 0 1]
#  [0 2 0 1 0 1 1 0 1]
#  [1 0 0 1 1 0 1 1 1]
#  [0 1 1 1 0 0 1 0 1]]

TF-IDF

將文本轉換為TF-IDF權重向量

# 2. TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?']
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out()) # ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
print(X.toarray())
# [[0.         0.46979139 0.58028582 0.38408524 0.         0.
#   0.38408524 0.         0.38408524]
#  [0.         0.6876236  0.         0.28108867 0.         0.53864762
#   0.28108867 0.         0.28108867]
#  [0.51184851 0.         0.         0.26710379 0.51184851 0.
#   0.26710379 0.51184851 0.26710379]
#  [0.         0.46979139 0.58028582 0.38408524 0.         0.
#   0.38408524 0.         0.38408524]]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88375.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s:安裝 Helm 私有倉庫ChartMuseum、helm-push插件并上傳、安裝Zookeeper

ChartMuseum 是 Kubernetes 生態中用于存儲、管理和發布 Helm Charts 的開源系統,主要用于擴展 Helm 包管理器的功能 核心功能 ?集中存儲?:提供中央化倉庫存儲Charts,支持版本管理和權限控制。 ? ?跨集群部署?:支持多集群環境…

C++編程學習(第二天)

1、求a和b兩個數之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定義變量a、b、sumcout << "請輸入第一個數字a: "; //打印需要顯示的字符串cin >> a; // >&…

毫米波雷達守護銀發安全:七彩喜跌倒檢測儀重構居家養老防線

在老齡化加速與獨居老人數量攀升的背景下&#xff0c;跌倒已成為威脅老年人生命安全的“隱形殺手”。七彩喜跌倒檢測儀以毫米波雷達技術為核心&#xff0c;通過“非接觸式監測智能預警”重塑居家安全防護體系&#xff0c;為銀發群體構建起全天候、無感化的數字守護網。技術突破…

面試復盤:節流中第二次觸發的事件?答錯補課

面試復盤&#xff1a;節流中第二次觸發的事件&#xff1f;答錯補課 背景描述 今天面試時被問到一個看似基礎但暗藏玄機的問題&#xff1a;“節流&#xff08;Throttle&#xff09;函數中&#xff0c;第二次觸發的那一幀事件是否會被丟掉&#xff1f;” 我基于對經典節流實現的…

Spark偽分布式集群搭建(Ubuntu系統)

環境準備 系統要求&#xff1a;Ubuntu 20.04/22.04 LTS 軟件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB內存&#xff0c;20GB磁盤空間 以下是基于Ubuntu系統的Spark偽分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】數據挖掘面試題0001:查找連續三天登錄的用戶

文章大綱一、測試數據構建二、自連接方案三、窗口函數方案一張用戶表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是這么幾項&#xff0c;查找連續三天登錄的用戶。 比如說&#xff0c;1,2兩天登錄不是連續三天&#xff0c;456登錄為連續三天登錄&#xff0c;56…

簡說scp命令

簡單介紹 scp的全稱是&#xff1a;Secure Copy Protocol&#xff08;安全復制協議&#xff09;&#xff0c;是Linux中用于在網絡中安全傳輸文件的命令行工具。它基于SSH協議&#xff0c;用于在本地服務器和遠程服務器之間&#xff0c;或者兩臺遠程服務器之間復制文件或目錄。 s…

自動化測試解決方案Parasoft SOAtest無腳本UI測試實踐指南

傳統UI自動化測試常面臨技術門檻高、維護成本大、穩定性差等挑戰。尤其在頁面頻繁變更時&#xff0c;測試腳本的更新和維護會顯著降低測試效率。 自動化測試解決方案Parasoft SOAtest通過可視化操作和智能元素定位技術&#xff0c;無需編寫代碼&#xff0c;讓測試人員能夠像真…

vscode配置頭文件和編譯器

在 VS Code 中配置編譯器和頭文件路徑需要修改兩個核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于構建&#xff09;。以下是詳細步驟&#xff1a; —### 1. 配置智能提示和頭文件路徑 (c_cpp_properties.json)作…

HTML+JS+CSS制作一個數獨游戲

閑來無事&#xff0c;用HTMLJSCSS制作了一個數獨游戲消遣。其實主要是自己做題的時候用筆畫刪除數字太容易出錯&#xff0c;所以想搞一個程序稍微輔助一下。通過制作這個程序&#xff0c;反而提高了手工做題的水平&#xff0c;至少學會了記錄步數以便于回退。 20250710功能更新…

嵌入式硬件中電容的基本原理與實現詳解02

我們今天重點討論點知識點如下: 1.各種種類的電容優缺點對比講解 2.電容的標稱值介紹 3.電容的單位介紹 4.常見的電壓信號有哪些? 5. 電容的耐壓值講解 6.電容的容值有哪些? 7.12pF、15pF 電容常用在什么場合? 8. 振蕩電路中使用的電容常常需要使用什么材質的電容? 9.100n…

Python訓練打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩師浙大疏錦行 知識點&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通…

fastadmin_php專項

1.時間的判斷,還有就是在php這邊如何去拿前端html元素上面的值input($row.borrowtime);// 創建兩個 DateTime 對象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 計算兩個日期之間的差異 // …

如何在MySQL中選擇使用InnoDB還是MyISAM引擎?

在 MySQL 中選擇 InnoDB 還是 MyISAM 存儲引擎時&#xff0c;需根據應用場景的需求權衡功能、性能和數據完整性。以下是具體的選擇指南&#xff1a; 1. 優先考慮事務和外鍵需求必須使用 InnoDB&#xff1a; 若應用需要 事務支持&#xff08;如金融轉賬、訂單處理&#xff09;或…

邀請函 | 知從科技邀您共赴2025 RISC-V 中國峰會

第五屆RISC-V中國峰會將于2025年7月16至19日在上海張江科學會堂隆重舉辦&#xff0c;本屆峰會由上海開放處理器產業創新中心&#xff08;SOPIC&#xff09;主辦&#xff0c;RISC-V國際開源實驗室&#xff08;RIOS實驗室&#xff09;和上海張江高科技園區開發股份有限公司聯合主…

企業數字化轉型規劃和建設方案(管理架構、應用架構、技術架構)PPT

一、戰略定位與核心目標以 “技術賦能業務&#xff0c;數據驅動創新” 為核心思路&#xff0c;構建 “三步走” 戰略演進路徑&#xff0c;實現 IT 從 “基礎支撐” 到 “戰略引擎” 的升級&#xff1a;IT1.0&#xff08;1-2 年&#xff09;&#xff1a;夯實基礎能力定位 “穩健…

基于Uniapp+MySQL+PHP的景區多商戶小程序源碼系統 帶完整的搭建指南

溫馨提示&#xff1a;文末有資源獲取方式該系統采用 PHP MySQL 的經典開發組合。PHP 作為一種廣泛使用的開源腳本語言&#xff0c;具有簡單易學、運行速度快、跨平臺性強等優點&#xff0c;能夠快速開發出功能強大的 Web 應用程序。MySQL 則是一款穩定可靠的關系型數據庫管理系…

阿里云和騰訊云RocketMQ 發消息和消費消息客戶端JAVA接口

一、RocketMQ 概述RocketMQ 是阿里巴巴開源的一款分布式消息中間件&#xff0c;后捐贈給 Apache 基金會成為頂級項目。它具有低延遲、高并發、高可用、高可靠等特點&#xff0c;廣泛應用于訂單交易、消息推送、流計算、日志收集等場景。核心特點分布式架構&#xff1a;支持集群…

Vue響應式原理六:Vue3響應式原理

1. 多個對象響應式當前存在的問題&#xff1a;當前實現僅針對某個固定對象&#xff08;obj&#xff09;進行依賴收集&#xff0c;實際開發中需要處理多個不同對象將對象響應式處理邏輯抽取為通用函數&#xff0c;支持任意對象代碼如下&#xff1a; // 方案一&#xff1a;Obje…

【算法筆記 day three】滑動窗口(其他類型)

hello大家好&#xff01;這份筆記包含的題目類型主要包括求子數組已經一些比較‘小眾’的題目。和之前一樣&#xff0c;筆記中的代碼和思路要么是我手搓要么是我借鑒一些大佬的想法轉化成自己的話復現。所以方法不一定是最好的&#xff0c;但一定是經過我理解的產物&#xff0c…