如何让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
相关产品推荐
相关产品推荐

