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

使用ID3算法构建决策树时遇float与str比较的TypeError

解决ID3算法中float与str比较的TypeError问题

问题根源

报错TypeError: '<' not supported between instances of 'float' and 'str'的核心原因:

  • 你的数据集包含数值型特征(mileage、engine size、year),但ID3算法默认只处理离散分类特征,代码未做适配
  • 第7个特征year大概率存在混合数据类型(比如部分值是整数、部分是字符串格式的数字),或者代码对数值特征的处理逻辑错误,导致不同类型的值被直接比较

修复步骤

1. 统一所有特征的数据类型

先校验并转换数值特征的类型,确保无混合类型:

import pandas as pd

# 假设数据集存储在df中
# 转换year为整数,转换失败的行直接丢弃
df['year'] = pd.to_numeric(df['year'], errors='coerce')
df = df.dropna(subset=['year'])
# 对其他数值特征做同样处理
df['mileage'] = pd.to_numeric(df['mileage'], errors='coerce')
df['engine size'] = pd.to_numeric(df['engine size'], errors='coerce')
df = df.dropna()

2. 为数值特征添加离散化逻辑

ID3不支持连续数值特征,需将其转为离散分类:

def discretize_feature(data, feature):
    # 用中位数作为划分阈值,将数值分为两类
    threshold = data[feature].median()
    data[feature] = data[feature].apply(lambda x: f'≤{threshold}' if x <= threshold else f'>{threshold}')
    return data

# 对所有数值特征执行离散化
numeric_features = ['mileage', 'engine size', 'year']
for feat in numeric_features:
    df = discretize_feature(df, feat)

3. 检查特征处理逻辑的类型判断

在计算信息增益的代码中,添加类型校验,避免混合类型进入计算:

def calc_info_gain(data, feature, target_col):
    # 检查当前特征是否存在混合类型
    value_types = set(type(val) for val in data[feature])
    if len(value_types) > 1:
        raise ValueError(f"特征 {feature} 存在混合数据类型,请先处理")
    # 后续信息增益计算逻辑...

重点排查点

因为错误在处理第7个特征(year)后触发,优先检查:

  • year列是否存在类似"2020"(字符串)和2021(整数)并存的情况
  • 代码中处理year特征时,是否有直接将数值与字符串做比较的逻辑

内容的提问来源于stack exchange,提问作者Frank Russo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:20:40