티스토리 뷰

Study/AI

[ML] Simple Linear Regression - Implementation

생각많은 소심남 2018. 1. 11. 23:29

이전에 다뤘던 포스트에서 Experience와 Salary간의 Correlation을 구하는 Simple Linear Regression에 대한 설명을 했으니, 실제로 python 코드로 어떻게 구현되는지 살펴보고자 한다. 우선 큰 방향은 다음과 같다.

1) 주어진 dataset을 training set과 test set으로 구분한다.
2) training set, test set에 대해서 Linear Regression을 수행한다.
4) 두 결과를 비교한다.

1) 주어진 dataset을 training set과 test set으로 구분한다.

 이 방법은 이전 포스트에서 다뤘던 것처럼 cross_validation이란 기법을 사용하기 위해서이다. 간단히 말해 주어진 dataset 내에서 학습(training)과 검증(validation)을 병행함으로써 조금더 정확한 예측값을 얻고자 노력했던 방법이다. 사실 scikit-learn package를 사용하면 이 내부에 train_test_split라는 함수가 내장되어 있어 이를 활용하면 된다. 어떤 사람에 따라서는 이 training set과 test set을 규칙적으로 나눌 경우 문제가 있지 않을까 생각할 수도 있는데, 이 train_test_split 함수내에는 training set과 test set의 비율을 정하는 인자도 있고,, 이 배열되는 순서도 무작위로 할수 있는 인자도 있다. 코드로 구현하면 다음과 같이 된다.

위와 같이 하면 주어진 dataset(Salary_Data.csv)에서 independent Variable(X)와 dependent Variable(y)을 각각 X_train, X_test, y_train, y_test로 나눴으며, 이에 대한 training set과 test set의 비율이 2:1로 나눠지게 된다.


2) training set, test set에 대해서 Linear Regression을 수행한다.

 이전 포스트에서 다룬 Intuition에서 Linear Regression은 주어진 데이터와 최소한의 오차를 가지는 fitting line을 얻는 과정이라고 했었고, 원래는 적합한 기울기 값을 구하기 위한 loop를 수행해야 한다. 그런데 우리가 쓰는 scikit-learn package가 참 좋은게 그런 loop를 linear_model이라는 module 형식으로 만들어 두었다. 이전 포스트에서 잠깐 언급했던 최소제곱법(Ordinary Least Square)도 정의되어 있고(=linear Regression), 좀더 심화과정이라면 들어봤을 Ridge Regression이나 Lasso 같은 것도 정의되어 있다. 그렇기 때문에 단순히 사용자는 module내에 정의되어 있는 함수만 딱 호출해서 사용하면 된다. 

아마 모든 scikit-learn API 사용이 다 같지는 않겠지만, 개인적으로 봤을때 이런 학습은 전반적으로 
- model의 object 생성
- 주어진 데이터를 이용해 object를 맞춤(fit)

으로 이뤄지는 것 같다. fit을 하고 나면 해당 object가 내가 만든 Linear model이 되는 것이다. 그러면 이제 해당 linear model을 이용해서 주어진 data set에 대한 예측 결과를 얻어낼 수 있다.(y_pred)

3) 두 결과를 비교한다.

 결국 두 결과를 비교한다는 건은 우리가 사전에 나눠놓은 y_test 값과 예측 결과값(y_pred)을 비교하면 되는 것이다. 바라는 목적은 당연히 y_test와 y_pred간의 오차가 최소로 나와야 하는 것이다.

보면 어떤건 3000정도 차이가 나는 것도 있고, 어떤건 50정도 차이가 나는 것도 있다. 그래프로 확인해보면 이 결과가 명확해진다. 우선 training set에 대한 실제값과 예측값에 대한 비교를 출력하는 코드이다.

다음은 test set에 대한 그래프 출력에 대한 코드이다.

이에 대한 결과는 다음과 같다.

  실제 데이터는 빨간 점, Linear Regression 으로 만든 fitting line은 파란색으로 표시했는데 빨간점이 파란선 위에 있다는 것은 그만큼 정확하게 예측했다는 것을 의미한다. 즉 training set을 기반으로 만든 linear model이 새로운 data set(Test set)을 집어넣어도 어느정도 예측할 수 있다는 것이고, 그만큼 Salary와 Experience 간의 correlation이 있다는 것을 의미한다. 

결론 

 머신러닝을 배우면 가장 제일 먼저 배우는 내용이 Linear Regression이지만, 후에 다루는 다른 주제들도 추구하는 목표가 같다고 생각한다. 궁극적으로 주어진 정보를 바탕으로 학습을 시키되, 그 데이터들 속에서 환경에 영향을 줄수 있는 변수를 찾고, 그 상관관계를 찾음으로써 예측값과 실제값간의 오차를 최소화시키는 과정이 아닐까 싶다. 그걸 제일 언급하기 쉬운 내용이 지금까지 다뤘던 Simple Linear Regression인 것이다. 아마 다음 내용으로 다루게 될 다항 변수가 관여하는 Multiple/Polynomial Linear Regression도 이 기반 지식에서 조금더 발전될 내용이 될 것 같다.


출처 : Machine Learning A-Z : Simple Linear Regression in Python
Github : https://github.com/goodboychan/ML_A-Z

댓글