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
- Target을 설정 후 y_train 설정 y_train = train[target]
- # mode(): Return the highest frequency value in a Series. major = y_train.mode()[0]
- y_pred= [major] * len(y_train)
- accuracy_score( y_train, y_pred ) #최다 클래스의 빈도가 정확도가 됩니다.
- accuracy_score( y_val, y_pred ) # 검증세트 에서도 정확도를 확인
- ==> 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_
*계수가 양수인 경우 생존의 가능성을 높이고 음수인 경우 생존 가능성을 낮추는 것으로 해석할 수 있습니다.
'기계학습(ML) > Linear Models' 카테고리의 다른 글
n213 Ridge Regression, onehotencoding (0) | 2021.06.12 |
---|---|
n212 Multiple Linear Regression / 과적합 과소적합 (0) | 2021.06.12 |
n211 Simple Regression (0) | 2021.06.12 |
댓글