Sklearn PLSRegression X矩阵含二进制列时predict预测失败问题
问题原因
这个报错和二进制变量没有任何关联,完全是调用PLSRegression的fit()方法时参数顺序写反导致的调用错误。
sklearn所有有监督学习模型的fit()方法的参数顺序统一为fit(特征矩阵X, 标签矩阵y),你的代码中写的是pls_reg.fit(y_test, X_test),相当于把原本的标签矩阵y_test当成了输入特征喂给模型,把原本的特征矩阵X_test当成了要预测的目标标签,整个建模逻辑完全颠倒。
报错触发逻辑
- 示例1中你
fit时传入的“输入特征”是形状为(10,3)的y_test,所以模型默认输入特征维度为3,内部存储的均值_x_mean、标准差_x_std都是长度为3的数组。你predict时传入的是加了二进制列的X_test,形状为(10,4),归一化计算时4列的矩阵无法和长度为3的均值做广播运算,直接触发维度不匹配报错。 - 示例2中你
predict时传入的是X_test的前3列,刚好和模型“记住”的输入维度3匹配,所以没有触发维度错误,但这个拟合结果本身是完全错误的,本质是在用原本的标签预测原本的特征,没有任何实际意义。
解决方法
把fit方法的参数顺序调整为正确的“先特征后标签”即可,包含二进制列的特征矩阵也可以正常运行:
pls_reg = PLSRegression(n_components = 2) # 正确参数顺序:fit(特征X, 标签y) pls_reg.fit(X_test, y_test) pls_reg.predict(X_test)
补充说明
PLS回归本身没有限制输入特征不能包含二进制变量,你碰到的问题属于API调用失误,和算法本身、sklearn的实现都没有关系。
内容的提问来源于stack exchange,提问作者Glen Moutrie
相关产品推荐
相关产品推荐

