파이썬에서 로지스틱 회귀 구현하기: 종합 가이드
파이썬의 Scikit-Learn 라이브러리를 사용하여 로지스틱 회귀의 힘을 활용하세요. 데이터 전처리, 결측치 처리, 특징 선택, 효율적인 분류 모델 구축 방법을 배웁니다. 이 단계별 튜토리얼을 통해 머신러닝 기술을 향상시키세요.
로지스틱 회귀 소개
로지스틱 회귀는 주로 이진 분류 작업에 사용되는 머신러닝의 기본 알고리즘입니다. 연속적인 결과를 예측하는 선형 회귀와 달리, 로지스틱 회귀는 하나 이상의 예측 변수를 기반으로 이진 결과의 확률을 추정합니다.
이 종합 가이드에서는 Scikit-Learn을 사용하여 파이썬에서 로지스틱 회귀 모델을 구현하는 과정을 살펴봅니다. 데이터 전처리, 결측치 처리, 범주형 변수 인코딩, 특징 선택, 스케일링, 모델 평가 등을 다룰 것입니다. 추가로, 로지스틱 회귀의 성능을 K-최근접 이웃(KNN) 분류기와 비교합니다.
목차
로지스틱 회귀 이해하기
로지스틱 회귀는 분류 작업에 사용되는 선형 모델입니다. 특정 입력이 특정 클래스에 속할 확률을 예측합니다. 출력은 로지스틱 함수(시그모이드)를 사용하여 변환되며, 이로써 출력 값이 0과 1 사이에 있도록 합니다.
주요 특징:
- 이진 분류: 타겟 변수가 두 개의 클래스를 가지는 시나리오에 이상적입니다.
- 확률 추정: 클래스 소속에 대한 확률을 제공합니다.
- 선형 결정 경계: 입력 특징과 결과의 로그 오즈 사이에 선형 관계가 있다고 가정합니다.
환경 설정
코딩에 착수하기 전에 필요한 라이브러리가 설치되어 있는지 확인하세요. 우리는 데이터 조작을 위해 Pandas, 수치 연산을 위해 NumPy, 머신러닝 알고리즘을 위해 Scikit-Learn, 데이터 시각화를 위해 Seaborn을 사용할 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
import pandas as pd import numpy as np import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.impute import SimpleImputer from sklearn.preprocessing import OneHotEncoder, LabelEncoder, StandardScaler from sklearn.compose import ColumnTransformer from sklearn.feature_selection import SelectKBest, chi2 from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression import matplotlib.pyplot as plt |
데이터 탐색 및 전처리
이 튜토리얼에서는 Weather Australia Dataset을 사용할 것입니다. 이 데이터셋은 다양한 호주 도시의 기상 관측 기록을 포함하고 있습니다.
데이터 로드하기
1 2 |
# Load the dataset data = pd.read_csv('weatherAUS.csv') |
데이터 구조를 이해하기 위해 마지막 몇 행을 살펴보겠습니다:
1 |
data.tail() |
샘플 출력:
Date | Location | MinTemp | MaxTemp | Rainfall | Evaporation | … | RainToday | RISK_MM | RainTomorrow |
---|---|---|---|---|---|---|---|---|---|
2017-06-20 | Uluru | 3.5 | 21.8 | 0.0 | NaN | … | No | 0.0 | No |
2017-06-21 | Uluru | 2.8 | 23.4 | 0.0 | NaN | … | No | 0.0 | No |
2017-06-22 | Uluru | 3.6 | 25.3 | 0.0 | NaN | … | No | 0.0 | No |
2017-06-23 | Uluru | 5.4 | 26.9 | 0.0 | NaN | … | No | 0.0 | No |
2017-06-24 | Uluru | 7.8 | 27.0 | 0.0 | NaN | … | No | 0.0 | No |
특징과 타겟 변수 분리하기
1 2 3 4 5 |
# Features X = data.iloc[:, :-1] # Target variable y = data.iloc[:, -1] |
특정 데이터셋 요구사항 처리:
Weather Australia 데이터셋만 사용하는 경우, 특정 열을 삭제해야 할 수 있습니다:
1 |
X.drop('RISK_MM', axis=1, inplace=True) |
결측치 처리
실제 데이터셋에는 종종 결측치가 포함되어 있습니다. 적절한 처리는 모델의 정확성을 보장하는 데 중요합니다.
수치 데이터 처리
수치형 결측치는 각 열의 평균값으로 대체하기 위해 Scikit-Learn의 SimpleImputer
를 사용할 것입니다.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.impute import SimpleImputer # Identify numerical columns numerical_cols = X.select_dtypes(include=['int64', 'float64']).columns # Initialize the imputer imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # Fit and transform the data X[numerical_cols] = imp_mean.fit_transform(X[numerical_cols]) |
범주형 데이터 처리
범주형 변수의 결측치는 가장 빈번한 범주로 대체합니다.
1 2 3 4 5 6 7 8 |
# Identify string columns string_cols = X.select_dtypes(include=['object']).columns # Initialize the imputer imp_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # Fit and transform the data X[string_cols] = imp_mode.fit_transform(X[string_cols]) |
범주형 변수 인코딩
머신러닝 모델은 수치형 입력을 요구하므로, 범주형 변수를 One-Hot 인코딩과 레이블 인코딩을 사용하여 변환할 것입니다. 이는 고유한 범주의 수에 따라 결정됩니다.
원-핫 인코딩
고유한 범주가 적은 범주형 변수에 이상적입니다.
1 2 3 4 5 6 7 8 9 |
def OneHotEncoderMethod(indices, data): columnTransformer = ColumnTransformer( transformers=[('encoder', OneHotEncoder(), indices)], remainder='passthrough' ) return columnTransformer.fit_transform(data) one_hot_indices = [X.columns.get_loc(col) for col in string_cols if X[col].nunique() <= 10] X = OneHotEncoderMethod(one_hot_indices, X) |
레이블 인코딩
이진 범주형 변수에 적합합니다.
1 2 3 4 5 6 7 |
def LabelEncoderMethod(series): le = LabelEncoder() return le.fit_transform(series) binary_cols = [col for col in string_cols if X[col].nunique() == 2] for col in binary_cols: X[col] = LabelEncoderMethod(X[col]) |
X의 인코딩 선택
두 개 이상의 범주를 가지는 범주형 변수(및 특정 임계값 이상)에 대해서는 레이블 인코딩을 사용하고, 그렇지 않은 경우 원-핫 인코딩을 적용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def EncodingSelection(X, threshold=10): string_cols = X.select_dtypes(include=['object']).columns one_hot_encoding_indices = [] for col in string_cols: unique_count = X[col].nunique() if unique_count == 2 or unique_count > threshold: X[col] = LabelEncoderMethod(X[col]) else: one_hot_encoding_indices.append(X.columns.get_loc(col)) X = OneHotEncoderMethod(one_hot_encoding_indices, X) return X X = EncodingSelection(X) |
특징 선택
모델 성능을 향상시키고 과적합을 줄이기 위해, 카이제곱 검정을 사용하여 상위 특징을 선택합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from sklearn.feature_selection import SelectKBest, chi2 from sklearn.preprocessing import MinMaxScaler # Initialize SelectKBest kbest = SelectKBest(score_func=chi2, k=10) # Scale features scaler = MinMaxScaler() X_scaled = scaler.fit_transform(X) # Fit SelectKBest kbest.fit(X_scaled, y) # Get top features best_features = np.argsort(kbest.scores_)[-2:] # Selecting top 2 features features_to_delete = np.argsort(kbest.scores_)[:-2] X = np.delete(X, features_to_delete, axis=1) print(f"Shape after feature selection: {X.shape}") |
출력:
1 |
Shape after feature selection: (142193, 2) |
특징 스케일링
스케일링은 특징이 모델의 성능에 동등하게 기여하도록 보장합니다.
표준화
데이터의 평균을 0, 표준 편차를 1로 변환합니다.
1 2 3 4 5 6 7 |
from sklearn.preprocessing import StandardScaler sc = StandardScaler(with_mean=False) sc.fit(X_train) X_train = sc.transform(X_train) X_test = sc.transform(X_test) |
모델 학습
K-최근접 이웃(KNN)과 로지스틱 회귀라는 두 가지 분류 모델을 비교할 것입니다.
훈련-테스트 분할
데이터를 훈련 세트와 테스트 세트로 분할하면 모델 성능을 효과적으로 평가할 수 있습니다.
1 2 3 4 5 6 7 8 |
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=1 ) print(f"Training set shape: {X_train.shape}") print(f"Testing set shape: {X_test.shape}") |
출력:
1 2 |
Training set shape: (113754, 2) Testing set shape: (28439, 2) |
K-최근접 이웃 (KNN)
KNN은 분류와 회귀에 사용되는 간단한 인스턴스 기반 학습 알고리즘입니다.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # Initialize KNN with 3 neighbors knnClassifier = KNeighborsClassifier(n_neighbors=3) knnClassifier.fit(X_train, y_train) # Predict and evaluate y_pred_knn = knnClassifier.predict(X_test) knn_accuracy = accuracy_score(y_pred_knn, y_test) print(f"KNN Accuracy: {knn_accuracy:.2%}") |
출력:
1 |
KNN Accuracy: 80.03% |
로지스틱 회귀
이진 분류 작업에 강력한 알고리즘인 로지스틱 회귀는 이진 결과의 확률을 추정합니다.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.linear_model import LogisticRegression # Initialize Logistic Regression LRM = LogisticRegression(random_state=0, max_iter=200) LRM.fit(X_train, y_train) # Predict and evaluate y_pred_lr = LRM.predict(X_test) lr_accuracy = accuracy_score(y_pred_lr, y_test) print(f"Logistic Regression Accuracy: {lr_accuracy:.2%}") |
출력:
1 |
Logistic Regression Accuracy: 82.97% |
모델 성능 평가
KNN과 로지스틱 회귀 모두 데이터셋에서 상당한 정확도를 제공하지만, 이 시나리오에서는 로지스틱 회귀가 KNN보다 더 우수한 성능을 보입니다.
모델 | 정확도 |
---|---|
K-최근접 이웃 | 80.03% |
로지스틱 회귀 | 82.97% |
하이퍼파라미터 튜닝
하이퍼파라미터를 최적화하면 모델 성능을 더욱 향상시킬 수 있습니다. 로지스틱 회귀의 경우, C
(정규화 강도의 역수)와 solver
같은 매개변수를 조정할 수 있습니다. 마찬가지로, KNN의 n_neighbors
도 조정할 수 있습니다.
예제: 로지스틱 회귀를 위한 GridSearchCV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from sklearn.model_selection import GridSearchCV # Define parameter grid param_grid = { 'C': [0.01, 0.1, 1, 10, 100], 'solver': ['liblinear', 'lbfgs'] } # Initialize GridSearchCV grid = GridSearchCV(LogisticRegression(max_iter=200), param_grid, cv=5) grid.fit(X_train, y_train) print(f"Best Parameters: {grid.best_params_}") print(f"Best Cross-Validation Accuracy: {grid.best_score_:.2%}") |
출력:
1 2 |
Best Parameters: {'C': 1, 'solver': 'lbfgs'} Best Cross-Validation Accuracy: 83.25% |
최적의 매개변수 적용:
1 2 3 4 5 6 7 8 |
# Initialize Logistic Regression with best parameters best_lr = grid.best_estimator_ best_lr.fit(X_train, y_train) # Predict and evaluate y_pred_best_lr = best_lr.predict(X_test) best_lr_accuracy = accuracy_score(y_pred_best_lr, y_test) print(f"Optimized Logistic Regression Accuracy: {best_lr_accuracy:.2%}") |
출력:
1 |
Optimized Logistic Regression Accuracy: 83.00% |
결론
이 가이드에서는 데이터 전처리부터 모델 평가까지 전체 머신러닝 파이프라인을 보여주며, 파이썬에서 로지스틱 회귀 모델을 성공적으로 구현했습니다. 결측치 처리, 범주형 변수 인코딩, 관련 특징 선택, 스케일링을 통해 데이터셋을 최적화하여 우수한 모델 성능을 달성했습니다. 또한, 로지스틱 회귀와 KNN을 비교함으로써 각 알고리즘의 강점을 확인했으며, 이 맥락에서는 로지스틱 회귀가 약간 더 우수한 성능을 보였습니다.
주요 시사점:
- 데이터 전처리: 높은 모델 정확성을 달성하는 데 필수적입니다.
- 특징 선택: 과적합을 줄이고 성능을 향상시키는 데 도움이 됩니다.
- 모델 비교: 여러 모델을 비교하여 최상의 성능을 보이는 모델을 식별하는 것이 중요합니다.
- 하이퍼파라미터 튜닝: 모델 성능을 최적화하는 데 필수적입니다.
이러한 기술을 활용하여 특정 데이터셋과 요구사항에 맞는 견고하고 효율적인 분류 모델을 구축하세요.
키워드: 로지스틱 회귀, 파이썬, Scikit-Learn, 머신러닝, 데이터 전처리, 분류 모델, K-최근접 이웃, 특징 선택, 하이퍼파라미터 튜닝, 데이터 사이언스 튜토리얼
메타 설명: Scikit-Learn을 사용하여 파이썬에서 로지스틱 회귀를 구현하는 방법을 배우세요. 이 종합 가이드는 데이터 전처리, 결측치 처리, 특징 선택, 모델 평가를 다루며, 최적의 성능을 위해 로지스틱 회귀와 KNN을 비교합니다.