생각이 담아두는 곳

2. 선형회귀분석(2) - 실습 본문

CS/ML

2. 선형회귀분석(2) - 실습

Chang_Tree 2020. 9. 10. 01:44

데이터를 불러와보자. 

캘리포니아 집값 데이터로, 우리가 집어넣는 독립변수는 평균 침대실 수, 평균 방의 수, 집의 연도 등등

각 독립변수별로 의미하는바

우리가 예측하려는 것은 당연히 집값이다. 

 

우선 Ridge regression 모델을 설계했는데, 넣어주는 alpha 값이 이전에 배운 λ 와 같다. 

 

알파를 0으로 설정해주면 당연히, 단순히 선형회귀분석만을 한 것과 같은 결과가 나온다. 

알파를 0.5 로 설정한 경우, 좀 더 많은 계수들이 바뀐 것을 알 수 있다. (굉장히 미비하지만)

다만 Ridge의 경우, Lasso 와 다르게 계수들이 0으로만 가는 것이 아니라 0이 될 수도 있고 부호가 바뀔 수도 있고 계수의 절대값의 크기가 커질수도 있다. 

이제 Lasso를 살펴보자.

 

알파를 높일수록 점차 많은 계수들이 0으로 변하는 것을 확인할 수 있다. 

 

이제 지난번에 하기로 한, forward selection, backward elimination, stepwise selection 을 짜본다. 

 

forward selection

함수 해석을 해보면, initial_feature라는 리스트를 불러오고 이 리스트에는 아까 feature 8개가 담겨있다. 

best feature는 8개의 독립변수 중 forward selection 과정을 거치고 남은 독립변수들을 넣을 리스트

 initial_feature의 원소가 다 없어질 때까지 반복문을 돌리고.. 

remaining feature에는 우선 initial_feature가 다 들어간다.(추후에는 best feature에 들어간 feature는 제외)

반복문을 돌리고 인자는 new_column, 아까 전 받았던 remaining_features 에서 한 개씩 받는다. 

OLS 는 우리가 알던 단순제곱법을 이용한 회귀분석식이다. 기존에 사용했던 scikit-learn 패키지의

LinearRegression 함수와는 다른 점이 있는데... 

LinearRegression() 은 모델을 생성할 때, default값이 상수항을 추가하는 것이므로, 단순하게 fit(X, Y) 를 하여도 상수항이 추가되었지만, OLS는 다르다. 

sm.add_constant -> 상수항을 추가해서 독립변수 행렬을 만들어서 내놓는 함수

즉, sm.OLS(Y, X) 인데, 우리는 X 자리에 상수항을 추가한 것을 넣기 위해, sm.add_constant 함수를 사용한 것이다.

우선 위 코드에서는, best_feature에 뽑힌 feature들에 나머지 feature(remaining_feature) 를 하나씩 더해 학습을 시킨 것이다. 

그리고 각각의 P-value를 구해, 우리가 이전에 만든, Series인 new_pval 에 하나씩 추가한다. (인덱스는, feature 이름으로)

(p-value란, 각 독립변수가 얼마나 종속변수에 영향을 미치는지 나타내는 지료로, 정확하게는 회귀분석에서 P값은 독립변수의 계수가 0일 확률을 나타냅니다. 즉, P값이 작을수록 해당 독립변수가 모델에서 의미를 가지며, P값이 높을수록 해당 독립변수는 종속 변수에 영향을 끼치지 못하게 됩니다. 일반적으로, P값이 0.05 미만일 때 통계적으로 유의하므로, 우리는 cutofff라는 변수를 통해 이미 설정)

그 중 최소인 p-val을 구하고 그 값이 cutoff 보다 작다면, 이 feature를 best feature에 넣습니다.

즉, 맨 처음 루프를 돌 때는, 독립변수 한 개만을 받고 이에 대해 학습을 시키고, 각각의 독립변수들이 만들어낸 결과중, 종속변수에 가장 영향을 크게 끼친 독립변수를 골라 best_feature에 넣는 것입니다. 그 다음에는 best_feature에 넣어진 변수들은 그대로 넣고 또 하나씩 추가해보면서 유의미한 값을 갖는 변수들을 하나씩 추가하는 것이구요.

우리가 학습을 시켜본 결과, 변수 한 개가 빠진 것을 볼 수 있네요. (Population)

cutoff를 어떻게 잡느냐에 따라서 독립변수 선택이 아예 안될수도 있겠죠?

이런 식으로 forward_selection을 구현해볼 수 있습니다. 

 

아래 코드는 backward elimination 입니다.

위 설명을 이해하셨으면, 위 코드를 이해하는데도 어려움이 없을꺼라 생각합니다. 같은 독립변수가 빠졌네요. 

 

마지막으로 stepwise selection 입니다. 

보시면 알겠지만, forward selection 에 backward elimination 코드를 붙인 것입니다. 결과는 매한가지네요. 

교수님 말씀으로는 stepwise가 성능이 가장 좋다고 합니다. 뭐 루프를 제일 많이 돌기도 했고 일단 두 방법을 합해서 검증을 두 번 하니, 당연한 결과라고 생각합니다. 

빠진 변수, Population 에 대해 target 과 함께 점포도를 찍어봤습니다. 선형관계를 갖는다면, 뭐 인구가 증가하면, 집값이 비싸는 순으로 그래프가 그려질텐데 그대로인걸 확인할 수 있네요. 

한 블록내의 방의 수가 많을수록, 집값이 낮다는 것을 볼 수 있습니다. (상대적으로)

 

developers.google.com/machine-learning/crash-course/california-housing-data-description?hl=ko

 

머신러닝 단기집중과정  |  Google Developers

캘리포니아 주택 데이터 세트 설명 대부분의 머신러닝 단기집중과정 프로그래밍 실습은 1990년 미국 인구조사국 자료를 바탕으로 한 캘리포니아 주택 데이터 세트를 사용합니다. 다음 표는 이 ��

developers.google.com

 

'CS > ML' 카테고리의 다른 글

3. 선형분류모형 - 실습  (0) 2020.09.14
3. 선형분류모형  (0) 2020.09.11
2. 선형회귀분석(2)  (0) 2020.09.08
1. 선형회귀분석 - 실습  (0) 2020.09.04
1. 선형회귀분석  (0) 2020.09.03
Comments