You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

贷款状态分类训练报错:无法将NumPy数组转换为Tensor(不支持float对象类型)

报错原因

这个报错的核心是传入模型的特征字典中,存在被标记为tf.float32类型的输入列,其对应的NumPy数组实际是object dtype——数组里存储的是Python原生float对象,而非TensorFlow支持的np.float32/np.float64类型标量,无法转换为EagerTensor。

你的代码存在两个关键漏洞:

  1. 仅在创建Input层时根据pandas自动识别的dtype指定输入类型,没有对传入fit的实际数据做类型对齐。
  2. 没有提前处理数据集里的混合类型值:从你提供的样例所属的经典贷款违约数据集来看,至少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:27:28