본문 바로가기
기계학습(ML)/Linear Models

n214 Logistic Regression / validation

by kiimy 2021. 6. 14.
728x90
728x90

 Test set(테스트 데이터)은 validation set으로 사용할 모델이 결정 된 후, 마지막으로 딱 한번 해당 모델의 예상되는 성능을 측정하기 위해 사용된다. 이미 validation set은 여러 모델에 반복적으로 사용되었고 그중 운 좋게 성능이 보다 더 뛰어난 것으로 측정되어 모델이 선택되었을 가능성이 있다. 때문에 이러한 오차를 줄이기 위해 한 번도 사용해본 적 없는 test set을 사용하여 최종 모델의 성능을 측정하게 된다.

최종테스트 결과가 마음에 들지 않는다고 모델을 또 수정하여 테스트 세트를 더 잘 예측하는 모델을 만든다면 그 모델은 테스트세트에 과적합하여 일반화 성능이 떨어지게 될 수 있습니다

* Train = 모델을 Fit 하는데 사용합니다

* Test = 성능이 좋은지 최종 확인( 최종성능 평가)

==>훈련이나 검증과정에서 사용하지 않도록 주의

* Validation = 상환을 허용하며 성능을 향상 시켜줌( 여러 모델중 최종성능을 평가하기위해 )

==>예측 모델을 선택하기 위해서 예측의 오류를 측정할 때 사용합니다.

* 모델 선택( Model Selection ) 

학습 모델을 개발할 때, 모델선택(Model selection) 을 수행해야 합니다. 이때 하이퍼파라미터(hyperparameter) 튜닝을 하게 되는데 튜닝의 효과를 확인하기 위해서 검증세트가 필요합니다. 테스트 세트로 하이퍼파라미터 튜닝을 하면 절대로 안됩니다. 데이터가 많을 경우에는 전체 데이터를 훈련/검증/테스트 세트로 나누면 되지만, 상대적으로 데이터 수가 적을 경우 K-fold 교차검증(k-fold cross-validation) 을 진행할 수 있습니다.

 

* hyperparameter = 모델링할 때 사용자가 직접 세팅해주는 값

( earning rate나 서포트 벡터 머신에서의 C, sigma 값, KNN에서의 K값 등..)

많은 사람들이 그런 값들을 조정할 때 그냥 '모델의 파라미터를 조정한다'라는 표현 X 원칙적으로는 '모델의 하이퍼 파라미터를 조정한다

 * Logistic Regression (= 분류 Classification ) == 확률값

-> Linear Function --> Logistic(=sigmoid) Function 사용시 0과 1 값을 가짐

= 이항변수가 종속변수일때 ==> 변수가 가지는 값 2가지 경우( Yes, no 등 )

해결하고자 하는 문제가 무엇인가?

특정 수치를 예측 -> 회귀  (타겟 변수의 평균)

==> target 변수값이 양과 음(= ex 생존인지 아닌지 분명하게 분류 x)

주어진 데이터를 분류 및 분류 기준을 파악 -> 분류 (가장 빈번하게 나타나는 범주)

==> 범주를 0, 1(= 각 범주의 예측확률 구할 수 있음)

  • 절대로 회귀 평가지표를 _분류_에 사용하시면 안됩니다. 그 반대도 마찬가지 입니다. MAE X
  • 정확도(Accuracy) 는 분류문제에서 사용하는 평가지표입니다.
  • 특정 볌주에 속할 확률을 추정
  • 로지스틱회귀의 계수는 비선형 함수 내에 있어서 직관적으로 해석하기가 어려움==> 로짓변환 사용

* odds = 실패확률에 대한 성공확률의 비

(= odds = 4 이면 성공확률이 실패확률의 4배 라는 뜻,

분류문제에서는 클래스 1 확률에 대한 클래스 0 확률의 비)

 

로지스틱회귀의 계수는 비선형 함수 내에 있어서 직관적으로 해석하기가 어려운데 

오즈(Odds) 를 사용하면 선형결합 형태로 변환 가능해 보다 쉽게 해석이 가능

오즈에 로그를 취해 변환하는 것을 로짓변환(Logit transformation)

 

특성 X의 증가에 따라 로짓(ln(odds))가 얼마나 증가(or감소)했다고 해석

==> exp(계수) = p 를 계산해서 특성 1단위 증가당 확률이 p배 증가한다고 해석

오즈(odds) = P(성공확률) / (1-P) (실패확률)

==> P와 오즈비는 비슷 

0 < P < 1

0 < 1-P < 1

* P가 0에 가까울수록 오즈비는 0으로 접근

* P가 1에 가까울수록 오지비는 무한대

0 < odds ration < ∞ 

-∞ < log(odds ratio) < ∞ 

EX) 종속변수가 0과 1 // 모든값이 0이면 오즈비 최소값 0 ( -∞ ), 모든값이 1이면 오즈비 최대값 1 ( ∞ )

-∞ < 이항변수==종속변수 < ∞ (마치 연속변수처럼) 

so, 이 이항변수를 로짓으로 바꾸면 OLS회귀분석 가능


 

from sklearn.model_selection import train_test_split

train, val = train_test_split(train, random_state=2)

train, val
  1. Target을 설정 후 y_train 설정 y_train = train[target]
  2. # mode(): Return the highest frequency value in a Series.  major = y_train.mode()[0
  3. y_pred= [major] * len(y_train)
  4. accuracy_score( y_train, y_pred ) #최다 클래스의 빈도가 정확도가 됩니다.
  5. accuracy_score( y_val, y_pred ) # 검증세트 에서도 정확도를 확인
  6. ==> y_val= val[target] / y_pred= [major] * len(y_val)
  • 카테고리 데이터 처리를 위해 OneHotEncoder
  • 결측치(missing value) 처리를 위한 SimpleImputer
  • 특성들의 척도를 맞추기 위해 표준정규분포로 표준화하는(평균=0, 표준편차=1) StandardScaler
X_train_scaled.T[0].mean(), X_train_scaled.T[0].std() == index 0인 것의 scaler 보여줌

Transform 해주는 이유 : pandas column으로 접근 하기 위함

              

1. 모델 설정

linear_model = LinearRegression() 



2. feature 설정

features = ['Pclass', 'Age', 'Fare']

X_train = train[features]

X_val = val[features]



3. Age, Cabin의 결측치를 평균 값으로 채웁니다.

from sklearn.impute import SimpleImputer

## default, imputing 'mean' value

imputer = SimpleImputer()

X_train_imputed = imputer.fit_transform(X_train)

X_val_imputed = imputer.transform(X_val)


# 학습 linear_model.fit(X_train_imputed, y_train)

# 예측 pred = linear_model.predict(X_val_imputed)

linear_model.coef_

#coef_ == array 형태로 나오기 때문에 pd.Series로 할려면 model.coef_[0] 리스트 형태로 가져와야함


from sklearn.linear_model import LogisticRegression

logistic = LogisticRegression()

# 학습 logistic.fit(X_train_imputed, y_train)

# 예측 pred = logistic.predict(X_val_imputed)

logistic.coef_

*계수가 양수인 경우 생존의 가능성을 높이고 음수인 경우 생존 가능성을 낮추는 것으로 해석할 수 있습니다.
728x90

댓글