Рубрики
Без рубрики

MLS.1.B Градиентный спуск в линейной регрессии

Градиентный спуск в линейной регрессионной градиентном спуске – это первая оптимизация оптимизации … Помечено с градиентным спуском, Python, линейной регрессией, машинным обучением.

Градиентный спуск – это первый алгоритм оптимизации порядка, чтобы найти минимум функции. Он находит минимум (локальный) функции, двигаясь по направлению крутого спуска (вниз). Это помогает нам обновить параметры модели (веса и смещения) более точно.

Чтобы добраться до местных минимумов, мы не можем просто перейти прямо к точке (на графическом участке). Нам нужно спуститься в меньшие шаги и проверять минимумы и сделать еще один шаг к направлению спуска, пока мы не получим нашего желаемого местного минимума.

Небольшие шаги, упомянутые выше, называются как скорость обучения. Если скорость обучения очень маленькая, точность больше, но очень много времени. И большая ставка обучения может привести нас к минимальному (превышению). Теория состоит в том, чтобы использовать скорость обучения при более высокой скорости, пока наклон кривой не начнет уменьшать рекламу, как только он начнет уменьшаться, мы начинаем использовать меньшие скорости обучения (меньше времени и более точностей).

Функция затрат помогает нам оценить, насколько хороша наша модель функционирует или прогнозирует. Его Функция потери Отказ У него есть своя кривая и параметры (веса и смещение). Наклон кривой помогает нам соответственно обновлять наши параметры. Чем меньше стоит больше прогнозируемой вероятности.

На этапе обучения мы находим значение y_train, чтобы найти, сколько стоит отклонение от данного вывода. Затем мы рассчитаем ошибку затрат на данной второй фазе, используя формулу ошибки затрат.

стоимость = (1/N) * Σ (y i – Y_TRAIN) 2 {я от 1 до n}

for i in range(n_iters):
    #Training phase 
    y_train = np.dot(X, self.weights) + self.bias

    #Cost error calculating Phase
    cost = (1 / n_samples) * np.sum((y_train - y)**2)
    costs.append(cost) 

Теперь мы обновляем веса и смещение, чтобы уменьшить нашу ошибку, делая

    #Updating the weight and bias derivatives
    Delta_w = (2 / n_samples) * np.dot(X.T, (y_hat - y))
    Delta_b = (2 / n_samples) * np.sum((y_hat - y)) 

    #Updating weights
    self.weights = self.weights - learn_rate * Delta_w
    self.bias = self.bias - learn_rate * Delta_b

    # end of loop

А также Функция затрат на поговорку против итераций

Стоимость против итераций

Вышеведено приведенное выше кривая функции стоимости против количества итераций. В качестве количества итераций увеличивается (шаги) Стоимость снизилась, что значительно означает минимум близко и почти становится ноль. Мы делаем вышеупомянутые обновления, пока ошибка не станет незначительный или минимум достигнут.

Исходный код с нуля

class LinearModel:
    """
    Linear Regression Model Class
    """
    def __init__(self):
        pass

    def gradient_descent(self, X, y, learn_rate=0.01, n_iters=100):
        """
        Trains a linear regression model using gradient descent
        """
        n_samples, n_features = X.shape
        self.weights = np.zeros(shape=(n_features,1))
        self.bias = 0
        self.prev_weights = []
        self.prev_bias = []
        self.X = X
        self.y = y
        costs = []

        for i in range(n_iters):
            """"
            Training Phase
            """
            y_hat = np.dot(X, self.weights) + self.bias
            """
            Cost error Phase
            """
            cost = (1 / n_samples) * np.sum((y_hat - y)**2)
            costs.append(cost)
            """
            Verbose: Description of cost at each iteration
            """
            if i % 200 == 0:
                print("Cost at iteration {0}: {1}".format(i,cost))
            """
            Updating the derivative
            """
            Delta_w = (2 / n_samples) * np.dot(X.T, (y_hat - y))
            Delta_b = (2 / n_samples) * np.sum((y_hat - y)) 

            """"
            Updating weights and bias
            """
            self.weights = self.weights - learn_rate * Delta_w
            self.bias = self.bias - learn_rate * Delta_b

            """
            Save the weights for visualisation
            """
            self.prev_weights.append(self.weights)
            self.prev_bias.append(self.bias)

        return self.weights, self.bias, costs

    def predict(self, X):
        """
        Predicting the values by using Linear Model
        """
        return np.dot(X, self.weights) + self.bias
# We have created our Linear Model class. Now we need to create and load our model.
model = LinearModel()

w_trained, b_trained, costs = model.gradient_descent(X_train, y_train, learn_rate=0.005, n_iters=1000)

    def visualize_training(self):
        """
        Visualizing the line against the dataset        
        """

        self.prev_weights = np.array(self.prev_weights)

        x = self.X[:, 0]
        line, = ax.plot(x, x, color='red')
        ax.scatter(x, self.y)


        def animate(line_data):
            m, c = line_data
            line.set_ydata(m*x + c)  # update the data
            return line,

        def init():
            return line,

        def get_next_weight_and_bias():
            for i in range(len(self.prev_weights)):
                yield self.prev_weights[i][0], self.prev_bias[i]

        return animation.FuncAnimation(fig, animate, get_next_weight_and_bias, init_func=init,interval=35, blit=True)

# Visualization of training phase to get the best fit line
fig, ax = plt.subplots()
ani = model.visualize_training()
plt.show()

# Prediction Phase to test our model  
n_samples, _= X_train.shape
n_samples_test, _ = X_test.shape

y_p_train = model.predict(X_train)
y_p_test = model.predict(X_test)

error_train =  (1 / n_samples) * np.sum((y_p_train - y_train) ** 2)
error_test  =  (1 / n_samples_test) * np.sum((y_p_test - y_test) ** 2)

print("Error on training set: {}".format(np.round(error_train, 6)))
print("Error on test set: {}".format(np.round(error_test, 6)))

# Plotting predicted best fit line
fig = plt.figure(figsize=(8,6))
plt.scatter(X_train, y_train)
plt.scatter(X_test, y_p_test)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Проверьте полный исходный код для Градиентный спуск на Github а также проверьте другие подходы в Линейная регрессия на ML-царапин

Вкладчик

Эта серия сделана возможным благодаря помощи:

  • PraNav ( @devarakondapranav )
  • ОЗУ ( @ r0mflip )
  • Девика ( @ devikamadupu1 )
  • Пратюша ( @Prathyushakallepu )
  • Pranay ( @ Pranay9866 )
  • Subhasri ( @subhasrir )
  • Laxman ( @lmn )
  • Вайшнави ( @Vaishnavipulluri )
  • Сурай ( @ Suraj47 )

Оригинал: “https://dev.to/ml_scratch/mls-1-b-gradient-descent-in-linear-regression-53dl”