Kaggle汽车价格预测实操:TensorFlow转换NumPy数组报不支持int类型错误
汽车价格预测TensorFlow建模报错解决方案
报错核心原因
运行代码时触发Failed to convert a NumPy array to a Tensor (Unsupported object type int),本质是传入模型的特征NumPy数组为混合object类型,无法直接被TensorFlow转换为可计算张量。
代码问题定位
- 缺失分类特征数值化预处理:所用的汽车价格数据集中包含
CarName、fueltype、carbody等多列字符串类分类特征,代码未对这些字段做任何数值编码,就直接通过.values将整表转为NumPy数组,最终得到的数组dtype为object,即便数组内的数值列存储的是整数,也无法通过TensorFlow的类型校验 - 模型输入维度硬编码错误:代码中固定设置
input_shape=(25,),对应未处理的原始特征列数,既没有考虑分类特征编码后的维度变化,也因数组混合类型问题,在维度校验阶段就会连带触发类型转换报错
分步修复方案
- 完成所有分类特征的数值转换:通过独热编码、整数映射等方式,将所有字符串特征转为可参与计算的数值列,消除特征中的object类型字段
- NumPy数组转换时显式指定TensorFlow兼容的np.float32类型,从根源上避免混合类型问题
- 取消硬编码的输入维度设置,根据实际处理完成的特征列数动态指定模型输入形状
修复参考代码
import numpy as np import pandas as pd from tensorflow.keras import layers,models # 读取本地存储的数据集 cars_data=pd.read_csv('/content/CarPrice_Assignment.csv') # 对所有字符串分类特征做独热编码 categorical_cols = ['CarName', 'fueltype', 'aspiration', 'doornumber', 'carbody', 'drivewheel', 'enginelocation', 'enginetype', 'cylindernumber', 'fuelsystem'] cars_data = pd.get_dummies(cars_data, columns=categorical_cols) # 拆分训练、测试、验证集,显式指定float32类型 train_data = cars_data.iloc[:103].drop('price', axis=1).values.astype(np.float32) train_targets = cars_data.price.iloc[:103].values.astype(np.float32) test_data = cars_data.iloc[103:165].drop('price', axis=1).values.astype(np.float32) test_targets = cars_data.price.iloc[103:165].values.astype(np.float32) val_data = cars_data.iloc[165:].drop('price', axis=1).values.astype(np.float32) val_targets = cars_data.price.iloc[165:].values.astype(np.float32) # 动态读取特征维度,避免硬编码错误 model=models.Sequential() model.add(layers.Dense(10,activation='relu',input_shape=(train_data.shape[1],))) model.add(layers.Dense(8,activation='relu')) model.add(layers.Dense(6,activation='relu')) model.add(layers.Dense(1)) model.compile(optimizer='rmsprop',loss='mse',metrics=['mae']) model.fit(train_data,train_targets,epochs=20,batch_size=1)
实操避坑提示
- 不要直接将包含字符串列的DataFrame传入TensorFlow模型,这类数据转出的NumPy数组默认是object类型,必然触发张量转换报错
- 所有传入模型的特征、标签数组,统一转换为np.float32类型,和TensorFlow的默认张量类型对齐,减少不必要的类型转换报错
- 模型输入维度不要硬编码,直接从训练特征数组的shape中读取,适配不同阶段特征工程调整后的列数变化
内容的提问来源于stack exchange,提问作者Waqar Gul
相关产品推荐
相关产品推荐

