TensorFlow Estimator训练报错怎么办?教你一招避坑

TensorFlow Estimator训练报错怎么办?教你一招避坑
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

特征列没对齐?TensorFlow Estimator训练报错实录,一招解救

目录

今天写了个Estimator模型,训练跑起来直接报错:

ValueError: Feature 'age' not found in input data

我当场就懵了。数据里age列明明有值,pandas一查全是数字。折腾到凌晨三点,才发现是特征列和输入数据的键名对不上。

报错现场
控制台甩出这个错误,我反复检查数据:

df=pd.read_csv('data.csv')print(df.columns)# 输出 ['age ', 'income', 'label'] # 注意age后面有空格!

列名明明有空格,但特征列定义写的是'age'。Estimator在内部匹配时,严格按字符串比对。空格都算不同。

核心根源
特征列定义的列名必须和输入函数返回的特征字典键名完全一致(包括空格和大小写)。我犯的错是:

  • 数据列名实际是'age '(末尾空格)
  • 但特征列写成tf.feature_column.numeric_column('age')
  • 输入函数返回的特征字典键是'age ',Estimator却去匹配'age',自然找不到。

错误示范

# 错误示范:特征列和数据列名不一致feature_columns=[tf.feature_column.numeric_column('age'),# 期望'age',但数据是'age 'tf.feature_column.numeric_column('income')]definput_fn():df=pd.read_csv('data.csv')# 数据列名有空格,但这里直接用'age',键名实际是'age 'features=df[['age']]# 返回的特征字典键是'age '(带空格)labels=df['label']returnfeatures,labels

正确姿势

# 正确姿势:先清理列名,确保和特征列一致feature_columns=[tf.feature_column.numeric_column('age'),# 和清理后的列名匹配tf.feature_column.numeric_column('income')]definput_fn():df=pd.read_csv('data.csv')# 关键:清理列名!移除所有前后空格df.columns=[col.strip()forcolindf.columns]features=df[['age','income']]# 现在键名是'age'(无空格)labels=df['label']returnfeatures,labels

避坑总结

  1. 读数据后必须打印列名print(df.columns.tolist()),别猜。
  2. 输入函数前清理列名df.columns = [col.strip() for col in df.columns]
  3. 特征列定义用清理后的列名,别写死'age'
  4. 如果数据来自Excel/CSV,列名常带空格,这是常态。

我踩过坑:数据列名是'age ',特征列写'age',报错整整三小时。清理列名后,训练秒过。记住:Estimator对字符串比对比你想象的严格。下次写代码,先print(df.columns),别让空格坑你。