Pandas-特征工程詳解

Pandas-特征工程詳解

    • 一、特征工程的核心目標
    • 二、數據類型與基礎轉換
      • 1. 數值型特征:類型優化與異常處理
      • 2. 分類型特征:編碼與規范化
        • (1)標簽編碼(Label Encoding)
        • (2)獨熱編碼(One-Hot Encoding)
      • 3. 時間型特征:提取時間信息
    • 三、特征創建:從原始數據中挖掘新特征
      • 1. 數值型特征組合
      • 2. 分組統計特征
      • 3. 文本特征提取
    • 四、特征轉換:優化特征分布
      • 1. 標準化與歸一化
      • 2. 對數與冪轉換
      • 3. 交互特征
    • 五、特征選擇:保留關鍵信息
      • 1. 相關性分析
      • 2. 方差過濾
      • 3. 基于樹模型的特征重要性
    • 六、實戰案例:完整特征工程流程

特征工程其質量直接決定模型性能,優質的特征能讓簡單模型達到復雜模型的效果,而劣質特征則可能導致模型失效,Pandas提供了豐富的函數用于特征提取、轉換和選擇。本文我將系統講解如何利用Pandas進行特征工程,從數據類型轉換到高級特征創建,覆蓋特征工程的全流程關鍵技術。

一、特征工程的核心目標

特征工程的本質是將原始數據轉化為模型可理解的特征,核心目標包括:

  • 信息保留:最大限度保留原始數據中的有用信息
  • 噪聲去除:減少冗余和干擾信息
  • 分布優化:調整特征分布以適應模型假設(如線性模型偏好正態分布)
  • 維度控制:在信息損失最小化的前提下降低特征維度

Pandas在特征工程中的核心作用是高效處理結構化數據,支持數值型、分類型、時間型等多種數據的特征轉化。

二、數據類型與基礎轉換

原始數據的類型往往不符合建模要求,需先進行基礎轉換,為后續特征工程鋪路。

1. 數值型特征:類型優化與異常處理

數值型特征(int/float)是模型最易處理的類型,但需確保數據范圍合理:

import pandas as pd
import numpy as np# 示例數據
data = pd.DataFrame({'age': [25, 30, 35, 150, -5],  # 包含異常值'income': ['5000', '8000', '12000', '7500', 'NaN'],  # 字符串型數值'score': [85.5, 92.0, 78.3, 90.1, 88.7]
})# 1. 將字符串型數值轉換為float
data['income'] = pd.to_numeric(data['income'], errors='coerce')  # 'NaN'轉為NaN# 2. 處理異常值(年齡不可能超過120或為負)
data['age'] = data['age'].clip(lower=0, upper=120)  # 截斷異常值# 3. 類型優化(減少內存占用)
data['age'] = data['age'].astype('int8')  # 年齡范圍小,用int8足夠

2. 分類型特征:編碼與規范化

分類型特征(object/category)需轉換為數值形式才能輸入模型,常見方法包括:

(1)標簽編碼(Label Encoding)

適用于有序分類特征(如學歷:小學<初中<高中):

# 定義有序類別
education_order = ['小學', '初中', '高中', '本科', '碩士', '博士']
data['education'] = pd.Categorical(data['education'], categories=education_order, ordered=True
)
# 轉換為數值(0到n-1)
data['education_code'] = data['education'].cat.codes
(2)獨熱編碼(One-Hot Encoding)

適用于無序分類特征(如顏色、城市):

# 對城市進行獨熱編碼
city_dummies = pd.get_dummies(data['city'], prefix='city', drop_first=True)
# 合并到原數據
data = pd.concat([data, city_dummies], axis=1)
  • prefix:為新列名添加前綴(如city_北京
  • drop_first=True:刪除第一列以避免多重共線性

3. 時間型特征:提取時間信息

時間特征(datetime)蘊含豐富的模式(如季節性、周期性),需提取關鍵信息:

# 轉換為datetime類型
data['order_time'] = pd.to_datetime(data['order_time'])# 提取時間組件
data['hour'] = data['order_time'].dt.hour  # 小時(0-23)
data['dayofweek'] = data['order_time'].dt.dayofweek  # 星期幾(0=周一)
data['is_weekend'] = data['dayofweek'].isin([5, 6]).astype(int)  # 是否周末
data['month'] = data['order_time'].dt.month  # 月份(1-12)
data['is_holiday'] = data['order_time'].dt.date.isin(holiday_list).astype(int)  # 是否節假日

三、特征創建:從原始數據中挖掘新特征

基于業務邏輯創建新特征,是提升模型性能的關鍵。Pandas的apply()transform()函數是特征創建的利器。

1. 數值型特征組合

通過算術運算生成新特征(如比率、總和):

# 示例:電商數據
data['total_price'] = data['quantity'] * data['unit_price']  # 總價=數量×單價
data['price_per_weight'] = data['total_price'] / data['weight']  # 單位重量價格
data['discount_rate'] = data['actual_price'] / data['original_price']  # 折扣率

2. 分組統計特征

通過分組聚合創建統計特征(如用戶平均消費):

# 按用戶ID分組,計算每個用戶的消費統計量
user_stats = data.groupby('user_id')['total_price'].agg(['mean', 'sum', 'max', 'count']
).rename(columns={'mean': 'user_avg_spend','sum': 'user_total_spend','max': 'user_max_spend','count': 'user_purchase_count'
})
# 合并回原數據(每個用戶的統計量廣播到其所有訂單)
data = data.merge(user_stats, on='user_id', how='left')

3. 文本特征提取

對文本字段(如商品描述)提取關鍵詞或長度特征:

# 商品標題長度
data['title_length'] = data['product_title'].str.len()# 標題是否包含特定關鍵詞(如"促銷")
data['has_promotion'] = data['product_title'].str.contains('促銷', na=False).astype(int)# 分割并提取類別(如"男裝-T恤"→提取"T恤")
data['sub_category'] = data['category'].str.split('-', expand=True)[1]

四、特征轉換:優化特征分布

原始特征的分布可能不符合模型要求(如偏態分布),需通過轉換使其更接近理想分布。

1. 標準化與歸一化

  • 標準化(Standardization):將特征轉換為均值0、標準差1,適用于正態分布特征:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    data['amount_standardized'] = scaler.fit_transform(data[['amount']])
    
  • 歸一化(Normalization):將特征縮放到[0,1]區間,適用于均勻分布特征:

    data['amount_normalized'] = (data['amount'] - data['amount'].min()) / (data['amount'].max() - data['amount'].min()
    )
    

2. 對數與冪轉換

適用于右偏分布特征(如收入、消費金額):

# 對數轉換(處理右偏分布)
data['income_log'] = np.log1p(data['income'])  # log1p = log(1+x),避免x=0時出錯# 平方根轉換(輕度偏態)
data['price_sqrt'] = np.sqrt(data['price'])

3. 交互特征

通過特征間的乘法/加法創建交互項,捕捉變量間的協同效應:

# 價格×數量=總價(已在特征創建中體現)
# 年齡×消費金額:捕捉不同年齡的消費能力差異
data['age_spend_interaction'] = data['age'] * data['total_price']

五、特征選擇:保留關鍵信息

過多的特征會導致維度災難,需篩選出與目標變量相關性高的特征。

1. 相關性分析

通過皮爾遜相關系數篩選數值特征:

# 計算特征與目標變量的相關性
corr = data.corr()['target'].abs().sort_values(ascending=False)
# 選擇相關性Top20的特征
top_features = corr[1:21].index  # 排除目標變量自身
data_selected = data[top_features]

2. 方差過濾

刪除方差接近0的特征(幾乎無變化,無預測價值):

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)  # 方差低于0.01的特征將被刪除
data_high_variance = selector.fit_transform(data)

3. 基于樹模型的特征重要性

利用隨機森林等模型評估特征重要性:

from sklearn.ensemble import RandomForestClassifier
# 假設X是特征,y是目標變量
rf = RandomForestClassifier()
rf.fit(X, y)
# 提取特征重要性
importance = pd.Series(rf.feature_importances_, index=X.columns)
# 選擇重要性Top10的特征
top10_features = importance.sort_values(ascending=False).head(10).index
X_selected = X[top10_features]

六、實戰案例:完整特征工程流程

def build_features(raw_data):"""特征工程流水線函數"""data = raw_data.copy()# 1. 數據類型轉換data['order_date'] = pd.to_datetime(data['order_date'])data['price'] = pd.to_numeric(data['price'], errors='coerce')# 2. 異常值處理data['price'] = data['price'].clip(lower=0)# 3. 時間特征data['order_hour'] = data['order_date'].dt.hourdata['is_weekend'] = data['order_date'].dt.dayofweek.isin([5,6]).astype(int)# 4. 分類型特征編碼data = pd.get_dummies(data, columns=['category'], drop_first=True)# 5. 分組統計特征user_stats = data.groupby('user_id')['price'].agg(['mean', 'sum']).rename(columns={'mean': 'user_avg_price', 'sum': 'user_total_spend'})data = data.merge(user_stats, on='user_id', how='left')# 6. 特征轉換data['price_log'] = np.log1p(data['price'])# 7. 特征選擇(刪除低方差和冗余特征)data = data.drop(columns=['order_id', 'user_id', 'order_date'])  # 非特征列return data# 加載原始數據并執行特征工程
raw_data = pd.read_csv('raw_orders.csv')
features = build_features(raw_data)

總結:特征工程的核心原則
好的特征往往比復雜模型更重要

  1. 業務驅動:特征創建需基于對業務的理解(如電商的復購率、金融的還款能力)。
  2. 迭代優化:先構建基礎特征,結合模型反饋逐步添加復雜特征。
  3. 避免信息泄露:特征工程需在訓練集上擬合,再應用到驗證集/測試集(如分組統計不能用測試集數據)。
  4. 平衡復雜度:并非特征越多越好,過多特征會導致過擬合和計算成本上升。

That’s all, thanks for reading~~
覺得有用就點個贊、收進收藏夾吧!關注我,獲取更多干貨~

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

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

相關文章

pip install torch各種版本的命令及地址

一、遇到的問題&#xff1a;cuda和torch編譯時的版本不一致 在安裝mmcv時遇到error MMCV_WITH_OPS1 python setup.py develo RuntimeError: The detected CUDA version (11.3) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use th…

【spring boot】三種日志系統對比:ELK、Loki+Grafana、Docker API

文章目錄**方案 1&#xff1a;使用 ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;****適用場景****搭建步驟****1. 修改 Spring Boot 日志輸出****2. 創建 Docker Compose 文件****3. 配置 Logstash****4. 啟動服務****方案 2&#xff1a;使用 Loki Grafana***…

Cesium加載3DTiles模型并且重新設置3DTiles模型的高度

代碼&#xff1a; 使用的時候&#xff0c;直接調用 load3DTiles() 方法既可。 // 加載3Dtiles const load3DTiles async () > {let tiles_url "/3DTiles2/Production_1.json";let tileset await Cesium.Cesium3DTileset.fromUrl(tiles_url, {enableCollision: …

Matlab批量轉換1km降水數據為tiff格式

1km降水數據處理- 制作數據裁剪掩膜 0 引言1 示例程序2 結語0 引言 本篇介紹用Matlab工具將中國1km分辨率逐月降水量數據集(1901-2024)批量轉為tiff格式的過程。下面為具體內容: 1 示例程序 下載得到的nc數據(如pre_2001.nc)包含4個字段,其中降水數據的第1個維度為1-12,…

HandyJSON使用詳情

注意事項:Model 需要實現 HandyJSON 協議&#xff0c;對于簡單情況&#xff0c;只需聲明 class/struct 并添加 HandyJSON 協議即可1.簡單 JSON 結構JSON 數據:{"name": "John","age": 30,"isStudent": false }Model 類:struct Person:…

comfyUI-IPApterfaceID人臉特征提取

1.基礎節點 以Checkpoint、CLIP、空Latent、K采樣器、VAE解碼、預覽圖像為基礎節點。 2.人臉特征獲取節點 IPAdapter FaceID節點專用于將特定人臉特征&#xff08;通過參考圖提取&#xff09;融入生成圖像。 參考圖像&#xff0c;正面圖像是想要參考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image組件

其他常用組件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按鈕&#xff0c;就往這個數組里&#xff0c;按照這個格式不斷的加東西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少個都有問題&#xff0c;3 個以上它…

滲透筆記1-4

一、HTTPS安全機制 1. HTTP的安全風險 竊聽風險&#xff1a;明文傳輸導致通信內容可被直接截獲&#xff08;如Wireshark抓包獲取密碼&#xff09;。篡改風險&#xff1a;中間人可修改傳輸內容&#xff08;如注入惡意腳本&#xff09;。冒充風險&#xff1a;攻擊者偽造服務端身份…

《星盤接口6:星際聯盟》

《星盤接口6&#xff1a;星際聯盟》? 第一章&#xff1a;新的黎明地球歷2097年&#xff0c;陳欣和她的團隊成功地將“數據之神”封印在一個獨立的數據維度中&#xff0c;暫時解除了對銀河系的威脅。然而&#xff0c;這場勝利并沒有帶來長久的和平。隨著人類文明不斷擴展至更遙…

【安卓筆記】進程和線程的基礎知識

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虛擬機的線程 ----------以下都是系統線程&#xff0c;由JV…

26-計組-多處理器

多處理器的基本概念1. 計算機體系結構分類依據&#xff1a;根據指令流和數據流的數量關系&#xff0c;計算機體系結構可分為四種類型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 單指令流單數據流定義&#xff1a;任意時刻計算機只能執行單一指令操作單…

vscode 插件開發activityba

在 VS Code 插件開發中&#xff0c;**Activity Bar&#xff08;活動欄&#xff09;**是左側垂直導航欄的核心組成部分&#xff0c;它為用戶提供了快速訪問插件功能的入口。通過自定義 Activity Bar&#xff0c;開發者可以顯著提升插件的可見性和用戶體驗。以下是關于 Activity …

【橘子分布式】Thrift RPC(理論篇)

一、簡介 首先還是那句話&#xff0c;概念網上已經很多了&#xff0c;我們就不多逼逼了。我來大致介紹一下。 Thrift是一個RPC框架可以進行異構系統(服務的提供者 和 服務的調用者 不同編程語言開發系統)的RPC調用為什么在當前的系統開發中&#xff0c;會存在著異構系統的RPC…

項目進度依賴紙面計劃,如何提升計劃動態調整能力

項目進度依賴紙面計劃會導致實際執行中的調整能力不足。提升計劃動態調整能力的方法包括&#xff1a;建立動態進度管理系統、強化團隊溝通與協作、定期開展風險評估與進度復盤。特別是建立動態進度管理系統&#xff0c;通過信息技術工具實現實時跟蹤和反饋&#xff0c;使計劃能…

遞推預處理floor(log_2{n})

在C中&#xff0c;除了使用<cmath>中的log或log2函數求對數&#xff0c;也可以通過遞推求出所有可能用到的?log?2i?,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]?log2?i?,i∈[1,n] 證明&#xff1a;?log?2i??log?2?i2??1\lfloor \log_2i \rfloor\lfloor \…

【AI智能體】智能音視頻-搭建可視化智能體

可視化智能體是語音小伴侶智能體的升級版&#xff0c;支持語音與視頻的雙模態交互。本文詳細介紹了音視頻交互的實現原理、智能體搭建方法及效果測試&#xff0c;幫助開發者快速構建支持音視頻交互的智能體。 應用場景 可視化智能體適用于多種場景&#xff0c;舉例如下&#…

Sensoglove推出新一代外骨骼力反饋手套:主動力反饋+亞毫米級手指追蹤,助力機器人操控與虛擬仿真

在工業自動化、虛擬現實和醫療康復等領域&#xff0c;高精度手部交互設備的需求日益增長。Sensoglove推出的Rembrandt外骨骼力反饋手套&#xff0c;結合主動力反饋、觸覺反饋與亞毫米級追蹤技術&#xff0c;為用戶提供更自然、更安全的操作體驗。Sensoglove外骨骼力反饋手套核心…

AutoMapper入門

在 ASP.NET Core 開發中&#xff0c;我們經常需要在不同層之間傳遞數據&#xff1a;比如從數據庫模型&#xff08;Entity&#xff09;轉換到 DTO&#xff0c;再從 DTO 轉換為前端視圖模型。這些轉換代碼大量重復、冗長、容易出錯。為了解決這個問題&#xff0c;AutoMapper 誕生…

PyTorch武俠演義 第一卷:初入江湖 第1章:武林新秀遇Tensor - 張量基礎

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 張量基礎晨起碼農村 雞鳴三聲&#xff0c;林小碼已經收拾好了行囊。他最后看了眼床頭那本翻舊的《Python入門心法》&#xff0c;輕輕撫平卷起的書角。 "小碼&#xff0c;路上小心。"父親將一把青銅匕…

Python進階(4):類與面向對象程序設計

面向對象OOPOOP:Object Oriented Programming,面向對象編程,面向對象中的對象(Obiect)&#xff0c;通常是指客觀世界中存在的對象&#xff0c;這個對象具有唯一性&#xff0c;對象之間各不相同&#xff0c;各有各的特點&#xff0c;每個對象都有自己的運動規律和內部狀態;對象與…