-
[Machine Learning] Logistic Regression 로지스틱회귀Data Science/Machine Learning & Deep Learning 2021. 2. 13. 00:34
로지스틱회귀는 회귀를 사용해 0과 1사이의 값으로 확률을 예측해,
그 확률이 정해진 값보다 큰지 작은지에 따라 어느 클래스에 속할 지를 더 가능성이 높은 범주로 분류해줍니다.
로지스틱회귀 연습에 많이 사용하는 Titanic 데이터를 사용해 보겠습니다.
www.kaggle.com/c/titanic/overview
Titanic - Machine Learning from Disaster
Start here! Predict survival on the Titanic and get familiar with ML basics
www.kaggle.com
Titanic 데이터는 훈련 데이터(train)와 테스트 데이터(test)로 구성되어 있습니다.
모델을 만들기에 앞서 훈련 데이터를 scikit-learn의 train_test_split메소드를 사용하여
훈련 데이터(test data)와 검증 데이터(validation data)로 나누어주겠습니다.
이처럼 훈련(train)/ 검증(validation)/ 테스트(test) 데이터로 나누어 모델을 학습하고 검증하는 방법을 hold-out 교차검증이라고 합니다.
from sklearn.model_selection import train_test_split train, val = train_test_split(train, random_state = 111)
훈련 데이터를 훈련 데이터와 검증 데이터로 나누어주는 이유는 훈련 데이터만으로는 모델을 완전하게 학습시키기 어렵기 때문입니다.
먼저 훈련 데이터로 모델을 학습하고 검증 데이터로 하이퍼파라미터 등 모델을 검증하여 모델을 선택하게 됩니다.
그 후 마지막으로 선택된 모델을 테스트 데이터를 이용해 딱 한번 예측을 합니다.
테스트 데이터는 훈련과 검증 과정에서 절대 사용하지 않는 것이 중요합니다!
모델을 만들기 앞서 기준모델을 설정하겠습니다.
# 타겟 설정 target = 'Survived' y_train = train[target] y_train.value_counts(normalize = True) # 타겟 범주 비율 확인
다수 범주를 기준 모델로 하여 예측을 하는 방법입니다.
# 기준모델 major = y_train.mode()[0] y_pred = [major]*len(y_train)
분류모델에서는 정확도를 평가지표로 사용합니다.
from sklearn.metrics import accuracy_score accuracy_score(y_train, y_pred)
이와 같이 기준 모델에 훈련데이터로 정확도를 확인해보면 위 훈련데이터의 다수 범주 비율 값과 같은 것을 알 수 있습니다.
이제 로지스틱회귀모델을 만들어 보겠습니다.
데이터에 범주형 변수가 있기 때문에 이를 변환하기 위하여 onehotencoder를 사용해주고,
결측치를 평균으로 대체하기 위해 simpleimputer, 특성들을 표준화하기 위해서 standardscaler를 사용한 모델을 만들어 주겠습니다.
## 로지스틱회귀 모델 from category_encoders import OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler # feature/ target 설정 features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] target = 'Survived' X_train = train[features] y_train = train[target] X_val = val[features] y_val = val[target] # 원핫인코딩 encoder = OneHotEncoder(use_cat_names=True) X_train_encoded = encoder.fit_transform(X_train) X_val_encoded = encoder.transform(X_val) # 결측치 imputer = SimpleImputer(strategy='mean') X_train_imputed = imputer.fit_transform(X_train_encoded) X_val_imputed = imputer.transform(X_val_encoded) # 표준화 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train_imputed) X_val_scaled = scaler.transform(X_val_imputed) # 모델 학습 model = LogisticRegression(random_state=1) model.fit(X_train_scaled, y_train)
만들어진 모델을 검증 데이터를 이용하여 성능을 검증해보겠습니다.
# 예측 y_pred = model.predict(X_val_scaled) accuracy_score(y_val, y_pred) # 검증데이터세트 정확도
계수를 통해서 특성이 타겟과 어떠한 상관관계를 가지고 있는지, 타겟에 얼마나 영향을 가지는 지를 알 수 있습니다.
# 계수 coefficients = pd.Series(model.coef_[0], X_train_encoded.columns)
간단한 시각화를 해보면 타겟과 특성의 관계를 한눈에 알아보기 쉽습니다.
다음 그래프를 보면 타겟에 가장 큰 영향을 주는 변수는 좌석등급(Pclass)임을 알 수 있습니다.
좌석 등급이 낮고, 나이가 어릴수록 생존할 가능성이 높으며, 남자보다는 여자가 생존가능성이 높다는 것을 확인할 수 있습니다.
만든 모델을 이용하여 예측한 결과를 캐글에 제출하는 방법입니다.
다음 두 칼럼으로 이루어진 형태의 파일을 제출해야합니다.
- PassengerId (sorted in any order)
- Survived (contains your binary predictions: 1 for survived, 0 for deceased)
y_pred_test = model.predict(X_test_scaled) # 테스트 데이터로 예측 submission = test[['PassengerId']].copy() submission['Survived'] = y_pred_test
다음과 같이 만들어 진 것을 볼 수 있습니다.
kaggle에 제출하기 위해 만들어진 데이터셋을 csv파일로 저장하겠습니다.
submission.to_csv('submission.csv', index=False)
저는 코랩(colab)을 사용했기 때문에 좌측 파일 아이콘을 눌러 들어가면 'submission.csv' 파일이 생성되어 있는 것을 볼 수 있습니다.
해당 파일을 다운받아 캐글에 제출하시면 됩니다!
'Data Science > Machine Learning & Deep Learning' 카테고리의 다른 글
[Machine Learning] 모델 해석 - Feature Importance, Permutation Importance, PDP, SHAP (0) 2021.03.03 [Machine Learning] 교차검증 - Cross Validation, RandomizedSearchCV, GridSearchCV (0) 2021.02.21 [Machine Learning] RandomForest 랜덤 포레스트 & Threshold, ROC Curve, AUC (0) 2021.02.20 [Machine Learning] Linear Regression - 다중선형회귀 (0) 2021.02.07 [Machine Learning] Linear Regression - 단순선형회귀 (0) 2021.02.04