본문 바로가기
코알라UNIV

11주차 회귀분석을 이용한 집값 추측, 나에게 맞는 의류사이즈 추측

by 인듯아닌듯 2020. 1. 1.

12주차는 각자 개별과제로 마무리하기로 했기때문에 그룹스터디도 이걸로 끝났다. 바쁜와중에 다들 수고 많았던 것 같다. 초심그대로 해커톤까지 잘 마무리하도록하자


지난주차에 배웠던 DecisionTree,RandomForest 모델은 '분류'를 하는 거였다면, 11주차에서는 '계산'을 해서 수로 나타내보려고한다. 공통점은 둘 다 예측을 한다는 점이다.

수치를 예상하는 것은 회귀분석이라고한다.

 

stage 1에서는 가장 간단한 회귀모델인 Linear Regression의 기본적인 개념을 짚고 갔다. 독립변수 x 와 종속 변수 y가 있을 때, 실제 x 값에 따른 예측 y 값이 직선상에 있다고 가정하는 모델이다.

빨간색 점이 실제 x와 y값이고, 초록색 직선이 Linear regression 모델이다. 이 직선은 최소자승법(Least Square Method)에 의해 하나의 직선으로 결정된다.

 

Linear regression말고도 다른 regression model을 sklearn 라이브러리에서 import 해볼 수 있었다.

나는 linear regression , polynomial regression(2차,3차) , decisionTreeRegression 모델을 시도해보았고,

ridge regression, logistic regression 등이 추가적으로 있었다.

 

분류모델에서는 어떤 모델이 가장 적합한지 찾기위해서 .score 를 사용하였다. 하지만 회귀모델은 분류모델처럼 정답과 오답이 나뉘어서 전체데이터중에 얼마나 맞았나 하는 것으로 .score을 낼 수 없다. 왜냐하면 모두 다 크건작던 오차를 가지고 있기 때문이다. 즉, 회귀은 확률을 예측할 수 없는 것이다.

 

그러면 .score는 확률이 아닌 어떤 기준으로 점수를 내는 것일까? 회귀모델에서 .score은 결정계수를 점수화 하여 보여준다고 한다. sklearn 공식홈페이지에서 관련내용을 가져왔다.

.score()
Return the coefficient of determination R^2 of the prediction.
The coefficient R^2 is defined as (1 - u/v), where u is the residual sum of squares ((y_true - y_pred) ** 2).sum() and v is the total sum of squares ((y_true - y_true.mean()) ** 2).sum(). The best possible score is 1.0 and it can be negative (because the model can be arbitrarily worse). A constant model that always predicts the expected value of y, disregarding the input features, would get a R^2 score of 0.0..
(출처:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html)

 

그래서 코알라에서  ".score 이 방식이 정말로 모델의 성능을 잘 대변하는지 의심해보세요" 라는 질문이 있었는데, 아직 그 해답을 찾지 못했다...🤔

Feature scaling 했을때이다. 위 설명처럼 1-(u/v)에서 u가 크면 .score는 음수가 나오기도 한다.

stage 4에서는 우리주변의 문제에 대해서도 쉽게 회귀분석을 할 수 있게, 적은 양의 데이터로 회귀분석모델을 학습시키고, 각자 본인의 개인정보를 넣어서 예측결과를 출력해보았다. 거대한 정보를 자동화하여 기계학습시키는 것에서 Customzied하는 느낌이 들어서 활용도가 높게 느껴졌다.

 

regression으로 수치값을 내고나서, 기준을 잡아준다면 classifier(분류)처럼 쓸 수도 있다. 그런 개념을 이용해 만든 모델이 logistic regression이라고 한다. (사실상 결과는 '분류'에 더 가깝지만 과정이 '회귀'스러워서 regression이라고 명칭)

 

마지막으로 배운 Feature Scaling은 데이터의 분포를 표준화 z 하는 것이다. 이때 주의점은 표준화하려는 대상의 데이터타입이 dataframe이여야한다. 그래서 series로 되어있는경우 형변환이 필요하다.

Feature scaling 하는 코드

다만 이렇게 FeatureScaling을 해줘도 안 해줬을 때에 비해 나아지지않았다. 그리고 심지어 train_test_split에 의해 데이터를 나누었을때 .score가 음수가 나오는 경우도 간간히 보였다.(바로 위 .score가 음수가 나온경우)

굳이 해주지않아도 데이터의 단위가 큰 경우에는 계수(coefficient)가 그 문제를 해결해주지 않을까 싶다.

 

 

-시간이 나면 해결해야하는 부분

1. .score의 채점방식 장단점이 뭘까? 왜 음수가 나오는 경우는 데이터의 분포가 어떻게 되는 걸까?

2. ridge regression , lasso regression, logistic regression 추가적인 회귀분석모델 공부