move84

머신러닝 전처리 자동화 도구 소개 (scikit-learn 파이프라인) 본문

머신러닝

머신러닝 전처리 자동화 도구 소개 (scikit-learn 파이프라인)

move84 2025. 4. 15. 07:23
반응형

머신러닝 모델을 개발할 때 데이터 전처리 과정은 매우 중요합니다. 데이터 전처리는 모델의 성능을 향상시키고, 과적합을 방지하는 데 도움을 줍니다. 이 글에서는 scikit-learn 파이프라인을 사용하여 머신러닝 전처리 과정을 자동화하는 방법을 소개합니다. 파이프라인을 사용하면 여러 전처리 단계를 순차적으로 연결하여 코드를 간결하게 유지하고, 모델 개발 과정을 효율적으로 관리할 수 있습니다.

---

🛠️ **Scikit-learn 파이프라인 소개**  
Scikit-learn 파이프라인은 여러 개의 변환기(transformer)와 하나의 추정기(estimator)를 연결하여 머신러닝 워크플로우를 자동화하는 도구입니다. 변환기는 데이터를 변환하는 역할을 하며 (예: StandardScaler, MinMaxScaler), 추정기는 최종적으로 모델을 학습하고 예측하는 역할을 합니다 (예: LogisticRegression, RandomForestClassifier). 파이프라인을 사용하면 데이터 전처리, 특성 추출, 모델 학습 등의 단계를 하나의 객체로 묶어 관리할 수 있습니다.

파이프라인의 장점은 다음과 같습니다.

*   **코드 간결성**: 여러 단계의 전처리를 하나의 파이프라인으로 묶어 코드를 간결하게 유지합니다.
*   **재사용성**: 파이프라인을 한 번 정의하면 동일한 전처리 단계를 여러 번 반복할 필요가 없습니다.
*   **오류 감소**: 전처리 단계를 수동으로 적용할 때 발생할 수 있는 실수를 줄여줍니다.
*   **교차 검증 용이성**: 파이프라인을 교차 검증과 함께 사용하여 모델의 성능을 더욱 정확하게 평가할 수 있습니다.

---

⚙️ **파이프라인 구성 요소**  
파이프라인은 여러 개의 단계를 순차적으로 연결하여 구성됩니다. 각 단계는 변환기 또는 추정기로 이루어집니다. Scikit-learn에서 제공하는 주요 변환기는 다음과 같습니다.

*   **StandardScaler**: 데이터를 평균이 0, 분산이 1이 되도록 정규화합니다.
*   **MinMaxScaler**: 데이터를 0과 1 사이의 값으로 정규화합니다.
*   **OneHotEncoder**: 범주형 데이터를 one-hot 벡터로 변환합니다.
*   **SimpleImputer**: 결측값을 특정 값으로 대체합니다.
*   **PolynomialFeatures**: 다항 특성을 생성합니다.
*   **PCA**: 주성분 분석을 통해 차원을 축소합니다.

파이프라인의 마지막 단계는 추정기입니다. 추정기는 데이터를 학습하여 예측 모델을 생성합니다. Scikit-learn에서 제공하는 주요 추정기는 다음과 같습니다.

*   **LogisticRegression**: 로지스틱 회귀 모델을 학습합니다.
*   **LinearRegression**: 선형 회귀 모델을 학습합니다.
*   **DecisionTreeClassifier**: 결정 트리 모델을 학습합니다.
*   **RandomForestClassifier**: 랜덤 포레스트 모델을 학습합니다.
*   **SVC**: 서포트 벡터 머신 모델을 학습합니다.

---

🧪 **파이프라인 예제 코드**  
다음은 Scikit-learn 파이프라인을 사용하여 데이터 전처리와 모델 학습을 자동화하는 예제 코드입니다.

```python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# 데이터프레임으로 변환 (결측치 처리를 위해)
X = pd.DataFrame(X, columns=iris.feature_names)

# 일부 데이터를 결측치로 만들기
import numpy as np
X.iloc[:10, 0] = np.nan # 처음 10개 행의 첫 번째 열을 결측치로 설정
X['categorical_feature'] = ['A', 'B', 'A', 'C', 'B'] * 30  # 범주형 특성 추가

# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 파이프라인 정의
# 1. 결측치 처리 (SimpleImputer)
# 2. 범주형 변수 처리 (OneHotEncoder)
# 3. 스케일링 (StandardScaler)
# 4. 로지스틱 회귀 (LogisticRegression)
pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='mean')),  # 결측치를 평균값으로 대체
    ('onehot', OneHotEncoder(handle_unknown='ignore')),  # 범주형 변수를 one-hot encoding
    ('scaler', StandardScaler()),  # 데이터를 스케일링
    ('classifier', LogisticRegression(random_state=42, solver='liblinear', multi_class='auto'))  # 로지스틱 회귀 모델
])

# 파이프라인 학습
pipeline.fit(X_train, y_train)

# 테스트 데이터 예측
y_pred = pipeline.predict(X_test)

# 정확도 평가
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
```

이 코드는 iris 데이터셋을 로드하고, 일부 데이터를 결측치로 만든 다음, SimpleImputer를 사용하여 결측치를 평균값으로 대체합니다. 또한, OneHotEncoder를 사용하여 범주형 데이터를 one-hot 벡터로 변환하고, StandardScaler를 사용하여 데이터를 정규화합니다. 마지막으로, LogisticRegression을 사용하여 모델을 학습하고 예측합니다.

---

✨ **파이프라인 활용 팁**

1.  **GridSearchCV와 함께 사용**: GridSearchCV를 사용하여 파이프라인의 각 단계에 대한 최적의 하이퍼파라미터를 탐색할 수 있습니다. 예를 들어, StandardScaler의 `with_mean` 또는 `with_std` 값을 조정하거나, LogisticRegression의 `C` 값을 조정할 수 있습니다.
2.  **ColumnTransformer와 함께 사용**: ColumnTransformer를 사용하면 데이터의 각 열에 대해 서로 다른 변환기를 적용할 수 있습니다. 예를 들어, 숫자형 열에는 StandardScaler를 적용하고, 범주형 열에는 OneHotEncoder를 적용할 수 있습니다.
3.  **Custom Transformer**: 사용자 정의 변환기를 만들어 파이프라인에 추가할 수 있습니다. 예를 들어, 특정 특성 공학(feature engineering) 기법을 적용하는 변환기를 만들 수 있습니다.
4.  **make_pipeline 함수**: make_pipeline 함수를 사용하면 파이프라인을 더욱 간결하게 만들 수 있습니다. make_pipeline은 변환기와 추정기를 순서대로 입력받아 파이프라인을 생성합니다.

```python
from sklearn.pipeline import make_pipeline

pipeline = make_pipeline(StandardScaler(), LogisticRegression(random_state=42))
```

---

📚 **핵심 용어 정리**

*   **파이프라인 (Pipeline)**: 여러 단계를 순차적으로 연결하여 머신러닝 워크플로우를 자동화하는 도구. (Pipeline: A tool to automate machine learning workflows by connecting multiple steps sequentially.)
*   **변환기 (Transformer)**: 데이터를 변환하는 역할. (Transformer: A component that transforms data.)
*   **추정기 (Estimator)**: 최종적으로 모델을 학습하고 예측하는 역할. (Estimator: A component that trains and predicts the model.)
*   **결측값 (Missing Value)**: 데이터에 존재하지 않는 값. (Missing Value: A value that is absent in the data.)
*   **특성 공학 (Feature Engineering)**: 기존 특성을 사용하여 새로운 특성을 생성하는 과정. (Feature Engineering: The process of creating new features using existing features.)
*   **교차 검증 (Cross-Validation)**: 모델의 성능을 평가하는 방법. (Cross-Validation: A method for evaluating the performance of a model.)
반응형