如何解决ExtraTreesRegressor报错ValueError: y应为1d数组而非空维度数组
报错原因
- 核心问题出在
LabelEncoder.transform()方法的入参格式:sklearn要求该方法必须接收1维数组作为输入,你直接传入单个字符串(比如'Saturday')时,参数会被识别为0维标量,不符合输入要求,触发格式校验错误。 - 补充隐藏问题:新版sklearn已经移除了
sklearn.cross_validation模块,后续运行还会触发模块不存在的报错,需要同步做版本兼容修改。
修复方案
分两处修改代码即可:
- 替换导入模块并调整训练集拆分调用
# 把原来的from sklearn import cross_validation替换为下面的导入 from sklearn.model_selection import train_test_split # 训练集测试集拆分代码同步修改 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=5)
- 修改单条测试数据编码的else分支,把单个字符串包裹为1维列表传入
transform方法
# 测试单条数据实例的编码 test_datapoint = ['Saturday', '10:20', 'Atlanta', 'no'] test_datapoint_encoded = [-1] * len(test_datapoint) count = 0 for i, item in enumerate(test_datapoint): if item.isdigit(): test_datapoint_encoded[i] = int(test_datapoint[i]) else: # 单个字符串包裹为列表转为1维输入,transform返回数组后取第一个元素取值 test_datapoint_encoded[i] = int(label_encoder[count].transform([test_datapoint[i]])[0]) count = count + 1 test_datapoint_encoded = np.array(test_datapoint_encoded)
注意:如果测试数据里出现了训练阶段
LabelEncoder没见过的离散值,会触发新的报错,需要提前做好离散值的覆盖校验或者设置缺失值处理逻辑。
内容的提问来源于stack exchange,提问作者user16849933
相关产品推荐
相关产品推荐

