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

如何让Python LightGBM代码支持列表输入?遇数据类型错误求助

解决LightGBM中"ValueError: Series.dtypes must be int, float or bool"问题并支持列表输入

嘿,这个问题我之前踩过坑,本质原因很明确:LightGBM对目标标签的类型有严格要求,必须是int、float或bool,而你的代码里Y=heart['sex']大概率是字符串或者object类型的Series,另外你提到的列表输入需求,也可以通过类型转换来搞定。咱们一步步来解决:

一、错误根源分析

你自己实现的load_csv函数,读取出来的所有列都是字符串类型——因为从文件里split出来的每一项都是str,所以heart['sex']自然是object/str类型的Series,LightGBM根本不认这种类型当标签,才抛出了这个错误。

二、解决方案

1. 先把目标列转成数值类型

这里有两种方式,选哪种都可以:

方式一:改进load_csv函数,自动转换数值类型

修改你的读取函数,让它自动尝试把非表头的内容转成数值(能转的转,不能转的保留原字符串):

def load_csv(filepath):
    data = []
    col = []
    checkcol = False
    with open(filepath) as f:
        for val in f.readlines():
            val = val.replace("\n","").split(',')
            if not checkcol:
                col = val
                checkcol = True
            else:
                # 尝试转换每个元素为数值,失败则保留原字符串
                converted_val = []
                for item in val:
                    try:
                        # 区分整数和浮点数
                        converted_val.append(float(item) if '.' in item else int(item))
                    except ValueError:
                        converted_val.append(item)
                data.append(converted_val)
    df = pd.DataFrame(data=data, columns=col)
    return df

这样读取出来的heart['sex']会自动变成int类型,后续就不会报错了。

方式二:读取后手动转换目标列

如果不想改读取函数,就在读取数据后单独把sex列转成数值类型:

heart=load_csv(r'C:\Users\PC\Documents\Essay\heart.csv')
# 把sex列强制转换为整数类型(如果是0/1这种二元标签,int最合适)
heart['sex'] = heart['sex'].astype(int)
Y=heart['sex']

要是转换时遇到异常值(比如非数字的字符串),可以用pd.to_numeric处理:

# 把无法转换的值设为NaN,之后可以选择填充或删除
heart['sex'] = pd.to_numeric(heart['sex'], errors='coerce')
# 删除包含缺失值的行
heart.dropna(subset=['sex'], inplace=True)
Y=heart['sex']

2. 支持列表输入的处理

如果你想把Y作为列表传入LightGBM,只要确保列表里的元素是数值类型就行:

# 方式1:从Series转成数值列表
Y_list = heart['sex'].astype(int).tolist()
# 方式2:如果是原始字符串列表,手动转换
Y_list = [int(item) for item in heart['sex'].tolist()]

# 拆分数据集时用列表
X_train,X_test,y_train,y_test=train_test_split(X,Y_list,test_size=0.3,random_state=0)
# 构建LightGBM数据集时直接传入列表
d_train=lgb.Dataset(X_train, label=y_train)

三、额外检查小技巧

可以先打印目标变量的类型,确认转换是否成功:

# 检查Series的类型
print(Y.dtype)
# 检查单个元素的类型
print(type(Y.iloc[0]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:52:55