Python实现自定义梯度下降回归器触发ValueError如何解决
错误原因
- 核心是维度不匹配:你提取标签时使用了双中括号
y = df[["Outcome"]],得到的是形状为(样本总数, 1)的二维DataFrame;而计算得到的y_hat是np.dot(x_train, self.coef_)输出的形状为(537,)的一维数组,二者做减法运算时pandas无法对齐维度,触发强制转换报错。 - 补充说明:sklearn官方的LinearRegression内部做了维度适配,所以调用官方类训练不会触发错误,自定义类没有做兼容处理才会出现该问题。
解决方案
两种方案任选其一即可:
- 调整标签提取方式,直接输出一维Series:
将代码中y = df[["Outcome"]]替换为y = df["Outcome"],单中括号提取单列会得到一维结构,和y_hat的维度完全匹配。 - 在自定义GDRegressor类的fit方法中对输入标签做降维处理:
在fit函数开头新增一行代码,把二维结构的y_train拉平为一维数组:
def fit(self, x_train, y_train): # 新增下行,把DataFrame格式的y_train转成一维numpy数组 y_train = y_train.values.ravel() self.intercept_ = 0 self.coef_ = np.ones(x_train.shape[1]) # 剩余原有代码保持不变
优化建议
梯度下降对特征尺度非常敏感,建议在拆分数据集后对特征做标准化处理再训练,避免因特征尺度过大导致模型不收敛:
scaler = StandardScaler() x_train = scaler.fit_transform(x_train) x_test = scaler.transform(x_test)
内容的提问来源于stack exchange,提问作者Prabhupada Jena
相关产品推荐
相关产品推荐

