본문 바로가기

CodeStates

[머신러닝 - 선형모델]#4

목차

 

#1

 

  • 선형회귀(Linear Regression)
  • 기준 모델(Baseline Model)
  • 예측 모델(Predictive Model)
  • Scikit-learn을 이용한 선형회귀모델 - 단순 선형 회귀(Simple Linear Regression)
  • 선형 회귀 모델 계수, 회귀계수 (Coeeficients)

 

#2

  • 다중선형회귀(Multiple Linear Regression)
  • Scikit-learn을 이용한 선형회귀모델 - 다중선형회귀(Multiple Linear Regression) 
    1)Categorical한 데이터를 수치화 시키는법
    2)하나의 데이터에서 Train/Test를 나누는 방법
    3)다중선형회귀 모델링
    4)회귀계수 해석
  • Overfitting과 Underfitting
  • 다항회귀모델

 

 

 

 

#3

  • 릿지회귀 (Ridge Regression)
  • Feature Engineering - 특성 선택 (Feature Selection)
    1)SelectKBest이용
  • Ridge Regression 모델링
    -Cross Validation

 

#4

  • 훈련/검증 /테스트
  • 분류(Classification)
  • 로지스틱 회귀모델

 

 

#4

 


훈련/ 검증/ 테스트:

캐글에서는 train데이터와 test데이터를 제공하는데 test데이터에는 tartget값이 제외되어있다.

그 이유는 모델의 일반화 성능을 올바르게 측정하기 위해서이다. 모델을 생성시 test데이터에 맞추기 위해 모델을 수정하다보면, 모델은 test에 Overfitting되어 일반화의 성능이 떨어지기 때문이다. 그래서 train데이터를 train데이터와 Validation데이터로 나누어 train데이터로 모델을 생성하고 생성한 여러 모델들중 하나를 선택하기 위해 validation데이터로 검증한다.

 

예시) 학습 훈련을 해서 학교 시험으로 검증을 하고 마지막에 수능시험으로 테스트를 하는 것과 같은 이치이다.

훈련 : 학교 공부

검증 : 학교 시험

테스트 : 수능 시험

 

train 모델을 개발할 때, 모델선택(Model selection)을 하고 선택한 모델의 하이퍼파라미터(hyperparameter) 튜닝을 하게 된다. 튜닝의 효과를 확인하기 위해서 Validation이 필요하다. ※test 데이터로 하이퍼파라미터 튜닝을 하면 절대로 안됨.
데이터가 많다면 전체 데이터를 훈련/검증/테스트 세트로 나누면 되지만, 데이터 수가 적을 경우 테스트 세트를 미리 분리하고 train validation을
K-fold 교차검증(k-fold cross-validation) 하면 된다.

 

 


분류(Classification) :

분류문제의 기준모델 - Majority class basline

분류 문제는 보통 타겟 변수에서 가장 빈번히 나타나는 범주를 기준모델로 설정한다.

또한 분류 문제에서 타겟 변수는 편중된 범주의 비율을 가지고 있는 경우가 많다.

ex) 기준 모델 (클래스 1: 클래스 0 = 1:9) -> 모두 0이라고 예측하면 Accuaracy가 90%가 나옴.

-> 이러한 경우 기준 모델보다 더 좋은 성능을 가지는 모델을 만들어야함.

 

1)타겟의 범주의 비율을 확인.

target = '타겟'
y_train = train[target]
y_train.value_counts(normalize=True)

[0] : 0.625749 [1] : 0.374251 -> 대략 62.5 : 37.5의 비율을 가지고 있다.

 

from sklearn.metrics import accuracy_score

###기준 모델 생성.
#majority class를 탐색.
major = y_train.mode()[0]


###Train
#예측값에 major값을 넣음.
y_pred_train = [major] * len(y_train)
###기준 모델과 train 타겟을 비교.
print("training accuracy: ", accuracy_score(y_train, y_pred_train))

###Validation -> y_train과 y_val의 데이터 길이가 다르기 때문에 따로 수행. major는 같음.
#예측값에 major값을 넣음. 
y_pred_val = [major] * len(y_val) 
###기준 모델과 val 타겟을 비교.
print("training accuracy: ", accuracy_score(y_val, y_pred_val))

training accuracy: 0.6257

validation accuracy: 0.5874

 


 

 

 


로지스틱 회귀모델 :

비선형 함수로서 타겟의 변수의 범주를 0과 1로 사용하기위해, 예측 확률 값을 얻기 위해 사용한다. 확률 값을 사용하여 기준값 보다 크면 1 그렇지 않으면 0으로 예측하는 방식으로 분류를 진행한다.

0<= P(x) <= 1

 

하지만 위와 같이 비선형적이라 직관적으로 해석하기에 어려움이있는데, 이를 오즈(Odds)를 사용해 선형결합형태로 변환해 쉽게 해석할 수 있다. 오즈란 실패확률에 대한 성공확률의 비율을 뜻한다.

Odds = 10, (성공확률 = 10 * 실패확률)

p = 성공확률, 1-p = 실패확률

p = 1 일때 odds =

p = 0 일때 odds = 0

 

Logit Transformation :

오즈에 로그를 취해 변환하는 것으로, 로지스틱함수를 선형형태로 만들어 coef(회귀계수)의 의미를 해석하기 쉽게 한다.

x의 증가량에 따른 로짓(ln(odds))의 증가/감소를 해석 할 수 있다.

odds 확률로 해석을 하려면 exp(계수) = p 를 계산해서 특성 1단위 증가당 확률이 p배 증가한다고 해석한다.

기존 로지스틱형태의 y 값이 0~1의 범위를 가졌다면 로짓은 -∞ ~ 범위를 가진다.

 

로지스틱을 이용한 모델링 예시

from sklearn.linear_model import LogisticRegression

##타겟과 특성 지정
target = '타겟'
features = df.drop([target],axis=1).columns

##타겟 데이터와 특성 데이터 분리
X = df[features]
y = df[target]

#trian과 test의 비율을 8:2로 데이터를 나눈다.
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8, test_size = 0.2, random_state=2)

#나눠진 train데이터에서 Validation데이터를 나누기위해
#trian를 다시 train과 validation로 비율이 8:2되도록 데이터를 나눈다.
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, train_size = 0.8, test_size = 0.2, random_state=2)

print(f'Train : \nX : {X_train.shape}, y : {y_train.shape}\n\n\
Val : \nX : {X_val.shape}, y : {y_val.shape}\n\n\
Test : \nX : {X_test.shape}, y : {y_test.shape}')


##로직 리그렉션 모델 인스턴스
model = LogisticRegression(max_iter=1000)
##로직 리그렉션 모델 학습
model.fit(X_train,y_train)



##학습된 모델로 검증하기 위해 validation데이터르 예측 타겟값 생성
predict_val = model.predict(X_val)


print('\n학습세트 정확도 : ', model.score(X_train, y_train))
print('\n검증세트 정확도', model.score(X_val, y_val))
print("\n검증세트 정확도: ", accuracy_score(y_val, predict_val))


###계수확인
coefficients = pd.Series(model.coef_[0], X_train.columns)
coefficients

 

'CodeStates' 카테고리의 다른 글

[머신러닝 - 트리모델]  (0) 2021.04.14
[note] 파이프라인  (0) 2021.04.14
[머신러닝 - 선형모델]#3  (0) 2021.04.08
[머신러닝 - 선형모델]#2  (0) 2021.04.08
[머신러닝 - 선형모델]#1  (0) 2021.04.07