贷款状态分类训练报错:无法将NumPy数组转换为Tensor(不支持float对象类型)
报错原因
这个报错的核心是传入模型的特征字典中,存在被标记为tf.float32类型的输入列,其对应的NumPy数组实际是object dtype——数组里存储的是Python原生float对象,而非TensorFlow支持的np.float32/np.float64类型标量,无法转换为EagerTensor。
你的代码存在两个关键漏洞:
- 仅在创建Input层时根据pandas自动识别的dtype指定输入类型,没有对传入
fit的实际数据做类型对齐。 - 没有提前处理数据集里的混合类型值:从你提供的样例所属的经典贷款违约数据集来看,至少
Dependents列存在'3+'这类字符串取值,会导致整列被pandas识别为object dtype;另外数值列如果混了空字符串、异常文本值,也会被自动转成object类型,哪怕列里绝大多数是数值。
修复步骤
第一步:定位异常列
先运行以下代码,确认到底是哪一列的类型不匹配:
import numpy as np for col_name, col_data in loan_features.items(): print(f"列名:{col_name} | pandas dtype:{col_data.dtype} | numpy dtype:{col_data.values.dtype}")
输出里numpy dtype为object的列,就是问题来源。
第二步:提前清洗特征列类型
不要依赖pandas读取CSV时自动推断的dtype,手动区分分类列和数值列,统一做类型转换:
# 1. 先剔除无关列,Loan_ID是用户标识、index是行号,都不参与训练 loan_features = loan_features.drop(columns=['Loan_ID', 'index']) # 2. 手动指定特征类型 numeric_features = ['ApplicantIncome', 'CoapplicantIncome', 'LoanAmount', 'Loan_Amount_Term', 'Credit_History', 'Dependents'] categorical_features = ['Gender', 'Married', 'Education', 'Self_Employed', 'Property_Area'] # 3. 处理数值列:替换特殊值、统一转float32 # 处理Dependents列的"3+"特殊取值 loan_features['Dependents'] = loan_features['Dependents'].replace('3+', 3) for col in numeric_features: # 异常值统一转换为NaN,再强制转float32,缺失值可以后续在预处理层填充 loan_features[col] = pd.to_numeric(loan_features[col], errors='coerce').astype(np.float32) # 4. 处理分类列:缺失值填空字符串,统一转string类型 for col in categorical_features: loan_features[col] = loan_features[col].fillna('').astype(str)
第三步:构造类型对齐的输入
创建Input层和传入fit的时候,都基于你手动划分的特征类型指定dtype,不要靠自动判断:
# 重构Input层 inputs = {} for col in numeric_features: inputs[col] = tf.keras.Input(shape=(1,), name=col, dtype=tf.float32) for col in categorical_features: inputs[col] = tf.keras.Input(shape=(1,), name=col, dtype=tf.string) # 构造传入fit的特征字典,保证类型和Input层完全匹配 loan_features_dict = {name: col.values for name, col in loan_features.items()}
完成以上步骤后再调用fit就不会出现类型转换错误。
注意:如果你的预处理层里已经包含了缺失值填充、分类特征编码逻辑,不需要提前在DataFrame里做填充,只要保证列的dtype和Input层声明的一致即可。
内容的提问来源于stack exchange,提问作者oceanspray22
相关产品推荐
相关产品推荐

