0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器学习特征工程:缩放、编码、聚合、嵌入与自动化

颖脉Imgtec 2026-04-08 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文转自:DeepHub IMBA


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


第1部分:数值特征

1. 1 缩放

多数机器学习算法对尺度敏感。一个取值范围在0到1,000,000的列,会在训练中压制一个取值范围仅0到1的列。

常用的三种缩放器各有适用场景:StandardScaler适合近似正态分布的数据,也是最常见的选择;MinMaxScaler将值压缩到0和1之间,适合神经网络;RobustScaler基于中位数和四分位距(IQR)而非均值,在数据中存在明显异常值时更为稳健。

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

缩放器只能在训练集上拟合。在完整数据集上拟合会引入信息泄漏。

1. 2 对数变换

数值列严重右偏时——收入、价格、营收都是典型例子——对数变换可以拉平分布。

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

1. 3 分箱

连续数值有时转换为类别反而更有用。pd.cut()生成等宽分箱,适合分布均匀的数据;pd.qcut()按分位数切分,每个箱中样本量相等,更适合偏斜分布。

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

1. 4 交互特征

两个特征组合后的表达能力往往超过各自单独使用。

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

线性模型中,多项式特征有助于捕获非线性关系:

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
# Creates: age, salary, age², salary², 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 独热编码

将每个类别展开为独立的0/1列,适用于没有内在顺序的名义类别。

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

如果某列包含500个唯一类别,独热编码会产生500列。这种情况应改用目标编码。

2. 2 标签编码

为每个类别赋一个整数,仅限数据确实存在顺序关系的场景。

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

不要对城市名一类的名义数据做标签编码——模型会错误地推断 London > Mumbai

2. 3 目标编码

用对应分组的目标变量均值替换每个类别值,处理高基数列时收效明显。

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

风险在于数据泄漏。生产环境中应采用交叉折叠目标编码。

2. 4 频率编码

用每个类别的出现频率替换原始值。做法简单,但在树模型中的效果常常出人意料。

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

2. 5 二进制编码

介于标签编码与独热编码之间的折中方案,在保持较少列数的前提下处理高基数特征。

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


第3部分:日期时间特征

原始日期对多数模型没有意义,需要把其中蕴含的时间信息提取出来。

3. 1 标准提取

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 周期编码

月份如果作为普通数字输入,模型会认为十二月(12)和一月(1)距离很远——但它们只隔一个月。用正弦和余弦变换可以保留周期结构:

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 基础统计特征

在引入任何NLP手段之前,先提取简单的统计量。实际效果往往超出预期。

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将文本转换为按词项重要性加权的数值表示。

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 句子嵌入

更现代的做法是用预训练模型将文本压缩为稠密向量,从而捕获语义信息。在深度学习场景下,这比TF-IDF的表达能力高出一个量级。

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 距离特征

一个数据点与关键地标之间的距离,本身就是一个信息量很大的特征。

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将经纬度编码为短字符串,每个前缀对应一个地理区域,天然适合做位置聚合。

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部分:聚合特征

在生产环境的机器学习系统中,聚合类特征的价值极高,尤其是在客户行为和交易数据上。

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 滞后和滚动特征

序列数据中,过去N个时间段内发生了什么,往往是预测能力最强的信号

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部分:特征选择

构造特征只是工作的一半,另一半是筛掉无用的。

7.1 删除低方差特征

如果一列的值几乎不变化,模型从中学不到任何东西。

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

7.2 删除高相关特征

高度相关的特征本质上是冗余信息。保留一个,其余丢弃。

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不仅能揭示哪些特征重要,还能解释每个特征对单条预测结果的具体影响方向和幅度。

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


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

当候选组合数量庞大时,手动构造特征不再现实。更好的做法是用程序批量生成,再交由特征选择环节做筛选。

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")

跑完之后,依次过方差过滤、相关性过滤,再看特征重要性得分,留下来的就是值得用的。


总结

特征工程是领域知识和技术能力的交叉地带。算法再精妙,也无法弥补特征层面的粗糙。

持续产出高质量模型的工程师,往往不是掌握算法最多的人而是对数据理解最深的人。从简单的特征开始量化每一步的收益,只在简单版本不够用的时候才引入复杂度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5209

    文章

    20622

    浏览量

    336753
  • 机器学习
    +关注

    关注

    67

    文章

    8561

    浏览量

    137208
  • 数据集
    +关注

    关注

    4

    文章

    1240

    浏览量

    26259
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何轻松掌握机器学习概念和在工业自动化中的应用

    要说现在最热门的前沿技术,那非人工智能(AI)莫属。而人工智能的核心却是机器学习(ML)。可以说,掌握了机器学习,你也就掌握了人工智能技术。 那么,对于工业用户来说,如何将
    的头像 发表于 01-16 09:45 3920次阅读

    电气工程及其自动化

    电气工程及其自动化的专业的学生(大二了)该如何去规划一下自己未来的时间,需要着重学习那些方面的技能
    发表于 02-21 18:56

    招聘自动化、电气自动化自动化控制工程

    招聘自动化、电气自动化自动化控制工程师,挂证,不坐班,要求持有相关专业的中级职称证,用于我司资质申报工作上,凑资质人员申报资质,不存在风险。联系电话***,Q1580479594李经
    发表于 10-24 18:06

    机器学习专家们每天都在做什么?如何让机器学习自动化

    在思考我们如何让机器学习自动化,以及如何让它普及到更多领域的人时,首先要思考的是,机器学习专家们都要做什么?任何能解决
    的头像 发表于 07-19 16:01 5753次阅读

    自动化机器学习是什么情况

    机器学习发展中遇到的问题,一个核心因素是人,而机器学习的工作又有大量的人工干预,如特征提取、模型选择、参数调节等
    发表于 11-04 16:35 1760次阅读

    如何使用深度神经网络技术实现机器学习的全噪声自动编码

    ,基于自动编码器的深度神经网络可以有效的用于数据特征提取。自动编码是一种无监督学习算法,稀疏自动编码器、降噪
    发表于 12-11 15:44 7次下载
    如何使用深度神经网络技术实现<b class='flag-5'>机器</b><b class='flag-5'>学习</b>的全噪声<b class='flag-5'>自动编码</b>器

    机器学习特征工程的五个方面优点

    特征工程是用数学转换的方法将原始输入数据转换为用于机器学习模型的新特征特征
    的头像 发表于 03-15 16:57 4708次阅读

    谈谈如何将机器学习引入自动化

    今天,笔者尝试通过一个一般性方法的介绍来谈谈如何将机器学习引入自动化,同时对机器学习的相关概念做一个梳理。
    的头像 发表于 10-09 15:55 3005次阅读

    800G自动化类、嵌入式类以及前端学习资料

    800G自动化类、嵌入式类以及前端学习资料
    发表于 11-15 15:51 7次下载
    800G<b class='flag-5'>自动化</b>类、<b class='flag-5'>嵌入</b>式类以及前端<b class='flag-5'>学习</b>资料

    DB4564_用于STM32微控制器的自动化机器学习(ML)工具

    DB4564_用于STM32微控制器的自动化机器学习(ML)工具
    发表于 11-23 20:28 0次下载
    DB4564_用于STM32微控制器的<b class='flag-5'>自动化</b><b class='flag-5'>机器</b><b class='flag-5'>学习</b>(ML)工具

    机器学习算法学习特征工程1

    特征工程机器学习过程中的关键步骤,涉及将原始数据转换为机器学习算法可以有效使用的格式。在本篇博
    的头像 发表于 04-19 11:38 1754次阅读
    <b class='flag-5'>机器</b><b class='flag-5'>学习</b>算法<b class='flag-5'>学习</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>1

    机器学习算法学习特征工程2

    特征工程机器学习过程中的关键步骤,涉及将原始数据转换为机器学习算法可以有效使用的格式。在本篇博
    的头像 发表于 04-19 11:38 1672次阅读
    <b class='flag-5'>机器</b><b class='flag-5'>学习</b>算法<b class='flag-5'>学习</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>2

    机器学习算法学习特征工程3

    特征工程机器学习过程中的关键步骤,涉及将原始数据转换为机器学习算法可以有效使用的格式。在本篇博
    的头像 发表于 04-19 11:38 1773次阅读
    <b class='flag-5'>机器</b><b class='flag-5'>学习</b>算法<b class='flag-5'>学习</b>之<b class='flag-5'>特征</b><b class='flag-5'>工程</b>3

    自动化编程机器人如何使编码民主

    的人赋予了编写高质量代码的能力,从而打破了以往的障碍。 首先,自动化编程机器人通过简化编程过程使编码更加易于初学者理解和掌握。传统的编程通常需要学习复杂的语法规则、逻辑思维和算法等知识
    的头像 发表于 09-04 14:23 1060次阅读

    机器学习中的数据预处理与特征工程

    机器学习的整个流程中,数据预处理与特征工程是两个至关重要的步骤。它们直接决定了模型的输入质量,进而影响模型的训练效果和泛能力。本文将从数
    的头像 发表于 07-09 15:57 2636次阅读