304pg.
다중공선성(multi-collinearity)문제: 서로 상관관계가 높은 피처가 많은 경우 (피처끼리 상관관계가 있는 경우) 독립적인 중요한 피처만 남기고 제거하너가 규제를 적용한다. PCA를 통한 차원축소도 고려할 수 있다.
*feature데이터와 label데이터는 상관관계가 있으면 좋다. (feature데이터를 이용해 label모델을 만드는 것이 회귀모델링의 목적이기 때문)
회귀평가지표
- 회귀평가지표는 실제값과 예측값의 차이에 절대값 평균/제곱/제곱의 루트를 사용한다.(MAE, MSE, RMSE, R^2)
- R^2=예측분산/실제분산 = 회귀선과 평균선과의 차이의 합/실제데이터와 평균선과의 차이의 합(SSE)
이는 설명력이라고 하며 회귀모델이 실제 데이터를 얼마만큼 잘 설명하느냐에 대한 평가지표로 1에 가까울 수록 설명력이 좋은 것이다.
참고) 잔차: 실제데이터와 회귀선(의 예측값)과의 차이
305pg. LinearRegression을 이용해 보스턴 주택 가격 회귀 구현
- 55줄: for문은 lm_features가 8개이므로 8번을 반복한다. enumerate는 lm_features에 index 반환 값인 0-7까지 들어간다.
i | row | col |
0 | 0 | 0 |
1 | 0 | 1 |
2 | 0 | 2 |
3 | 0 | 3 |
4 | 1 | 0 |
5 | 1 | 1 |
6 | 1 | 2 |
7 | 1 | 3 |
- 59줄: regplot은 4x2행렬에 각각 루프에 해당되는 그래프를 그려달라는 것이다. (seaborn은 판다스 DF형태를 그래프로 그리기 최적화된 기능인데, 그 중 regplot은 선형회귀선을 자동적으로 그리는 기능이 있음) 각 column의 데이터별로 가격과의 상관관계를 보기 위함이다.
- 회귀모델을 구한다는 것은 각 feature에 대한 최적의 가중치 값을 구하는 것이다.
- 80줄: MSE는 (실제값-예측값)^2의 합의 평균, RMSE는 MSE에 루트를 씌운 것.
- 90줄: intercept_는 y절편값 (딱히 여기서는 의미가 없음)
- 91줄: 회귀계수 lr.coef_는 최종으로 구하는 가중치w값으로 13개가 나왔다. (506x14 행렬에서 PRICE를 뺀 나머지 13개 feature에 관한 회귀계수이기 때문) 또한 원본 feature데이터는 scaling되지 않았기 때문에 가중치w값은 feature마다 상대적일 수 밖에 없다. 예컨데 NOX는 다른 값들에 비해 상대적으로 작은 값을 취하고 있으며 이로인해 coefficient가 -19.8로 큰 수치가 나오지만 그렇다고 이게 다른 feature데이터의 회귀선에 비해 절대적으로 상관관계가 높다고 볼 수 있지 않다.
- 105줄: cross_val_score 교차검증 함수
- 112줄: scoring="neg_mean_squared_error" 값이 낮을수록 우수한 모델임 (교차검증 지표 평가기준) 이를 반환하면 음수값이므로 앞에 -1을 곱한다.
311pg. Polinomial 다항회귀 (다항회귀를 비선형회귀로 혼돈하지 말것, 다항회귀는 선형회귀임)
- 실제데이터와 잔차를 줄이는 (비용함수 z를 줄이는) 회귀선을 만들기 위해 회귀선의 차수를 변화시킬 수 있다. (적절한 회귀모델은 관측자료를 더 잘 설명함)
- 회귀모델을 만들 때 차수를 높이면 (독립변수와 종속변수의 관계가 N차항 방정식으로 표현) MSE는 줄어들 수 있으나 과적합의 문제가 발생하기도 한다.
참고) 회귀에서 선형/비선형회귀를 나누는 기준은 회귀 계수에 따른 것이지 독립변수의 선형/비선형 여부와는 무관하다.
사이킷런에서는 다항회귀 클래스가 명시적으로 없으며 비선형 함수를 선형모델에 적용시키는 방법을 사용해 구현한다.
- 선형: x축이 증가할 때 y축이 증가하는 함수 (일관성이 있음)
- 비선형: x축이 증가할 때 y축이 증가하거나 감소함 (일관성이 없음. 대게 2차함수 이상)
- 회귀계수 (regression coefficient): 회귀분석에서 독립변수가 한 단위 변화함에 따라 종속변수에 미치는 영향력 크기
- 단항계수 feature를 2차 다항계수로 변경하면 다음과 같다
z=ax+by+c >>>> z=ax^2+by^2+cxy+dx+ey+f
a, b, c, d, e는 coefficient 값을 말하며 polynimial_func가 자동적으로 이 값을 만들어준다.
- 파이썬 (컴퓨터) 입장에서는 다항계수로 만든다는 것은 feature의 개수를 늘리는 것으로 본다. (따라서 이를 선형함수로 본다)
선생님의 예시코드)
- 11줄: np.newaxis는 차원dimension을 늘린다. 여기서는 1차원 데이터를 2차원으로 늘린다.
- 22줄: PolynomialFeatures클래스는 자동으로 dimension차원 (degree=2라면 2차원)으로 바꾸는 함수로 객체를 만들어서 quadratic.fit_transform(X)하고 X_quad에 넣는다.
- X는 (10, 1), y는 (10,) 각각 dimension이 2차원, 1차원이다.
- 27줄: 원본데이터 X, y를 학습시킨다. (기울기, 절편 이렇게 2개의 값을 학습시킨다)
- 28줄: X는 250-600을 10스텝으로 된 데이터를 추출해서 2차원으로 만든다. (35x1)
- 29줄: y_lin_fit은 y에 테스트데이터 X_fit를 가지고 predict하여 예측값을 도출한다. (y=w1x1+w0 이 식에 X_fit값을 차례대로 넣는다) 결과적으로 직선식이 도출된다. (아래 linear_fit 점선 그래프임)
Ex) y=250w1+w0
- 33줄: y_quad_fit은 quadratic을 사용해서 2차회귀식을 만든다 (가중치가 3개 w2, w1, w0, 즉 y=w2x2+w1x1+w0 이 식에 X_fit값을 차례대로 넣는다).
Ex) y=250^2w2+250xw1+w0
- 36줄: X, y값의 산점도를 나타낸다. 1차회귀식과 2차회귀식을 비교해봤을 때, 2차회귀식이 좀 더 실제값과 가깝다는 것을 알 수 있다. (차수를 증가시킬수록 MSE값이 작아져서 0에 수렴한다)
1차식을 2차식으로 표현하기 위한 데이터로 바꾼 결과 X_quad는 다음과 같다.
y=ax+b >>> y=ax^2+bx+C
각각의 column에는 a, b, c값이 들어가게 된다.(1차식의 a는 w1, b는 w0/ 2차식의 a, b, c는 w2, w1, w0 가중치를 말함)
차수가 변화할 때 확장된 x^2의 scale된 새로운 w2값을 넣는다.
1차회귀선 | 2차회귀선 |
y=ax+b | y=ax^2+bx+c |
=w1*x1+w0 | =w2*x2+w1*x2+w0 |
퍼셉트론의 관점에서 column개수에 의한 학습 - y값(결정값)과 비교해서 기울기 w1과 절편 w0를 가중치를 계산하고 업데이트한다. 실제값과 가장 MSE값이 낮은 적절한 w1, w0를 구한다. |
퍼셉트론의 관점에서 column개수에 의한 학습 - y값(결정값)과 비교해서 w2, w1, w0을 계속 업데이트한다. |
이를 그래프로 보면 다음과 같다
312pg.
다시 교재로 넘어옴.
- 140줄: degree=2 2차항으로 만듦
일차 단항식 계수 feature | 2차 다항식 계수 feature |
x1 x2 | 1 x1 x2 x1^2 x1x2 x2^2 |
0 1 | 1 0 1 0 0 0 |
2 3 | 1 2 3 4 6 9 |
- 152줄: 1+2x1+3X1^2+4X2^3 을 의미한다.
X 2*X[: , 0] 3*X[: , 0]^2 4*X[:, 1]^3
[0 1 [0 [ 0 [ 4
2 3 ] >> 4 ] >>> 12 ] >> 108]
벡터끼리 여기에 +1 씩한다 (벡터+벡터=동일 포지션끼리의 덧셈/ 스칼라+벡터=각 요소에 더함)
1+ [4 [ 5
124] = 125]
- 167줄: 1~N차 다항식으로 바뀔 때 y값은 바뀌지 않는다. (y값은 정답값이기 때문이다) 이 정답값을 X로 편하는 방식이 다를 뿐이다.
- 168줄: coef는 회귀계수로 N차 다항식 계수 feature와 곱하고 더한다. 이 예측값들과 정답값 y의 차이의 제곱을 구하게 되는데, 이 때 가장 작은 MSE값이 나오는 가중치(회귀계수)의 결과값은 다음과 같이 Polynomial 회귀계수로 도출된다.
- 191줄: 사이킷런 Pipleline의 데이터 타입은 list이며 tuple타입의 element 2개가 있다.
즉, Pipleline에는 PolynomialFeatures와 LinearRegression이라는 두 개의 절차가 들어가 있다.
- 196줄: model에 묶인 위의 두 개의 절차가 한번에 수행된다.
314pg. 다항 회귀를 이용한 과소적합 및 과적합 이해
다항식 차수를 1, 4, 15로 변경했을 때 1은 단순한 직선으로 예측 곡선이 학습 데이터의 패턴을 제대로 반영하지 못하는 과소적합 모델이된다. (MSE=0.407). 4는 가장 적합한 코사인곡선으로 테스트 데이터를 잘 예측한다 (MSE=0.043). 15는 비현실적인 회귀계수며 학습데이터에 너무 충실한 과적합 모델이 된다.
- 267줄: 코사인 함수 (내장된 삼각함수는 대부분의 언어에서 호도법으로 되어있다)
np.cos(1.5*np.pi*X)는 호도법기준으로 0~1사이의 값에 1.5를 곱한다.
참고) 호도법. cos(90)=14.329448....은 14바퀴를 돌고 0.33정도가 남는다. cos(90)는 -0.44로 각도가 90인 것과는 다르다.
- 272줄: np.random.rand( )는 0~1까지의 균일분포값 사이에서 실수난수를 n_samples 수 만큼 생성
- 275줄: np.random.randn( ) 는 0~1까지의 가우시안표준정규분포값 사이에서 n_samples 수 만큼 실수난수를 생성. 이로서 평균이 0인 곳에서 노이즈를 섞어준다. 즉, y값은 0~3/2pi까지의 값에 노이즈를 섞어준 값. (cos그래프는 1~-1값 사이인데, 노이즈가 섞여서 1.08처럼 1을 넘을 수 있다. 즉 1에서 -1까지 갔다가 0으로 돌아온다.)
참고) y_test값에는 노이즈가 섞이지 않음.
- 287줄: 14x5사이즈의 plt를 그린다.
- 291줄: degree의 길이(len)는 3이므로 for는 3바퀴 돈다. subplot은 plot을 몇개로 나눌 것인가이다. 즉 3개의 그래프가 그려진다.
- 300줄: Column방향의 데이터를 Row방향으로 reshape한다.
- 303줄: cross_val_score로 교차검증을 수행한다. coefficient랑 MSE값을 본다.
- 310줄: 0~1의 range를 100등분해서 데이터를 뽑는다.
- 314줄: ture_fun(X_test)실제값을 뽑아내는 함수의 결과값.
318pg. 편향-분산 트레이드오프 (Bias-Variance Trade off)
회귀모델의 예측확률을 높이려면 (오류 cost값이 최대한 낮아지려면) 편향을 낮추고 분산을 높이면서 전체 오류가 각장 낮아지는 '골디락스' 지점을 찾아야 함
Degree 1: 고편향 high bias 회귀 그래프 (variance 에러만 섞여진 상태: 정규분포에서의 노이즈 추가)
Degree 15: 고분산 high variance 회귀 그래프 (variance 에러만 섞여진 상태: 정규분포에서의 노이즈 추가)
참고) Error = bias+variance+ε = F*(x)+ε
Error = E[ y-F(x) ]^2 (실제값과 예측값의 차이를 제곱한 값들의 평균 Expectation)
= E[ F*(x)+ε- F(x) ] ^2
= E[ F*(x)-F(x)+ε ] ^2
= E[F*(x)-F(x)] ^2 + E(ε)^2
= E[ F*(x)-F_(x) + F_(x) - F(x) ]^2 + var
= E[ F*(x)-F_(x) ] ^2 + [ F_(x) - F(x) ] ^2 + var
= bias(이상값과 만든모델의 평균의 차이의 제곱) + variance(모델의 평균과 각 모델의 차이의 제곱의 평균) + 실제 데이터에 포함된 자연적 에러(정규분포에러, 노이즈)
- y= 실제데이터 F*(x)에 자연발생한 에러인 ε를 더한 값
- ε: 자연발생한 에러, 노이즈, 가우시안정규분포를 따름, 평균이 0이므로 기대값E도 0, E(ε)^2는 벡터의 분산
- F(x): 실제 데이터셋을 이용한 개별모델
- F_(x): 개별모델 F(x)의 평균
'살콤아내 자기계발 > 파이썬' 카테고리의 다른 글
파이썬머신러닝완벽가이드 6주차 (342pg. 자전거대여수요예측) (0) | 2021.06.02 |
---|---|
파이썬 머신러닝 완벽가이드 6주차 정리 (319pg, 규제선형모델-릿지, 라쏘, 엘라스틱넷, 로지스틱회귀) (0) | 2021.05.31 |
파이썬 머신러닝 완벽가이드 6주차 정리 (290pg, 회귀 아달린) (1) | 2021.05.26 |
파이썬 온라인 교육 플랫폼_코드스테이츠, 정보통신진흥원NIPA, POSTECH MOOC (0) | 2021.05.25 |
파이썬 머신러닝 완벽가이드 6주차 정리 (경사하강법, 퍼셉트론/아달린) (0) | 2021.05.24 |