Причина схождения градиентного спуска со стандартным скейлером - PullRequest
0 голосов
/ 06 мая 2019

У меня есть два запроса

Будет ли интерпретация коэффициентов одинаковой до и после скалярного стандартного скейлера StandardScaler ()

Как все меняется после использования стандартного скейлера, что градиентный спуск иРезультирующие коэффициенты sklearn одинаковы.

Стандартный скейлер преобразует данные в среднее значение нуля и единичной дисперсии

В приведенном ниже коде показан пример

Перед применением стандартного спейсера с градиентным спуском иСклеарн давали разные коэффициенты, так как градиентный спуск застревал в локальных минимумах, но после применения стандартного скейлера оба сходились к одним и тем же коэффициентам

РЕАЛИЗАЦИЯ КОДА:

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

IV1 = np.array([63 , 64, 66, 69, 69, 71, 71, 72, 73, 75])
DV = np.array([127,121,142,157,162,156,169,165,181,208])

X = IV1[:,np.newaxis]
Y = DV[:,np.newaxis]

def compute_gradient(m ,b ,IV, DV, cost):

    gradient_b = 0
    gradient_m = 0
    for i in range (data_size):
    x = IV[i]
    y = DV[i]
    gradient_b += (-2/data_size) * (y - (m * x + b))
    gradient_m += (-2/data_size) * x * (y- (m * x + b))

    new_m = m - (gradient_m * learning_rate)
    new_b = b - (gradient_b * learning_rate)

    gradient_m = -gradient_m
    cost.append (gradient_m)

    return (new_m,new_b)




data_size = X.size

iterations = 10000
initial_b  = 0 
initial_m  = 0
learning_rate = 0.0001


m = initial_m
b = initial_b
cost = []

for i in range (iterations):
    [m,b] = compute_gradient(m ,b , IV1, DV, cost) 

print ("*******************************") 
print (" Gradient Descent")   
print ("iteration {} m {} b {}".format(i, m, b))
print ("******************************* \n")


lm = LinearRegression()
lm.fit(X,Y)

print ("*******************************")
print ("From Sklearn")
print ("Coeff {}".format(lm.coef_)) 
print ("Intercept {}".format(lm.intercept_)) 
print ("******************************* \n")


iterations = 10000
initial_b  = 0 
initial_m  = 0
learning_rate = 0.001

sc_x = StandardScaler()
sc_y = StandardScaler()
X_std = sc_x.fit_transform(X)
#y_std = sc_y.fit_transform(Y)
y_std = Y

m = initial_m
b = initial_b
cost = []

for i in range (iterations):
    [m,b] = compute_gradient(m ,b , X_std, y_std, cost) 

print ("*******************************") 
print (" Gradient Descent after standardization")       
print ("iteration {} m {} b {}".format(i, m, b))
print ("******************************* \n")


lm = LinearRegression()
lm.fit(X_std,y_std)

print ("*******************************")
print ("From Sklearn")
print ("Coeff {}".format(lm.coef_)) 
print ("Intercept {}".format(lm.intercept_))
print ("*******************************") 

РЕЗУЛЬТАТ:

*******************************
 Gradient Descent
iteration 9999 m 2.323963705514206 b -1.490870527668376
******************************* 

*******************************
From Sklearn
Coeff [[6.13758146]]
Intercept [-266.53439537]
******************************* 

*******************************
Gradient Descent after standardization
iteration 9999 m [22.80836256] b [158.79999968]
******************************* 

*******************************
From Sklearn
Coeff [[22.80836261]]
Intercept [158.8]
*******************************
...