220427-0503 TIL / Machine Learning Section 시작! (Regression Model, 일주일 회고)

신두다·2022년 5월 5일
0

TIL

목록 보기
18/82

반성으로 글을 시작한다.
그날 그날 블로그에 남겼어야 할 TIL을 지난 5일 간 남기지 않았다.
오늘 몰아서 블로그에 옮겨둔다. 앞으로는 빼먹지 말고 블로그에도 남기자!
지난 스프린트(일주일) 간에는 Regression Model에 대해 배웠다.

수영황제 마이클 팰프스가 좋아한다는 말이 있다.

The greats do things when they don't always want to.

이것이 Goodgreat을 구분하는 차이가 될 것이다. 반성, 반성!


Simple Regression_0427

Key words

선형회귀모델(Linear Regression), 지도학습(Supervised Learning), 기준모델(Baseline Model)

Details

개념

  • 패러다임 전환으로서의 머신러닝의 의미
  • 선형회귀모델에 대한 기본 개념 이해
  • Least Squared Method
  • 기준 모델의 개념과 모델별 활용
  • 예측값과 에러(error), 잔차(residual) 개념
  • RSS(Residual sum of squares) - LSM과 같은 개념이다.
  • Scikit-learn을 통한 Simple linear Regression 모델 구현 ⭐⭐
  • 선형회귀 모델의 계수(coefficients)의 의미, 해석
  • 보간, 외삽
    • 보간 (interpolate): 학습 범위 '내에' 주어져 있지 않은 값을 예측.
    • 외삽 (extraploate): 학습 범위 '밖에' 주어져 있지 않은 값을 예측.

실습 (King County 지역의 14년 5월 ~ 15년 5월 주택 판매 가격 데이터)

  • 피쳐와 타겟의 상관계수를 계산하고 가장 상관관계가 높은 피쳐와 타겟 간의 관계 시각화. (correlation coefficient 개념이 여기서 쓰이는 거라니! 신기했다)
    • seaborn을 활용하면 회귀선까지 자동으로 그려서 시각화할 수 있다. (sns.regplot(x = feature, y = target)
  • 위 피쳐와 타겟으로 scatter plot을 그리고 기준모델 시각화
    • 회귀모델에서의 기준모델은 평균이다. (참고로 분류모델은 최빈값)
    • y_predy.mean()이다.
  • Scikit-learn을 이용해 선형회귀모델 만들기
    • from sklearn.linear_model import LinearRegression을 이용한다.
    • 모델 인스턴스 생성, 피쳐와 타겟 정의, 모델 학습, 예측의 flow는 기억하자.
## 모델 구축 ##
from sklearn.linear_model import LinearRegression

#모델 인스턴스 생성
model = LinearRegression() 

# 피쳐와 타겟을 정의해 준비해준다.
feature = ['sqft_living']
target = ['price']
X_train = df[feature]
y_train = df[target]

#모델 학습
model.fit(X_train, y_train)

# 모델 사용한 예측
X_test = [[15000]]
y_pred = model.predict(X_test)

print(y_pred) #sqft_living이 15,000일 때, price는 4,165,773으로 예측됨.
  • 만든 모델을 사용해 새로운 데이터를 예측해보고, coefficient를 통해 설명하기
    - 회귀계수는 model.coef_를 통해 확인할 수 있다.
    • 만약 회귀 게수가 281이 나왔다면, 피쳐가 1 증가할 때마다 타겟이 281만큼 증가한다고 해석할 수 있다.

재밌었다!


Multiple Regression_0428

Key words

Train/Test Data, 다중선형회귀(Multiple Linear Regression), 다항선형회귀(polynominal Regression), 과적합/과소적합(overfitting/underfitting), bias/variance/Trade-off, MSE, MAE, RMSE, R2R^2

Details

개념

  • 전반적인 기본 개념은 전날 배운 Simple Regression과 유사하다. 피쳐가 1개였느냐, 여러 개가 되었느냐의 차이로 생각할 수 있다.
    • 즉, 다중선형회귀의 회귀계수는 3개 이상이다. (y-intercept, X1/X2...X_1/X_2...의 회귀계수 2개 +..)
  • 다항회귀모델은 선형모델이며, 다중선형회귀에서의 피쳐에 멀티플을 준 것이다. (이 이상 다루지는 않음)
  • Bias, Variance, 과소적합, 과적합. (아주 중요!!!)
    • 편향이 높다는 건 간단하게 말하면 학습 데이터를 잘 학습하지 못한 것이다. (과소적합)
    • 분산이 높다는 건 학습 데이터는 아주 잘(과도하게) 학습하였지만, 그렇기 때문에 새로운 데이터가 주어졌을 때 제대로 설명하지 못하는 것이다. (과적합)
    • 편향과 분산은 Trade-Off 관계다. (편향에러를 줄이려고 하면 분산이 높아지고, 분산에러를 줄이려고 하면 편향에러가 늘어난다)
    • 즉, 그 사이 어딘가의 Best Model을 찾아야 한다.
  • MAE, MSE, RMSE, R2R^2 (회귀 모델의 주요 평가 지표)
    • MAE(Mean Absolute Error): MAE는 잔차의 절대값을 하여 더한 것의 평균을 말한다.,
    • MSE(Mean Squared Error): MAE는 절대값을 먹였다면 이건 제곱을 해서 더한 것의 평균을 내는 것이다. 왜 이렇게 쓰는지는 여기 적으면 길어질 것 같으니 필요시 찾아볼 것.
    • RMSE: MSE에 루트 씌운 것.
    • R2R^2: 0-1의 값이며 1에 가까울수록 설명력이 올라간다고 볼 수 있다. 항상 좋은 것만은 아니라서 adjusted R2R^2도 있는데 나중에 배울 듯.
    • from sklearn.metrics에서 모두 제공해줌. mean_absolute_error(y_train, y_pred) 이런 식으로 예측 값과 실제값을 넣어주면 알아서 계산해준다.
    • y와 y^\hat{y}의 차이(residual, error)를 최소화하는 회귀계수를 찾는 것이 우리의 목표라는 걸 잊지 말자.

실습

  1. 시계열 데이터 기간을 기준으로 train, test data로 분리하기
    • 나는 df.loc[df.date > '2015-01-01', :] 이런 식으로 분리해줬다.
  2. 두 특성을 이용해 다중선형회귀 모델 만들기 (normalize 등 없이 진행)
    • 전날 했던 것과 동일하다. 피쳐에 1개가 아니라 여러 개 넣어주는 것만 다르다.
  3. 만들어진 모델의 회귀 계수와 절편 확인해보기
  4. MSE, MAE, RMSE, R2R^2를 훈련/테스트 데이터에서 확인해보기

Ridge Regression_0429

Key words

OneHotEncoding, Ridge Regression, 특성 선택(feature selection), train_test_split

Details

개념

  • Ridge Regression의 기본 컨셉은 다중선형회귀 모델에서 이어서 생각하면 더 편했다. 다중선형회귀 모델에서 일어나는 과적합을 방지하기 위해, 람다패널티를 주어 큰 의미 없는 피쳐의 영향력을 줄이겠다는 것이다. (편향을 좀 올리더라도 분산을 줄이는 방법으로 정규화(regularization)을 하는 것)
    • 가지고 있는 훈련 데이터가 충분하지 않다면 과적합이 될 가능성이 높기 때문에 그럴 때 사용할 수 있다고 기억하자. (만약 파라미터가 10001개 있는데, 500개의 데이터 밖에 없다면?!)
    • 람다 패널티가 커질수록 각 피쳐의 회귀계수의 값이 줄어들게 되는데, 패널티를 과하게 주면 모든 피쳐의 영향력이 거의 사라져 결국 y-intercept만 남는, 즉 기준 모델에 가까워진다. (기울기가 점점 눕게 된다) 따라서 적절한 람다값을 찾는 것도 중요하다.
    • 람다(lambda)는 alpha, regularization parameter, penalty term이라고도 부른다.
    • 최적의 람다 값을 알려면 여러 람다 값을 넣어보며 검증실험을 진행하면 된다. (cross-validataion에 대해선 차후 자세히 배운다고 한다)
    • from sklearn.linear_model import RidgeCV을 활용한다.
  • OneHotEncoding: categorical variable에 대해 수행한다. 원핫인코딩을 하면 해당 변수들이 모두 차수(차원)으로 더해지기 때문에 cardinality가 높은 경우(피쳐의 고유값이 많은 것을 말함) 유의해야 한다.
    • pandas의 get_dummies()를 통해 간단히 할 수도 있음.
    • category_encodersOneHotEncoder를 제일 많이 쓰는 것 같음. 사이킷런에도 있긴 한데, 이게 더 쓰기 편하다고 한다. 어떤 변수가 명목형이라 해줘야 하는지 내가 지정해줄 필요 없음. 아래와 같이 사용할 수 있다. train data에서만 fit하고 test data에서는 transform만 하는 것 유의해야 한다.
encoder = OneHotEncoder(use_cat_names = True)
X_train = encoder.fit_transform(X_train)
X_test = encoder.transform(X_test)
  • 특성 선택: 수많은 피쳐 중 목표에 알맞은 피쳐만을 어떻게 선택할 수 있을까?
    - feature engineering, 실무에서 가~장 많은 시간을 잡아먹는다. 모델의 성능에 큰 영향을 줄 수 있기 때문에 중요하다.
    - 타겟과 유사한 데이터인 독립변수는 제거해야 한다. 안그럼 과적합이 일어난다. 데이터 누수(data leakage)가 발생할 수 있다.
    - 사이킷런의 SelectKBest을 이용하면 설정한 K개의 유용한 피쳐를 쉽게 찾아낼 수 있다. (몇 개의 K가 적절할지는 직접 여러 번 테스트 해보면서 찾아가는 수 밖에 없다고 한다)

실습

  1. category_encoders를 통한 원핫인코딩 하기,train_test_split를 통해 훈련/테스트 데이터 분리하기.
  2. SelectKBest 이용하여 20개의 특성만 선택하기
  3. RidgeCV이용하여 리지 회귀모델 만들기
from sklearn.linear_model import RidgeCV

# 최적의 alpha값 찾기
alphas = [0, 0.001, 0.01, 0.1, 1] #하나씩 돌려볼 alpha(lambda)값. 평가지표가 가장 좋은 alpha를 찾는 것이 목표이다. 

model = RidgeCV(alphas = alphas, normalize = True, cv = 5) #cv = cross validation
model.fit(X_train_20, y_train) #학습

print('best alpha = ', model.alpha_)
print('best score = ', model.best_score_) # best alpha =  0.001 // best score =  0.5510507608242425
  1. test data에 모델 적용해 MAE를 계산해보고 모델 평가하기

Logistic Regression_0502

Key words

Train/Validation/Test data, Logistic Regression

Details

개념

  • Validation 데이터의 필요성. val_data는 모의고사고 test_data는 수능이다. test_data는 가능한 마지막 한 번만 확인해야 한다!!! (test_data로 학습하면 데이터 누수data leakage가 발생하여 모델의 성능을 완전 잘못 판단할 수 있다.)
    • 왜 val_data가 필요할까? 그 이유는 훈련 데이터로는 한 번에 완전하게 학습하기 어렵기 때문이다. 훈련 데이터로 다르게 튜닝한 여러 모델들을 다양하게 학습한 후 어떤 모델이 가장 나은지 model selection을 할 때 사용할 수 있다. (val_data는 train_data에서 분리하면 된다.)
    • 쉽게 말하면, 모델의 성능만을 확인하고자 할 때는 train/test 둘로만 나눠도 되지만, 여러 모델 중 어떤 모델이 성능이 가장 좋은지 확인하고 선택하기 위해선 검증 데이터가 필요한 것이다.
    • 만약 데이터가 적어 나누기가 애매한 경우 k-fold cross validation을 할 수 있는데, 물론 이때도 테스트 데이터는 따로 떼어둬야 한다. (훈련, 검증 데이터를 일정 비율로 나누어 모델을 만드는 방식을 hold-out validationd이라고 하며, K-fold cross validaion은 데이터를 K개의 그룹으로 나누어 랜덤하게 K번 교차하여 훈련, 검증 데이터를 만드는 방식을 말한다. 나중에 더 자세히 배울 듯)
    • 참고로 시계열 데이터는 랜덤하게 나누면 안된다.
  • Logistic Regression은 분류 문제를 다룬다!!!!!
    • 이름 regression이 들어간 것은 분류를 하는 과정에서 회귀를 사용하기 때문인 것 같다.
    • 로지스틱 회귀에서 기준모델은 최빈값(가장 많이 나온 클래스)이다.
    • 분류 문제에서는 데이터 불균형이 있을 수도 있어서 항상 타겟 범주가 어떤 비율로 이루어져있는지 확인해야 한다. 최소한 기준모델보다는 내가 만든 모델의 성능이 좋아야 한다고 기준을 잡을 수 있다.
    • 로지스틱 회귀 모델에서는 타겟의 각 범주에 들어갈 확률을 0-1 사이로 계산하게 된다. 기준 디폴트는 0.5인데 목적에 따라 다르게 세팅할 수도 있다. 만약 0에 들어갈 확률이 0.4, 1에 들어갈 확률이 0.6이라면 해당 샘플은 1에 할당하는 방식이다. (이 기준이 되는 확률을 임계치(threshold)라고 한다)(각 피쳐들의 계수(log_odds)를 구한 후 sigmoid 함수를 적용하는 방식이라고 하는데 솔직히 잘은 모르겠다)
    • 분류 모델에서의 평가지표는 회귀 모델에서의 평가지표와 다르다!!! 서로의 것을 가져다 쓰면 안된다. 이 실수는 자주 할 수 있을 것 같으니 유의하자!! (로지스틱 회귀 모델에는 잔차라는 개념이 아예 없다!)
    • 사이킷런에서 역시 기능을 제공해준다. from sklearn.linear_model import LogisticRegression

실습

  1. 데이터 전처리, 훈련/검증/테스트 세트로 나누기
  2. 로지스틱 회귀 모델 만들기
    • 항상 기준 모델을 먼저 만들어야 한다. from sklearn.metrics import accuracy_score를 통해 정확도 확인 가능하다. 이 기준 모델보다는 성능이 좋아야 한다는 점 기억!
## 로지스틱 회귀 학습 ##
from sklearn.linear_model import LogisticRegression

# data 구분
X_train = train_data.drop(columns = target)
X_val = val_data.drop(columns = target)
y_val = val_data[target]

# train data에 학습
logistic = LogisticRegression(max_iter=1000) #intance 생성
logistic.fit(X_train, y_train)

# val data에 적용해 스코어 확인해보기
print('검증 데이터에서의 정확도 = ', logistic.score(X_val, y_val)) #기준모델보다 훨씬 상승되었다.
  1. 범주형 성질을 지닌 특성을 찾아 원핫인코딩 하기
  2. 학습한 모델을 검증세트에서 최적화 시킨 후, 테스트 세트에서 딱 한번 정도 정확도 확인해보기
    • 모델 최적화란 하이퍼 파라미터를 조정해나가며 일반화를 목표로 나아가는 것을 말한다!! [피쳐 엔지니어링 > 모델링 > 하이퍼 파라미터 조정을 통한 모델 성능 개선] 이 flow를 기억하자.

Sprint Challenge_0503

스챌 관련 보안 이슈로 내용을 제거하였습니다.

다 맞았다!! 오예!

Sprint 회고

적어두었던 내용을 그대로 옮겨온다.

profile
B2B SaaS 회사에서 Data Analyst로 일하고 있습니다.

0개의 댓글