news 2026/5/31 17:41:14

Python特征工程基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python特征工程基础

# Python特征工程基础
# 特征工程是将原始数据转换为更适合模型的表示
# 包括缩放、编码、特征构造和特征选择

# 1. 导入库
import numpy as np
import pandas as pd
from sklearn.preprocessing import (
StandardScaler, MinMaxScaler, OneHotEncoder, LabelEncoder, PolynomialFeatures
)
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 2. 创建示例数据(含数值和分类特征)
data = {
'age': [25, 30, 35, 40, 45, 50, 55, 60],
'salary': [30000, 45000, 50000, 60000, 70000, 80000, 90000, 100000],
'city': ['BJ', 'SH', 'GZ', 'BJ', 'SH', 'SZ', 'GZ', 'BJ'],
'department': ['Tech', 'HR', 'Tech', 'Sales', 'Tech', 'HR', 'Sales', 'Tech'],
'target': [0, 0, 1, 1, 1, 0, 0, 1]
}
df = pd.DataFrame(data)
print(f"原始数据:\n{df}\n")

# 3. StandardScaler — 标准化(均值=0,标准差=1)
scaler_std = StandardScaler()
age_salary = df[['age', 'salary']]
age_salary_scaled = scaler_std.fit_transform(age_salary)
print(f"=== StandardScaler ===")
print(f"均值: {age_salary_scaled.mean(axis=0).round(4)}")
print(f"标准差: {age_salary_scaled.std(axis=0).round(4)}")

# 4. MinMaxScaler — 归一化
scaler_mm = MinMaxScaler()
age_salary_mm = scaler_mm.fit_transform(age_salary)
print(f"\n=== MinMaxScaler ===")
print(f"最小值: {age_salary_mm.min(axis=0)}, 最大值: {age_salary_mm.max(axis=0)}")

# 5. OneHotEncoder — 独热编码
ohe = OneHotEncoder(sparse_output=False, drop='first')
city_encoded = ohe.fit_transform(df[['city']])
print(f"\n=== OneHotEncoder ===")
print(f"原始类别: {ohe.categories_}")
print(f"编码结果:\n{city_encoded}")

# 6. LabelEncoder — 标签编码
le = LabelEncoder()
department_encoded = le.fit_transform(df['department'])
print(f"=== LabelEncoder ===")
print(f"编码映射: {dict(zip(le.classes_, le.transform(le.classes_)))}")
print(f"编码结果: {department_encoded}")

# 7. PolynomialFeatures — 多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
age_salary_poly = poly.fit_transform(age_salary)
print(f"\n=== PolynomialFeatures ===")
print(f"原始 {age_salary.shape[1]} 维 -> {age_salary_poly.shape[1]} 维")
print(f"特征名称: {poly.get_feature_names_out()}")

# 8. SelectKBest — 特征选择
iris = load_iris()
X, y = iris.data, iris.target
selector = SelectKBest(score_func=f_classif, k=2)
X_selected = selector.fit_transform(X, y)
print(f"\n=== SelectKBest (K=2) ===")
print(f"特征分数: {selector.scores_}")
print(f"选中索引: {selector.get_support(indices=True)}")

# 9. 完整流程:拟合训练集,转换测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 只用 transform!
print(f"\n=== 特征工程总结 ===")
print(f"训练集均值 (≈0): {X_train_scaled.mean(axis=0).round(4)}")

# 10. 特征工程原则
# - 训练集 fit_transform,测试集只 transform(避免数据泄露)
# - 数值型: StandardScaler / MinMaxScaler
# - 无序类别: OneHotEncoder,有序: OrdinalEncoder
# - 特征选择可减少维度、降低过拟合

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 17:32:38

终极指南:如何使用baidu-wangpan-parse突破百度网盘限速

终极指南:如何使用baidu-wangpan-parse突破百度网盘限速 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经因为百度网盘的蜗牛下载速度而抓狂?…

作者头像 李华
网站建设 2026/5/31 17:32:35

Arduino电子沙漏:单引脚控制双LED的电路设计与编程实践

1. 项目概述与核心思路电子沙漏,一个听起来充满古典韵味与现代科技碰撞的项目。传统的沙漏依靠重力让沙粒从上瓶流向下瓶,以物理方式度量时间。而今天我们要做的,是用闪烁的LED灯珠和一块小小的Arduino开发板,来重现这一过程。这不…

作者头像 李华
网站建设 2026/5/31 17:31:05

2001-2024年供应链多元化数据+代码

数据介绍复刻《经济研究》中“企业数字化与供应链多元化:来自中国的证据”,前五大供应商采购数据,仅保留前五大供应商(Rank 1/2/3/4/5)数据完整的企业,提取每家公司每年的前五大供应商具体占比,…

作者头像 李华