开发特征工程智能体时,可以先把确定的预处理任务封装成普通 Python 工具,再考虑让模型选择何时调用。工具应明确接受哪些列、只用训练样本拟合,并返回特征名称与形状。下面做一个固定输入契约的本地预览函数,不让模型自由修改列规则。
环境与运行方法
本文代码在 Windows、Python 3.11 的本地独立环境执行通过。以下数据全部为人为构造的教学样本,不是客户数据,也不是业务效果测试。

新建一个空目录,在终端执行安装命令,把后面的完整代码保存为 demo.py,再执行 python demo.py。文件输出均保存在运行目录,请先在空目录练习。
python -m pip install numpy==2.4.6 pandas==3.0.6 scikit-learn==1.9.1
把工具边界写进函数
输入只允许 age 数值列和 city 类别列,函数先核对列集合,再处理缺失和未见类别。数值列用训练集的中位数填补;城市列通过 OneHotEncoder 编码,handle_unknown=ignore 使未见类别变成全零类别块。
工具输出只报告行数、特征名和一条教学变换结果,没有接触目标标签或执行模型训练。schema、允许列和输出格式保持固定,可作为智能体工具调用的前置契约;本文没有搭建完整智能体或运行远端模型。
输出检查比“工具调用成功”更具体
ColumnTransformer 分别选择两列,remainder=drop 不把额外原始列直接带入结果。即便如此,函数仍先拒绝额外列,防止误把标签或标识字段悄悄忽略后假装输入正确。
真实工具还应限制数据大小、核对权限、记录拟合材料和预处理版本。不要让模型在预测请求中重新拟合编码器;应复用训练期的同一对象,正式输出矩阵与字段顺序也要保存。
可复制的完整代码
import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
def prepare_feature_preview(train, query):
allowed = {"age", "city"}
if set(train.columns) != allowed or set(query.columns) != allowed:
raise ValueError("columns_must_be_age_and_city")
processor = ColumnTransformer([
("num", SimpleImputer(strategy="median"), ["age"]),
("cat", OneHotEncoder(handle_unknown="ignore", sparse_output=False), ["city"])
], remainder="drop")
processor.fit(train)
transformed = processor.transform(query)
return {"rows": len(query), "feature_names": processor.get_feature_names_out().tolist(),
"values": transformed.tolist()}
train = pd.DataFrame({"age": [20., 30., np.nan], "city": ["A", "B", "A"]})
query = pd.DataFrame({"age": [np.nan], "city": ["C"]})
result = prepare_feature_preview(train, query)
print(result)
assert result["values"] == [[25., 0., 0.]]
try:
prepare_feature_preview(train, query.assign(label=1))
except ValueError as exc:
print("extra_column_rejected", str(exc))
else:
raise AssertionError("unexpected extra column accepted")
运行结果与核对方法
下面是本文教学代码在上述本地环境中的实际输出。浮点数末位可能随依赖版本变化。
{'rows': 1, 'feature_names': ['num__age', 'cat__city_A', 'cat__city_B'], 'values': [[25.0, 0.0, 0.0]]}
extra_column_rejected columns_must_be_age_and_city
核对 values 为 [[25.0,0.0,0.0]]:年龄来自训练集20和30的中位数,未见城市C的类别块为零。feature_names 与三列顺序一致,添加 label 的请求明确被拒绝。先让这种本地工具通过契约检查,再设计智能体调用与结果回填。
使用边界与常见问题
本例只有三条教学训练记录和一条查询,只实现受限特征预览,没有运行智能体。缺失城市、数值错类型和规模控制还需要扩展验证,不能把它当作任意表格的通用特征工程服务。
未见城市编码成全零是不是说明没有城市?
不是。它表示该类别没有进入训练词表,可能与缺失含义混淆。真实任务应另设未知类别指示或监测规则,并评估对预测的影响。
官方资料
接口与参数依据以下官方资料核对(2026年10月1日)。示例验证只覆盖本文输入和步骤。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30773.html