회귀(regression)라는 단어는 프랜시스 골턴이라는 사람이 유전학을 연구하던 도중 아버지의 키에 따라 아들의 키가 결정되는 경향이 있지만 세대가 지나면서 키가 작은 아버지의 아들은 물론 키가 작지만 아버지보다는 커지고, 키가 큰 아버지의 아들도 키가 큰편이지만 아버지보다는 작아지는 경향을 보이며 평균에 가까워지는 '평균으로의 회귀' 현상을 증명하기 위해 만든 것으로 알려져 있다.
즉 아버지의 키(), 아들의 키()는 유전이라는 정해진 영향을 미치는 요인이 있고 이처럼 데이터의 값들의 상관관계, 특정한 경향이나 요인이 있다면 하나의 값() 를 알고 있을 때 다른 나머지 값()는 보통 전체 데이터의 상관관계상 평균적인 값을 벗어나지 않는 경향을 가지고 있다는 이야기다.
지도 학습 알고리즘은 크게 분류와 회귀(regression)으로 나뉜다. 분류는 샘플이 모델에 학습되어 있는 클래스중 어떤것과 가장 가까운지를 분별하는 문제이고, 회귀는 학습되어 있는 클래스로 분류하는 것이 아닌, 임의의 어떤 숫자를 예측하는 문제다.
예를 들어 생선의 무게와 길이데이터 값을 샘플로 이용할때 이 생선의 종류를 판별하는 것은 분류의 문제이고, 이 생선의 길이 데이터 값에 따라 무게를 얼마로 예측할 수 있는지에 대한 문제를 바로 회귀라고 한다. 책의 3장 첫부분에서는 K-최근접 이웃회귀를 다루는데, K-최근접 이웃 모델과 동일하게 입력값에 대한 근접한 이웃 샘플들을 구하고, 그 이웃한 샘플들의 평균값으로 출력값을 예측한다.
분류 문제는 입력값에 해당하는 클래스를 출력하면 되지만, 회귀의 경우 타깃값과 예측값이 모두 정해져 있지 않은 임의의 수치이기 때문에 정확한 숫자를 맞춘다는 것은 거의 불가능 하다. 하지만 테스트 데이터와 타깃값을 넣고 모델의 .score() 펑션으로 점수를 내어보면 0-1의 범위로 정확도를 나타내어주는데, 이 정확도는 어떻게 판별하는 것일까? 바로 결정계수(coefficient of determination) 값으로 나타 낸다고 한다.
- 타깃값: 테스트 타깃 데이터의 실제 값.
- 예측값: 회귀 모델에 의해 예측된 값.
- 평균: 테스트 타깃 데이터의 평균 값.
각 샘플의 타깃값과 예측한 값의 차이를 제곱하여 더하고, 타깃값과 타깃 데이터의 평균의 차이를 제곱하여 더한 값으로 나눈다. 예측 값이 타깃값의 평균정도를 나타낸다면, 값은 0에 가까운 값이 되고, 예측 값이 타깃값에 가까워진다면 분자가 0에 가까워져 값은 1에 가까운 값이 된다.
훈련세트의 점수는 높게 나오지만, 테스트 세트에서의 점수가 굉장히 나쁘게 나왔을 경우 이를 과대적합(Overfitting) 이라고 정의한다. 훈련 세트에 너무 잘 맞추어져 있어서 새로운 데이터에 대한 분석 능력이 떨어지는 현상이다. 과대적합이 발생할 경우 이 모델을 이용해서 수행하고자 하는 분류나 예측 작업을 목적을 달성할 수 없다.
테스트 세트의 점수가 훈련세트보다 높거나, 두 점수가 모두 너무 낮을 경우를 과소적합(Underfitting)이라고 정의한다. 모델을 제대로 이용하지 못한다는 점은 같지만 과대적합과는 다르게 학습된 데이터의 특성과 패턴조차 학습하지 못한 상황이다.
- 노이즈 : 모델에서 의도한바와 관계가 없거나 무의미, 무작위, 오류데이터들을 의미한다.
- 복잡도 : 모델에 데이터를 학습하고 해석하기 위한 파라미터, 레이어등이 많거나 깊은 구조를 가질 때 복잡하다고 한다.
- epoch : 모델이 전체 학습 데이터 세트를 한번 통과하여 훈련하는 사이클
선형회귀(linera regression)란 말 그대로 특성이 하나인 선형적인 데이터를 다루기 위한 회귀 알고리즘이다. k-최근접 이웃 알고리즘은 이웃한 값들의 평균으로 출력값을 예측하기 때문에 훈련 세트를 벗어난 값을 예측하는 것에 한계가 있다. 예를들어 길이 10cm ~ 50cm까지의 훈련 세트로 학습을 했다면, 길이 100cm의 샘플의 값을 예측할 때 가장가까운 50cm근방의 데이터로 값을 예측하기 때문이다. 새로운 훈련데이터의 추가로 극복할 수 있겠지만, 길이가 증가할수록 무게가 증가하는 직선의 선형적인 데이터의 해석에는 효율적이지가 않다. 이러한 문제를 해결하기 위해 대표적으로 사용되는 것이 "선형회귀(linera regression)" 알고리즘이다. 말그대로 "선형" 즉 기울기와 절편이 있는 간단한 1차 방정식의 형태를 띄우고 있다.
- : 종속변수 (ex. 길이에 따라 영향을 받는 무게값)
- : 독립변수, 종속변수에 영향을 주는 변수(ex. 기준이 되는 길이값)
- : 기울기 , 계수(coefficient) 혹은 가중치(weight) 사이킷런 .coef_ 속성에 저장됨
- : y절편(intercept), x가 사이킷런 .intercept_ 속성에 저장됨
다항회귀(Polynormial Regression)은 선형회귀의 확장된 형태로, 데이터가 단순한 직선일때보다 곡선의 형태로 더 잘 설명될 때 사용된다. 예를들어 데이터가 면적이 길이가 늘어날수록 무게가 일정하게 늘어나는 철근이라면 1차 방정식으로도 충분히 데이터를 예측할수 있겠지만, 살아있는 생물의 경우는 키가 증가함에 따른 체중은 곡선의 형태를 띌것이고, 간단하게 아래와 같은 2차 방정식의 그래프로 설명할 수 있다.
- : 종속변수 (ex. 키에 따라 영향을 받는 체중값)
- : 독립변수 (ex. 키값)
- : [파라미터] 2차항의 계수로 값이 0에 가까우면 모델은 직선에 가까워지고, 커질수록 곡선에 가까워진다. 양수라면 곡선이 위로 볼록할 것이고, 음수라면 아래로 볼록한 곡선을 나타낸다. a
- : [파라미터] 1차항의 계수로 기울기에 영향을 준다. 데이터가 독립변수(키값)에 따라 증감하는지에 대한 기본적인 경향을 나타낸다.
- : [파라미터] y의 절편으로써 키값이 0일때 예상되는 체중을 나타낸다.
여기서 파라미터란 모델이 주어진 데이터에 대해 패턴과 구조를 어떻게 반영하고 해석하는지를 결정한다. 이 파라미터들 (:키가 증가할수록 체중변화의 비율은 얼마나 될까? :기본적으로 키가 체중에 미치는 영향은 얼마나 될까? :키가 0일때 체중이 얼마일까?) 을 조정하여 데이터 샘플들 간의 오차를 최소화하고 패턴을 가장 잘 설명하는 값을 찾아내는 과정을 "모델 피팅" 또는 "모델 최적화" 작업이라고 한다.
다항회귀에서는 문제를 해결하기위해 하나의 특성을 사용하여 모델을 훈련했다. 하지만 우리가 실제로 해결해야할 대부분의 문제들은 결과(종속변수)를 도출하는 과정에 여러가지 상황(특성,독립변수)들이 영향을 미친다. 이렇게 여러개의 특성들을 사용한 선형회귀를 다중회귀(Multiple Regression)라고 부른다.
특성이 1개인 그래프 | 특성이 2개인 그래프 |
---|
오른쪽 그래프 처럼 특성이 2개라면 3차원 공간을 나타낸다. 특성이 그 이상이라면 4차원 공간을 나타내어 그림으로 표현할 수없다.
주어진 특성을 사용해 새로운 특성을 뽑아내는 작업을 특성공학(Feature Engineering)이라고 한다. 예를 들어 길이, 높이, 폭이라는 세가지 특성이 있다면 길이와 높이를 곱해 면적이라는 특성을 만들어 내어 학습하고, 모델의 복잡성을 감소시키거나 데이터의 숨겨진 패턴들을 파악할 수 있다.
변환기(transformer)는 데이터의 전처리와 관련되어 특성공학을 수행하는데 사용되는 클래스이다.
예를 들어 사이킷런에서 PolynomialFeatures 클래스의 경우 훈련한 특성으로 설정한 차수까지의 다항식 조합을 생성한다. 차수가 높아질수록 더 많은 특성을 생성해 내어 모델이 해석할 수 있는 특성의 수를 늘려 데이터의 패턴에 대해 더 잘 설명할 수가 있게 된다. 사이킷런에서 제공하는 변환기들은 특성의 수를 확장하는 것 뿐만 아니라 데이터의 정규화, 표준화, 데이터 결손 보완, 이진 변환등 머신러닝에 효과적인 여러 알고리즘을 구현하여 제공한다. 하지만 과도하게 많은 특성은 과대적합을 유발하는 요소이다.
사이킷런에서 제공하는 변환기 종류
- PolynomialFeatures: 기존 특성들의 다항식 조합을 생성하여 특성의 수를 확장한다.
- StandardScaler: 데이터의 특성별로 평균을 0, 표준편차(분산)를 1로 조정하여 특성들을 표준화하여 정규 분표 형태에 가깝게 만든다.
- MinMaxScaler: 특성값이 0과 1 사이에 위치하도록 데이터를 재조정한다. 데이터가 심하게 왜곡된 경우나 이상치에 민감한 알고리즘에서 유용하다.
- RobustScaler: 중앙값과 사분위수를 사용하여 특성들을 스케일링한다. 특성들이 같은 스케일을 갖게되며 평균대신 중앙값을 사용하여 극단값에 영향을 받지 않는다.
- OneHotEncoder: 범주형 변수를 이진 집합으로 변환한다. 예를 들어 서울,부산,대전등의 텍스트 데이터를 서울:[1,0,0], 대전:[0,1,0], 부산:[0,0,1] 로 변환한다.
- LabelEncoder: 범주형 타깃 변수를 숫자로 변환한다. 분류 문제에서 타겟 레이블을 수치형으로 변환하는 데 사용된다.
- SimpleImputer: 누락된 값(missing values)을 평균, 중앙값, 최빈값 등으로 채워넣는다. 데이터의 결측치를 처리하는 데 필요하다.
- FunctionTransformer: 사용자 정의 함수를 사용하여 데이터를 변환한다.
여태 수학에 대해 아주 깊게 알아야 머신러닝을 다룰 수 있다고 생각했는데... 집짓는데 망치의 특성과 다루는 법을 알면 되지, 망치를 만드는 방법부터 배울 필요가 없는 것은 개발과 마찬가지인 부분인것 같다.
규제(Regularization)란 모델이 훈련세트를 과도하게 학습하여 과대적합되는 것을 막는 기술이다. 규제는 주로 선형회귀같은 지도학습 알고리즘에서 사용되며 대표적으로 특성에 곱해지는 계수나 기울기의 크기를 작게 만들어 규제하는 릿지회귀(ridge) 나 라쏘회귀(lasso)같은 모델들이 있다.
하이퍼파라미터(hyperparameter)란 모델에게 사람이 알려줘야하는 값이다. 학습을 실행할때 모델의 성능에 직접적인 영향이 미친다. 이를 통해 모델의 구조나 학습 과정을 사람이 조정하고 제어할 수 있다. 예를 들어 릿지,라쏘회귀의 하이퍼파라미터인 alpha값은 작을 수록 가중치에 대한 제약이 약해져 선형회귀 모델과 유사해진다.
하이퍼파라미터의 예시
- 학습률(Learning Rate): 매 반복에서 모델의 가중치를 얼마나 조정할지 영향을 미침.
- 정규화 매개변수(Regularization Parameter): 릿지 회귀나 라쏘 회귀에서 사용하는 규제의 강도를 결정한다.
- 트리의 깊이(Tree Depth) 또는 노드 수: 결정 트리, 랜덤 포레스트, 그래디언트 부스팅 트리 등에서 트리의 깊이나 노드의 최대 수를 설정함.