본문 바로가기
Programming/Python

[ML] Gradient Descent(경사하강법)

회귀식에서 minimum coefficent를 찾는 알고리즘

 

ex) min(expenditure function) 기울기 지점 찾기

 

최소값 도달할 때 까지 임의 점 기울기 계속 재가면서 반복

 

 

그러나 기울기가 0인 지점이 여러 개(local minimum)인

다항함수의 경우, 오류가 생긴다는 문제점 有

 

 

 

 

Epoch: 훈련 데이터 셋 학습 횟수. (너무 많으면 overfitting 可)

 

Batch size: 기울기 update시 훈련 데이터 몇 개씩 묶어서 사용할지 정하는 것.

                 보통 2의 지수승 형태. 메모리 적재 可만큼 (64~512)

                 Epoch 개수와 딱 맞게 떨어지도록 설정. (마지막 사이즈 다르면 학습 편향이 생기므로 걍 마지막거 버림)

                 n( train set ) < 2000 이면 굳이 나누지 않음.

ex) 1000 train set에서 100 batch size면 총 10번의 갱신 과정(Iteration)을 거침.

      size 너무 작으면 iteration 증가해서 학습 시간 오래 걸림

 

Iteration: 1 epoch 진행위해 몇 번의 가중치 갱신이 이뤄지는지, 위의 10번 갱신과정이 해당.

 

 

 

Batch Gradient Descent(BGD) 배치 경사하강법: batch size = train set size. 한번에 처리해 기울기 갱신.

긴 시간 소요(한 번에 처리라서). 수렴은 안정적

 

 

 

Stochastic Gradient Descent(SGD) 확률적 경사하강법: batch size = 1. 

전체 train set 중, 하나 랜더하게 선택해 기울기 업데이트 -> 그래서 확률적이라 부름.

각 데이터 미분 기울기값이 방향 크게 바뀜

1개씩 train set 처리해서 벡터화에서 속도를 잃고 GPU 병렬 처리 잘 활용 불가

 

 

Mini Batch Stochastic Gradient Descent(MGSD) 미니배치 확률 경사하강법.

위 두개의 절충안. 적절한 size로 나눠 학습. (train set size가 크면 BGD보다 속도 빠름. )

Shooting 有 -> local minimum 회피 可

 

 

 

 

 

 

split된 data 예제에 대해서

from sklearn.preprocessing import StandardScaler  # 정규분포 변환 스케일러 도입
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

from sklearn import linear_model

# verbose=1 <- iteration마다 상황을 보여준다
model = linear_model.SGDRegressor(verbose=1) #확률적 경사하강법 회귀

# ravel() : 다차원 배열을 1차원 배열로 평평하게 펴주는 ravel(), flatten() 함수
# 1차원 배열을 다차원 배열로 재구성/재배열 해주는 NumPy의 reshape() 함수와 반대의 기능
# lost = cost. 11이후론 변화가 별로 없다.
model.fit(X_train, np.array(y_train).ravel())

-- Epoch 1
Norm: 3.96, NNZs: 13, Bias: 15.806605, T: 404, Avg. loss: 101.339826
Total training time: 0.00 seconds.
-- Epoch 2
Norm: 4.73, NNZs: 13, Bias: 19.557271, T: 808, Avg. loss: 23.938968
Total training time: 0.00 seconds.
-- Epoch 3
Norm: 5.16, NNZs: 13, Bias: 21.106583, T: 1212, Avg. loss: 14.524915
Total training time: 0.00 seconds.
-- Epoch 4
Norm: 5.44, NNZs: 13, Bias: 21.765613, T: 1616, Avg. loss: 12.590436
Total training time: 0.00 seconds.
-- Epoch 5
Norm: 5.55, NNZs: 13, Bias: 22.098489, T: 2020, Avg. loss: 11.991231
Total training time: 0.00 seconds.
-- Epoch 6
Norm: 5.67, NNZs: 13, Bias: 22.300219, T: 2424, Avg. loss: 11.786432
Total training time: 0.00 seconds.
-- Epoch 7
Norm: 5.73, NNZs: 13, Bias: 22.408424, T: 2828, Avg. loss: 11.652522
Total training time: 0.00 seconds.
-- Epoch 8
Norm: 5.89, NNZs: 13, Bias: 22.437773, T: 3232, Avg. loss: 11.524070
Total training time: 0.00 seconds.
-- Epoch 9
Norm: 5.90, NNZs: 13, Bias: 22.498037, T: 3636, Avg. loss: 11.513658
Total training time: 0.00 seconds.
-- Epoch 10
Norm: 5.96, NNZs: 13, Bias: 22.501238, T: 4040, Avg. loss: 11.476083
Total training time: 0.00 seconds.
-- Epoch 11
Norm: 6.08, NNZs: 13, Bias: 22.512682, T: 4444, Avg. loss: 11.417017
Total training time: 0.00 seconds.
-- Epoch 12
Norm: 6.15, NNZs: 13, Bias: 22.502692, T: 4848, Avg. loss: 11.405148
Total training time: 0.00 seconds.
-- Epoch 13
Norm: 6.20, NNZs: 13, Bias: 22.522585, T: 5252, Avg. loss: 11.380562
Total training time: 0.00 seconds.
-- Epoch 14
Norm: 6.19, NNZs: 13, Bias: 22.527991, T: 5656, Avg. loss: 11.358868
Total training time: 0.00 seconds.
-- Epoch 15
Norm: 6.15, NNZs: 13, Bias: 22.526844, T: 6060, Avg. loss: 11.281041
Total training time: 0.00 seconds.
-- Epoch 16
Norm: 6.27, NNZs: 13, Bias: 22.492621, T: 6464, Avg. loss: 11.310433
Total training time: 0.00 seconds.
-- Epoch 17
Norm: 6.33, NNZs: 13, Bias: 22.511061, T: 6868, Avg. loss: 11.299957
Total training time: 0.00 seconds.
-- Epoch 18
Norm: 6.38, NNZs: 13, Bias: 22.515739, T: 7272, Avg. loss: 11.235814
Total training time: 0.00 seconds.
-- Epoch 19
Norm: 6.42, NNZs: 13, Bias: 22.525766, T: 7676, Avg. loss: 11.246629
Total training time: 0.00 seconds.
-- Epoch 20
Norm: 6.46, NNZs: 13, Bias: 22.536625, T: 8080, Avg. loss: 11.258716
Total training time: 0.00 seconds.
-- Epoch 21
Norm: 6.42, NNZs: 13, Bias: 22.534423, T: 8484, Avg. loss: 11.163148
Total training time: 0.00 seconds.
-- Epoch 22
Norm: 6.50, NNZs: 13, Bias: 22.521704, T: 8888, Avg. loss: 11.243543
Total training time: 0.00 seconds.
-- Epoch 23
Norm: 6.57, NNZs: 13, Bias: 22.503805, T: 9292, Avg. loss: 11.193756
Total training time: 0.00 seconds.
-- Epoch 24
Norm: 6.52, NNZs: 13, Bias: 22.515863, T: 9696, Avg. loss: 11.209542
Total training time: 0.00 seconds.
-- Epoch 25
Norm: 6.53, NNZs: 13, Bias: 22.528044, T: 10100, Avg. loss: 11.210925
Total training time: 0.00 seconds.
-- Epoch 26
Norm: 6.54, NNZs: 13, Bias: 22.520348, T: 10504, Avg. loss: 11.198809
Total training time: 0.00 seconds.
Convergence after 26 epochs took 0.00 seconds
SGDRegressor(verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

 

 

from sklearn.metrics import mean_squared_error, r2_score

score = model.score(X_test, y_test)
print("R-squared:", score)

y_pred = model.predict(X_test)
print('R2 : ', r2_score(y_test, y_pred))
print('MSE : ', mean_squared_error(y_test, y_pred))
print('RMSE : ', np.sqrt(mean_squared_error(y_test, y_pred)))

R-squared: 0.7592203176954294
R2 :  0.7592203176954294
MSE :  23.795627438514867
RMSE :  4.878076202614599

 

 

 

 

 

코드부분은 추후 업데이트 예정

728x90
반응형