使用Python中随机梯度下降的岭回归

时间:2017-04-27 04:57:31

标签: python optimization machine-learning linear-regression gradient-descent

我正在尝试使用随机梯度下降作为求解器在Python中实现Ridge回归的解决方案。我的SGD代码如下:

def fit(self, X, Y):
    # Convert to data frame in case X is numpy matrix
    X = pd.DataFrame(X)

    # Define a function to calculate the error given a weight vector beta and a training example xi, yi

    # Prepend a column of 1s to the data for the intercept
    X.insert(0, 'intercept', np.array([1.0]*X.shape[0]))

    # Find dimensions of train
    m, d = X.shape

    # Initialize weights to random
    beta = self.initializeRandomWeights(d)
    beta_prev = None

    epochs = 0
    prev_error = None
    while (beta_prev is None or epochs < self.nb_epochs):
        print("## Epoch: " + str(epochs))
        indices = range(0, m)
        shuffle(indices)
        for i in indices:   # Pick a training example from a randomly shuffled set
            beta_prev = beta
            xi = X.iloc[i]
            errori = sum(beta*xi) - Y[i]    # Error[i] = sum(beta*x) - y = error of ith training example
            gradient_vector = xi*errori + self.l*beta_prev
            beta = beta_prev - self.alpha*gradient_vector
        epochs += 1

我正在测试的数据没有标准化,我的实现总是以所有权重为无穷大结束,即使我将权重向量初始化为低值。只有当我将学习率alpha设置为非常小的值~1e-8时,算法才会得到权重向量的有效值。

我的理解是,规范化/缩放输入功能仅有助于缩短收敛时间。但是如果特征没有标准化,算法不应该整体收敛。我的理解是否正确?

2 个答案:

答案 0 :(得分:1)

您可以从scikit-learn's Stochastic Gradient Descent文档中查看该算法的一个缺点是它对特征缩放敏感。通常,基于梯度的优化算法在标准化数据上收敛得更快。

此外,归一化对于回归方法是有利的。

每个步骤中系数的更新将取决于每个特征的范围。此外,正则化项将受到大特征值的严重影响。

SGD 可能在没有数据规范化的情况下收敛,但这对于手头的数据是主观的。因此,您的假设是不正确的。

答案 1 :(得分:0)

你的假设不正确。

很难回答这个问题,因为有很多不同的方法/环境,但我会尝试提一些观点。

正常​​化

  • 当某些方法不是规模不变的时候(我认为每个线性回归都没有)你真的应该规范化你的数据
    • 我认为你因为调试/分析而忽略了这一点
  • 规范化数据不仅与收敛时间相关,结果也会有所不同(想想损失函数中的效果;大值可能会对小数据造成更多损失)!

收敛

  • 关于规范化/非规范化数据的许多方法的收敛可能有很多要说明,但你的情况很特殊:
    • SGD的收敛理论只保证收敛到一些局部最小值(=凸 - 选择问题中的全局最小值),用于某些超参数选择(学习率和学习时间表/衰减)
    • 当这些参数不好时,甚至优化规范化数据也会因SGD而失败!
      • 这是SGD最重要的缺点之一;对超参数的依赖
    • 由于SGD基于渐变和步长,非标准化数据可能对未实现这种收敛产生巨大影响!