ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다양한 머신러닝 알고리즘 비교 및 하이퍼파라미터 튜닝
    pandas 2025. 1. 31. 22:28
    728x90

     

    머신러닝 모델의 성능을 최적화하려면 여러 알고리즘을 비교하고, 각 모델의 하이퍼파라미터를 튜닝하는 과정이 필요합니다.
    이번 글에서는 Scikit-Learn을 활용하여 여러 알고리즘을 비교하고, 최적의 모델을 찾는 방법을 소개하겠습니다.


    1. 라이브러리 설치 및 불러오기

    먼저 필요한 라이브러리를 설치합니다.

    pip install pandas scikit-learn seaborn matplotlib
    

    이제 라이브러리를 불러옵니다.

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
    from sklearn.preprocessing import StandardScaler
    from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
    

    2. 데이터 불러오기 및 전처리

    (1) 데이터 불러오기

    # 타이타닉 데이터셋 로드
    df = sns.load_dataset("titanic")
    
    # 데이터 확인
    print(df.head())
    print(df.info())
    

    (2) 결측값 처리

    df['age'].fillna(df['age'].median(), inplace=True)
    df['embarked'].fillna(df['embarked'].mode()[0], inplace=True)
    df.drop(columns=['deck'], inplace=True)
    

    (3) 범주형 데이터를 숫자로 변환

    df['sex'] = df['sex'].map({'male': 0, 'female': 1})
    df = pd.get_dummies(df, columns=['embarked'], drop_first=True)
    

    (4) 불필요한 열 제거

    df.drop(columns=['alive', 'who', 'adult_male', 'class', 'embark_town'], inplace=True)
    

    3. 데이터셋 분리 및 정규화

    # 특성과 타겟 변수 설정
    X = df.drop(columns=['survived'])
    y = df['survived']
    
    # 훈련 데이터와 테스트 데이터 분리 (80:20 비율)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 데이터 정규화 (SVM과 로지스틱 회귀에 필요)
    scaler = StandardScaler()
    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)
    

    4. 다양한 머신러닝 모델 비교

    (1) 여러 모델 훈련 및 평가

    models = {
        "Logistic Regression": LogisticRegression(),
        "Support Vector Machine": SVC(),
        "Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),
        "Gradient Boosting": GradientBoostingClassifier(n_estimators=100, random_state=42)
    }
    
    # 모델별 성능 비교
    for name, model in models.items():
        model.fit(X_train, y_train)
        y_pred = model.predict(X_test)
        acc = accuracy_score(y_test, y_pred)
        print(f"{name} 정확도: {acc:.4f}")
    

    출력 예시:

    Logistic Regression 정확도: 0.7980
    Support Vector Machine 정확도: 0.8101
    Random Forest 정확도: 0.8323
    Gradient Boosting 정확도: 0.8427
    

    (2) 교차 검증을 통한 성능 비교

    for name, model in models.items():
        scores = cross_val_score(model, X_train, y_train, cv=5)
        print(f"{name} 평균 정확도: {scores.mean():.4f}")
    

    교차 검증을 통해 모델의 안정적인 성능을 확인할 수 있습니다.


    5. 하이퍼파라미터 튜닝 (GridSearchCV 활용)

    (1) 랜덤 포레스트 하이퍼파라미터 튜닝

    param_grid = {
        'n_estimators': [50, 100, 200],
        'max_depth': [None, 10, 20],
        'min_samples_split': [2, 5, 10]
    }
    
    grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5, scoring='accuracy', n_jobs=-1)
    grid_search.fit(X_train, y_train)
    
    print("최적 하이퍼파라미터:", grid_search.best_params_)
    print("최고 교차 검증 정확도:", grid_search.best_score_)
    

    (2) SVM 하이퍼파라미터 튜닝

    param_grid = {
        'C': [0.1, 1, 10],
        'kernel': ['linear', 'rbf']
    }
    
    grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='accuracy', n_jobs=-1)
    grid_search.fit(X_train, y_train)
    
    print("최적 하이퍼파라미터:", grid_search.best_params_)
    print("최고 교차 검증 정확도:", grid_search.best_score_)
    

    6. 최적 모델 평가

    튜닝된 최적 모델을 활용하여 성능을 평가합니다.

    best_model = grid_search.best_estimator_
    y_pred = best_model.predict(X_test)
    
    # 최종 정확도 및 보고서 출력
    print(f"최적 모델 정확도: {accuracy_score(y_test, y_pred):.4f}")
    print(classification_report(y_test, y_pred))
    

     

    728x90
Designed by Tistory.