91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器學(xué)習(xí)特征工程:縮放、編碼、聚合、嵌入與自動化

穎脈Imgtec ? 2026-04-08 14:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文轉(zhuǎn)自:DeepHub IMBA


好模型的秘訣不在于更花哨的算法,而在于更好的特征。f8c3cb50-3315-11f1-ab55-92fbcf53809c.jpg


第1部分:數(shù)值特征

1. 1 縮放

多數(shù)機(jī)器學(xué)習(xí)算法對尺度敏感。一個取值范圍在0到1,000,000的列,會在訓(xùn)練中壓制一個取值范圍僅0到1的列。

常用的三種縮放器各有適用場景:StandardScaler適合近似正態(tài)分布的數(shù)據(jù),也是最常見的選擇;MinMaxScaler將值壓縮到0和1之間,適合神經(jīng)網(wǎng)絡(luò);RobustScaler基于中位數(shù)和四分位距(IQR)而非均值,在數(shù)據(jù)中存在明顯異常值時更為穩(wěn)健。

from sklearn.preprocessing import RobustScaler
df['salary_scaled'] = RobustScaler().fit_transform(df[['salary']])

縮放器只能在訓(xùn)練集上擬合。在完整數(shù)據(jù)集上擬合會引入信息泄漏。

1. 2 對數(shù)變換

數(shù)值列嚴(yán)重右偏時——收入、價格、營收都是典型例子——對數(shù)變換可以拉平分布。

import numpy as np
df['revenue_log'] = np.log1p(df['revenue']) # log1p可以安全處理零值

1. 3 分箱

連續(xù)數(shù)值有時轉(zhuǎn)換為類別反而更有用。pd.cut()生成等寬分箱,適合分布均勻的數(shù)據(jù);pd.qcut()按分位數(shù)切分,每個箱中樣本量相等,更適合偏斜分布。

df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 55, 100],
labels=['teen', 'young_adult', 'adult', 'senior'])

1. 4 交互特征

兩個特征組合后的表達(dá)能力往往超過各自單獨(dú)使用。

df['price_per_sqft'] = df['price'] / df['sqft']
df['debt_to_income'] = df['debt'] / df['income']

線性模型中,多項(xiàng)式特征有助于捕獲非線性關(guān)系:

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
# Creates: age, salary, age2, salary2, age × salary

1. 5 裁剪異常值

與其刪除異常值,不如將它們截斷到合理的百分位范圍。

lower = df['salary'].quantile(0.01)
upper = df['salary'].quantile(0.99)
df['salary_clipped'] = df['salary'].clip(lower=lower, upper=upper)


第2部分:類別特征

2. 1 獨(dú)熱編碼

將每個類別展開為獨(dú)立的0/1列,適用于沒有內(nèi)在順序的名義類別。

df_encoded = pd.get_dummies(df, columns=['city'], drop_first=True)

如果某列包含500個唯一類別,獨(dú)熱編碼會產(chǎn)生500列。這種情況應(yīng)改用目標(biāo)編碼。

2. 2 標(biāo)簽編碼

為每個類別賦一個整數(shù),僅限數(shù)據(jù)確實(shí)存在順序關(guān)系的場景。

df['education'] = df['education'].map({
'High School': 0, 'Bachelor': 1, 'Master': 2, 'PhD': 3
})

不要對城市名一類的名義數(shù)據(jù)做標(biāo)簽編碼——模型會錯誤地推斷 London > Mumbai。

2. 3 目標(biāo)編碼

用對應(yīng)分組的目標(biāo)變量均值替換每個類別值,處理高基數(shù)列時收效明顯。

from category_encoders import TargetEncoder
df['city_encoded'] = TargetEncoder().fit_transform(df['city'], df['churn'])

風(fēng)險在于數(shù)據(jù)泄漏。生產(chǎn)環(huán)境中應(yīng)采用交叉折疊目標(biāo)編碼。

2. 4 頻率編碼

用每個類別的出現(xiàn)頻率替換原始值。做法簡單,但在樹模型中的效果常常出人意料。

freq_map = df['city'].value_counts(normalize=True)
df['city_freq'] = df['city'].map(freq_map)

2. 5 二進(jìn)制編碼

介于標(biāo)簽編碼與獨(dú)熱編碼之間的折中方案,在保持較少列數(shù)的前提下處理高基數(shù)特征。

from category_encoders import BinaryEncoder
df_encoded = BinaryEncoder().fit_transform(df[['city']])
# 100 categories → only 7 binary columns


第3部分:日期時間特征

原始日期對多數(shù)模型沒有意義,需要把其中蘊(yùn)含的時間信息提取出來。

3. 1 標(biāo)準(zhǔn)提取

df['order_date'] = pd.to_datetime(df['order_date'])

df['month'] = df['order_date'].dt.month
df['day_of_week'] = df['order_date'].dt.dayofweek
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['quarter'] = df['order_date'].dt.quarter
df['days_since'] = (df['order_date'] - pd.Timestamp('2024-01-01')).dt.days

3. 2 周期編碼

月份如果作為普通數(shù)字輸入,模型會認(rèn)為十二月(12)和一月(1)距離很遠(yuǎn)——但它們只隔一個月。用正弦和余弦變換可以保留周期結(jié)構(gòu):

import numpy as np
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

同樣的思路適用于一天中的小時(除以24)。

3. 3 工作日歷特征

import holidays
indian_holidays = holidays.India(years=2025)

df['is_holiday'] = df['order_date'].apply(lambda d: d in indian_holidays).astype(int)
df['is_month_end'] = df['order_date'].dt.is_month_end.astype(int)


第4部分:文本特征

4. 1 基礎(chǔ)統(tǒng)計(jì)特征

在引入任何NLP手段之前,先提取簡單的統(tǒng)計(jì)量。實(shí)際效果往往超出預(yù)期。

df['word_count'] = df['review'].str.split().str.len()
df['avg_word_len'] = df['review'].str.len() / df['word_count']
df['has_question'] = df['review'].str.contains(r'\\\\?').astype(int)
df['uppercase_ratio'] = df['review'].apply(
lambda x: sum(c.isupper() for c in str(x)) / max(len(str(x)), 1)
)

4. 2 TF-IDF

TF-IDF將文本轉(zhuǎn)換為按詞項(xiàng)重要性加權(quán)的數(shù)值表示。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=100, ngram_range=(1, 2), stop_words='english')
X_tfidf = tfidf.fit_transform(df['review'])

4. 3 情感得分

from textblob import TextBlob
df['sentiment'] = df['review'].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
# 范圍從-1(非常消極)到1(非常積極)

4. 4 句子嵌入

更現(xiàn)代的做法是用預(yù)訓(xùn)練模型將文本壓縮為稠密向量,從而捕獲語義信息。在深度學(xué)習(xí)場景下,這比TF-IDF的表達(dá)能力高出一個量級。

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(df['review'].tolist())
# Shape: (n_rows, 384) — each row becomes 384 numerical features


第5部分:地理空間特征

5. 1 距離特征

一個數(shù)據(jù)點(diǎn)與關(guān)鍵地標(biāo)之間的距離,本身就是一個信息量很大的特征。

from math import radians, sin, cos, sqrt, atan2

def haversine(lat1, lon1, lat2, lon2):
R = 6371
lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
a = sin((lat2-lat1)/2)**2 + cos(lat1)*cos(lat2)*sin((lon2-lon1)/2)**2
return R * 2 * atan2(sqrt(a), sqrt(1-a))
city_centre = (28.6139, 77.2090)

df['dist_to_centre_km'] = df.apply(
lambda r: haversine(r['lat'], r['lon'], *city_centre), axis=1
)

5. 2 Geohash

Geohash將經(jīng)緯度編碼為短字符串,每個前綴對應(yīng)一個地理區(qū)域,天然適合做位置聚合。

import pygeohash as pgh
df['geohash_5'] = df.apply(lambda r: pgh.encode(r['lat'], r['lon'], precision=5), axis=1)
# precision 5 = roughly 5km area


第6部分:聚合特征

在生產(chǎn)環(huán)境的機(jī)器學(xué)習(xí)系統(tǒng)中,聚合類特征的價值極高,尤其是在客戶行為和交易數(shù)據(jù)上。

6. 1 分組聚合

stats = df.groupby('customer_id').agg(
total_orders=('order_id', 'count'),
total_spent=('amount', 'sum'),
avg_order_value=('amount', 'mean'),
max_order=('amount', 'max')
).reset_index()

df = df.merge(stats, on='customer_id', how='left')

6. 2 滯后和滾動特征

序列數(shù)據(jù)中,過去N個時間段內(nèi)發(fā)生了什么,往往是預(yù)測能力最強(qiáng)的信號。

df = df.sort_values(['customer_id', 'order_date'])

df['prev_order_amount'] = df.groupby('customer_id')['amount'].shift(1)
df['amount_change'] = df['amount'] - df['prev_order_amount']

df['rolling_30d_spend'] = (
df.groupby('customer_id')['amount']
.transform(lambda x: x.rolling(3).sum())
)


第7部分:特征選擇

構(gòu)造特征只是工作的一半,另一半是篩掉無用的。

7.1 刪除低方差特征

如果一列的值幾乎不變化,模型從中學(xué)不到任何東西。

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)
X_reduced = selector.fit_transform(X)

7.2 刪除高相關(guān)特征

高度相關(guān)的特征本質(zhì)上是冗余信息。保留一個,其余丟棄。

corr = df.corr().abs()
upper = corr.where(np.triu(np.ones(corr.shape), k=1).astype(bool))
to_drop = [col for col in upper.columns if any(upper[col] > 0.95)]
df.drop(columns=to_drop, inplace=True)

7.3 特征重要性

用樹模型對特征排序,重要性接近零的直接去掉。

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

importance = pd.Series(model.feature_importances_, index=X_train.columns)
print(importance.sort_values(ascending=False).head(20))

7.4 SHAP值

SHAP不僅能揭示哪些特征重要,還能解釋每個特征對單條預(yù)測結(jié)果的具體影響方向和幅度。

import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)
shap.summary_plot(shap_values, X_train)


第8部分:自動化特征工程

當(dāng)候選組合數(shù)量龐大時,手動構(gòu)造特征不再現(xiàn)實(shí)。更好的做法是用程序批量生成,再交由特征選擇環(huán)節(jié)做篩選。

import featuretools as ft

es = ft.EntitySet(id='orders')
es = es.add_dataframe(dataframe_name='orders', dataframe=df,
index='order_id', time_index='order_date')
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name='orders',
agg_primitives=['sum', 'mean', 'count', 'max', 'std'],
trans_primitives=['month', 'weekday', 'is_weekend'],
max_depth=2
)
print(f"Generated {len(feature_defs)} features automatically")

跑完之后,依次過方差過濾、相關(guān)性過濾,再看特征重要性得分,留下來的就是值得用的。


總結(jié)

特征工程是領(lǐng)域知識和技術(shù)能力的交叉地帶。算法再精妙,也無法彌補(bǔ)特征層面的粗糙。

持續(xù)產(chǎn)出高質(zhì)量模型的工程師,往往不是掌握算法最多的人而是對數(shù)據(jù)理解最深的人。從簡單的特征開始量化每一步的收益,只在簡單版本不夠用的時候才引入復(fù)雜度。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5206

    文章

    20572

    瀏覽量

    336131
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    67

    文章

    8560

    瀏覽量

    137152
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1239

    瀏覽量

    26246
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何輕松掌握機(jī)器學(xué)習(xí)概念和在工業(yè)自動化中的應(yīng)用

    要說現(xiàn)在最熱門的前沿技術(shù),那非人工智能(AI)莫屬。而人工智能的核心卻是機(jī)器學(xué)習(xí)(ML)??梢哉f,掌握了機(jī)器學(xué)習(xí),你也就掌握了人工智能技術(shù)。 那么,對于工業(yè)用戶來說,如何將
    的頭像 發(fā)表于 01-16 09:45 ?3902次閱讀

    電氣工程及其自動化

    電氣工程及其自動化的專業(yè)的學(xué)生(大二了)該如何去規(guī)劃一下自己未來的時間,需要著重學(xué)習(xí)那些方面的技能
    發(fā)表于 02-21 18:56

    招聘自動化、電氣自動化、自動化控制工程

    招聘自動化、電氣自動化、自動化控制工程師,掛證,不坐班,要求持有相關(guān)專業(yè)的中級職稱證,用于我司資質(zhì)申報工作上,湊資質(zhì)人員申報資質(zhì),不存在風(fēng)險。聯(lián)系電話***,Q1580479594李經(jīng)
    發(fā)表于 10-24 18:06

    機(jī)器學(xué)習(xí)專家們每天都在做什么?如何讓機(jī)器學(xué)習(xí)自動化

    在思考我們?nèi)绾巫?b class='flag-5'>機(jī)器學(xué)習(xí)自動化,以及如何讓它普及到更多領(lǐng)域的人時,首先要思考的是,機(jī)器學(xué)習(xí)專家們都要做什么?任何能解決
    的頭像 發(fā)表于 07-19 16:01 ?5737次閱讀

    自動化機(jī)器學(xué)習(xí)是什么情況

    機(jī)器學(xué)習(xí)發(fā)展中遇到的問題,一個核心因素是人,而機(jī)器學(xué)習(xí)的工作又有大量的人工干預(yù),如特征提取、模型選擇、參數(shù)調(diào)節(jié)等
    發(fā)表于 11-04 16:35 ?1748次閱讀

    如何使用深度神經(jīng)網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)機(jī)器學(xué)習(xí)的全噪聲自動編碼

    ,基于自動編碼器的深度神經(jīng)網(wǎng)絡(luò)可以有效的用于數(shù)據(jù)特征提取。自動編碼是一種無監(jiān)督學(xué)習(xí)算法,稀疏自動編碼器、降噪
    發(fā)表于 12-11 15:44 ?7次下載
    如何使用深度神經(jīng)網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)<b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>的全噪聲<b class='flag-5'>自動編碼</b>器

    機(jī)器學(xué)習(xí)特征工程的五個方面優(yōu)點(diǎn)

    特征工程是用數(shù)學(xué)轉(zhuǎn)換的方法將原始輸入數(shù)據(jù)轉(zhuǎn)換為用于機(jī)器學(xué)習(xí)模型的新特征。特征
    的頭像 發(fā)表于 03-15 16:57 ?4694次閱讀

    談?wù)勅绾螌?b class='flag-5'>機(jī)器學(xué)習(xí)引入自動化

    今天,筆者嘗試通過一個一般性方法的介紹來談?wù)勅绾螌?b class='flag-5'>機(jī)器學(xué)習(xí)引入自動化,同時對機(jī)器學(xué)習(xí)的相關(guān)概念做一個梳理。
    的頭像 發(fā)表于 10-09 15:55 ?2989次閱讀

    800G自動化類、嵌入式類以及前端學(xué)習(xí)資料

    800G自動化類、嵌入式類以及前端學(xué)習(xí)資料
    發(fā)表于 11-15 15:51 ?7次下載
    800G<b class='flag-5'>自動化</b>類、<b class='flag-5'>嵌入</b>式類以及前端<b class='flag-5'>學(xué)習(xí)</b>資料

    DB4564_用于STM32微控制器的自動化機(jī)器學(xué)習(xí)(ML)工具

    DB4564_用于STM32微控制器的自動化機(jī)器學(xué)習(xí)(ML)工具
    發(fā)表于 11-23 20:28 ?0次下載
    DB4564_用于STM32微控制器的<b class='flag-5'>自動化</b><b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>(ML)工具

    機(jī)器學(xué)習(xí)算法學(xué)習(xí)特征工程1

    特征工程機(jī)器學(xué)習(xí)過程中的關(guān)鍵步驟,涉及將原始數(shù)據(jù)轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法可以有效使用的格式。在本篇博
    的頭像 發(fā)表于 04-19 11:38 ?1732次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>算法<b class='flag-5'>學(xué)習(xí)</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>1

    機(jī)器學(xué)習(xí)算法學(xué)習(xí)特征工程2

    特征工程機(jī)器學(xué)習(xí)過程中的關(guān)鍵步驟,涉及將原始數(shù)據(jù)轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法可以有效使用的格式。在本篇博
    的頭像 發(fā)表于 04-19 11:38 ?1648次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>算法<b class='flag-5'>學(xué)習(xí)</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>2

    機(jī)器學(xué)習(xí)算法學(xué)習(xí)特征工程3

    特征工程機(jī)器學(xué)習(xí)過程中的關(guān)鍵步驟,涉及將原始數(shù)據(jù)轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法可以有效使用的格式。在本篇博
    的頭像 發(fā)表于 04-19 11:38 ?1746次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>算法<b class='flag-5'>學(xué)習(xí)</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>3

    自動化編程機(jī)器人如何使編碼民主

    的人賦予了編寫高質(zhì)量代碼的能力,從而打破了以往的障礙。 首先,自動化編程機(jī)器人通過簡化編程過程使編碼更加易于初學(xué)者理解和掌握。傳統(tǒng)的編程通常需要學(xué)習(xí)復(fù)雜的語法規(guī)則、邏輯思維和算法等知識
    的頭像 發(fā)表于 09-04 14:23 ?1041次閱讀

    機(jī)器學(xué)習(xí)中的數(shù)據(jù)預(yù)處理與特征工程

    機(jī)器學(xué)習(xí)的整個流程中,數(shù)據(jù)預(yù)處理與特征工程是兩個至關(guān)重要的步驟。它們直接決定了模型的輸入質(zhì)量,進(jìn)而影響模型的訓(xùn)練效果和泛能力。本文將從數(shù)
    的頭像 發(fā)表于 07-09 15:57 ?2612次閱讀