神经网络训练中Label Encoding索引错误及数据类型问题求助
解决分类特征编码时的索引错误与类型不兼容问题
错误原因分析
- 索引错误:你通过
.values把X转换成了numpy数组,而numpy数组不支持像DataFrame那样用列名(X['Test'])访问元素,只能使用整数索引、切片等,这直接导致了第一个报错。 - 类型不兼容错误:
Marsh列同时存在float、int、str三种数据类型,而LabelEncoder要求输入必须是统一的字符串或数值类型,混合类型触发了第二个报错。
修正方案与代码
先保留X的DataFrame格式(不要过早转numpy数组),方便按列名处理分类特征;同时统一混合类型列的格式,再进行编码:
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, KFold from sklearn.preprocessing import StandardScaler, LabelEncoder from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam from sklearn.metrics import r2_score # 加载数据集 data = pd.read_excel('Teste JMP.xlsx') # 保留X为DataFrame格式,方便按列名操作分类特征 X = data.drop(['Brookfield', 'Marsh'], axis=1) y = data[['Brookfield', 'Marsh']].values # 初始化编码器 label_encoder = LabelEncoder() # 处理Test列:先转字符串确保类型统一,再编码 X['Test'] = label_encoder.fit_transform(X['Test'].astype(str)) # 处理Measurement Stage列(如果该列也是分类特征) if 'Measurement Stage' in X.columns: X['Measurement Stage'] = label_encoder.fit_transform(X['Measurement Stage'].astype(str)) # 若需要处理Marsh列(比如作为分类目标):先统一类型再编码 # marsh_encoder = LabelEncoder() # data['Marsh'] = marsh_encoder.fit_transform(data['Marsh'].astype(str)) # 处理后需重新分割X和y(如果Marsh是输入特征) # 最后将X转为numpy数组,供后续模型训练使用 X = X.values # 后续可继续编写数据集拆分、标准化、模型构建等代码
额外说明
- 不要过早将DataFrame转为numpy数组,保留DataFrame格式能更便捷地处理列级操作(比如筛选分类列、处理缺失值等)。
- 对于混合类型的列,通过
.astype(str)统一转为字符串是最稳妥的方式,避免类型冲突;如果是数值型列存在异常字符串,可先清理这些异常值(比如替换为NaN后填充)再处理。 - 若
Marsh是回归任务的目标变量,不能用LabelEncoder,需先清理其中的非数值内容,确保列是纯数值类型。
内容的提问来源于stack exchange,提问作者Leonor Magalhães
相关产品推荐
相关产品推荐

