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。我个人习惯用 -10 作为默认值,但具体用哪个,得看业务场景。

注意:千万别随便用 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 虽然基础,但用好了能省很多事。记住三点:

  1. 默认值要选对,别让模型学到错误规律。
  2. 数据类型要明确,尤其是整数和浮点数的区别。
  3. 形状要匹配,多维数据记得设 shape

嗯,这一节就到这。下一节咱们聊 bucketized_column,把连续值变成离散区间,很有意思。