2、数值列:tf.feature_column.numeric_column详解、默认值设置、数据类型转换
好,咱们正式开始讲特征列。第一个要啃的,就是最基础也最常用的——numeric_column。
说白了,数值列就是处理数字的。你想想看,结构化数据里,年龄、价格、温度、点击次数……哪个不是数字?所以这个函数,你几乎每个模型都会用到。
2.1 基本用法:从零开始
先看一个最简单的例子。假设你有一个特征叫 age,类型是整数。
import tensorflow as tf
# 定义一个数值列
age_column = tf.feature_column.numeric_column(key='age')
# 模拟输入数据
input_data = {'age': [25, 30, 22, 40]}
# 转换成张量
tensor = age_column._transform_features(input_data)
print(tensor)
输出结果就是一个张量,形状是 (4,),值就是 [25, 30, 22, 40]。嗯,就是这么简单。
但别急,实际项目中可没这么顺利。我记得有一次,客户给的数据里,年龄字段居然混进了字符串,比如 "25岁"、"三十"。这时候直接喂给模型,肯定报错。
2.2 默认值设置:处理缺失数据
真实数据里,缺失值太常见了。比如用户没填年龄,或者传感器某时刻没采集到温度。这时候 default_value 就派上用场了。
核心参数:
default_value 用于指定当输入数据缺失时,用什么值来填充。
# 设置默认值为 -1
age_column = tf.feature_column.numeric_column(
key='age',
default_value=-1
)
# 模拟缺失数据(用 None 表示)
input_data = {'age': [25, None, 22, 40]}
tensor = age_column._transform_features(input_data)
print(tensor)
# 输出: [25, -1, 22, 40]
看到没?None 被替换成了 -1。我个人习惯用 -1 或 0 作为默认值,但具体用哪个,得看业务场景。
注意:千万别随便用 0 当默认值!比如温度特征,0 度是有效值。你把它当缺失值填充,模型会学出错误规律。我曾经就踩过这个坑,模型预测结果总是偏低,排查了半天才发现是默认值设错了。
2.3 数据类型转换:让 TensorFlow 听懂你的数据
TensorFlow 内部对数据类型要求很严格。你给的数据是 int,它可能期望 float。这时候 dtype 参数就很重要了。
# 明确指定数据类型为 float32
price_column = tf.feature_column.numeric_column(
key='price',
dtype=tf.float32
)
# 输入整数也没关系,会自动转换
input_data = {'price': [100, 200, 150]}
tensor = price_column._transform_features(input_data)
print(tensor.dtype) # 输出: <dtype: 'float32'>
为什么会这样?因为 TensorFlow 的模型计算,大部分操作都基于浮点数。你给整数,它内部也会转成 float。但如果你不指定 dtype,它默认是 tf.float32。
小技巧:如果你的数据是整数标签(比如分类任务的 ID),记得用
tf.int64。我一般这样写:dtype=tf.int64。避免不必要的类型转换,能省点内存。
2.4 实战中的常见坑
我总结几个实际项目中容易翻车的地方,你记一下:
- 数据形状不匹配:如果你的输入是二维数组(比如
[[1,2], [3,4]]),但numeric_column默认期望一维。这时候需要设置shape参数。 - 缺失值处理不当:别用
np.nan直接喂,TensorFlow 不认识它。要么用default_value,要么预处理时填充好。 - 类型混淆:字符串数字(如
"123")不会自动转换。你得先预处理成数值类型。
# 处理二维特征的例子
embedding_column = tf.feature_column.numeric_column(
key='coordinates',
shape=(2,) # 每个样本有两个值
)
input_data = {'coordinates': [[1.0, 2.0], [3.0, 4.0]]}
tensor = embedding_column._transform_features(input_data)
print(tensor.shape) # 输出: (2, 2)
2.5 总结一下
numeric_column 虽然基础,但用好了能省很多事。记住三点:
- 默认值要选对,别让模型学到错误规律。
- 数据类型要明确,尤其是整数和浮点数的区别。
- 形状要匹配,多维数据记得设
shape。
嗯,这一节就到这。下一节咱们聊 bucketized_column,把连续值变成离散区间,很有意思。