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避坑总结
- 读数据后必须打印列名:
print(df.columns.tolist()),别猜。 - 输入函数前清理列名:
df.columns = [col.strip() for col in df.columns]。 - 特征列定义用清理后的列名,别写死
'age'。 - 如果数据来自Excel/CSV,列名常带空格,这是常态。
我踩过坑:数据列名是'age ',特征列写'age',报错整整三小时。清理列名后,训练秒过。记住:Estimator对字符串比对比你想象的严格。下次写代码,先print(df.columns),别让空格坑你。
