살콤아내 자기계발/파이썬

파이썬 머신러닝 완벽가이드 6주차 정리 (290pg, 회귀 아달린)

살콤아내 2021. 5. 26. 12:48
728x90
반응형

 

파이썬머신러닝완벽가이드 290pg. 회귀 (아달린, 확률적경사하강법).py
0.01MB

 

290pg 회귀

지도학습은 분류 Classification은 이산값 category값을 가지며, 회귀 Regression은 숫자값(연속값)을 가진다.

회귀란 여러개의 독립변수(feature)와 한 개의 종속변수(target 결정값) 간의 상관관계를 모델링하는 기법을 통칭한다.

- 회귀계수(Regression coefficients)는 독립변수의 값에 영향을 미치며, 머신러닝에서는 최적의 회귀계수를 찾는 것이 핵심이다. 이는 전체 데이터의 잔차(오류값)합이 최소가 되는 것이다.

- 종류: 선형/비선형회귀(회귀계수가 선형이냐아니냐), 단일회귀/다중회귀(독립변수/종속변수의 개수에 따라)

- 선형회귀는 실제값-예측값(오류의 제곱값)을 최소화하는 직선형 회귀선을 최적화하는 방식이다.

- 단순선형회귀: 독립변수1, 종속변수1인 선형회귀

- 오류합 계산: Mean Absolute Error, RSS(Residual Sum of Square)

 

 

297pg 회귀 코드예제

 

- 25줄: np.random.rand(m, n)는 0~1의 값 사이의 균일분포 표준정규분포 난수를 matrix array (x, y)생성. 100개의 샘플에 각각 element에 2를 곱한다. (range는 0~2가 된다)

- 26줄: np.random.rand(m, n)는 평균0, 표준1의 가우시안 표준정규분포 난수를 matrix array (x, y)생성. 정규분포에 6+4X를 한다. 

plt.scatter(X, y)
sns.distplot(X, kde=False)

 

참고) https://nittaku.tistory.com/443

 

python random모듈 3개 정리 (randint, rand, randn)

블로그정리 1. np.random모듈 numpy 의 np.random. randint vs rand/randn ¶ np.random.seed seed를 통한 난수 생성 np.random.randint 균일 분포의 정수 난수 1개 생성 np.random.rand 0부터 1..

nittaku.tistory.com

https://math100.tistory.com/33

 

- 60줄: get_weight_updates는 가중치 업데이트 사용자 정의 함수

- 63줄: np.zeros_like는 어떤 변수만큼의 사이즈인 (w1변수 사이즈) 0 으로 가득 찬 Array를 배출한다. 

- 66줄: np.dot(X, w1.T) + w0는 X와 전치행렬 w1을 내적하고 w0을 더함 (내적을 수행하기위해서는 shape가 일치해야하므로 전치행렬T를 수행한다

- 67줄: diff는 실제값-예측값인 에러율

- 70줄: w0_factors=np.ones는 해당 shape에 1로 가득채운다. (N은 100개임)

- 73줄: w1_update에서 np.dot(X.T, diff)는 Σ(y-y')x을 말한다. 거기에 -2/N*learning rate를 하면 편미분 결과값이 나온다.

(296pg 편미분 참고)

 

- 질문: RSS(w0, w1)=R(w)= w+Δw 인가? w-Δw 인가?

y값에 대해 w로 편미분한 값 (가중치의 변화량)은 이미 음수(-)가 도출되어 나오기 때문에 사실 둘이 같은 식이라고 볼 수 있다. (108줄, 109줄에 나오는 w1, w0값은 미분값 그 자체이기 때문에 빼줘야한다)

- 100줄: gradient_descent_steps는 경사하강법 사용자 정의함수

- 102-103줄: 1x1 변수에 0값을 넣는다. 가중치를 초기화함.

 

- 121줄: cost=np.sum(np.square(y-y_pred))/N은 비용함수를 말한다.  Σ(y-y')^2/N

- 134줄: 회귀선 y=w1x1+w0에서 w1은 기울기와 w0은 절편을 의미. 

 

- 145줄: 확률적 경사하강법 stochastic은 모든 샘플에 적용되지 않는다. permutation을 통해 일부를 샘플링해서 가중치를 업데이트한다. 그런데 epoch가 돌면서 샘플링 되는 데이터는 달라진다. (샘플링 데이터 개수는 같음. 데이터가 중복될 수 있음>>아달린보다는 정확도가 떨어질 수 있음)

- 152줄: np.random.seed는 랜덤함수의 규칙이다. for문이 돌 때마다 새로운 index값이 나온다. 만약 for문 전체가 들어간 코드를 다시 수행했다면 이전에 나온 index값으로 나온다. 그런데 seed값을 바꾼뒤 for문 전체를 다시 돌리게 되면 또다른 index값이 샘플링된다.

- 155줄: batch_size는 10로 슬라이싱한다. 즉 0-9까지 샘플링한다는 말임.

- 158줄: sample일부만 가중치 업데이트를 한다.

- 168줄: X.shape[0]에는 0-99까지 랜덤으로 뒤섞인 100개의 데이터가 들어가있다. permutation을 통해 인덱스가 임의적으로 섞인다.

 

 

728x90
반응형