피처가 많을 때 머신러닝 어떻게 하나요 - 3편(PCA)

728x90
반응형

서론

 

데이터 분석과 머신러닝 알고리즘 적용은 현대의 다양한 분야에서 중요한 역할을 하고 있습니다. 특히 부동산 가격 예측은 지역 경제, 개인의 재산 관리, 그리고 투자 결정 등에 있어서 중요한 정보를 제공합니다. 하지만 실제로 부동산 가격을 예측하는 과정은 매우 복잡하며, 대량의 데이터와 다양한 변수들을 다루어야 합니다. 이러한 복잡성을 관리하기 위해 데이터 사이언티스트들은 데이터를 체계적으로 가공하고, 효율적으로 분석할 수 있는 다양한 기법을 사용합니다.

 

이전 글에서는 과거의 방법처럼 데이터의 특성을 이해하고 중요한 피처들을 선별하기 위해 직접 데이터를 시각화하고, 다양한 통계적 방법을 사용하여 핵심적인 변수를 선택하는 과정이 필요했습니다. 이 과정은 매우 시간이 많이 소요되며, 주관적인 판단이 개입될 여지가 많았습니다. 그러나 최근에는 주성분 분석(PCA)와 같은 차원 축소 기법을 활용함으로써, 이러한 과정을 훨씬 더 효율적이고 객관적으로 진행할 수 있게 되었습니다.

 

주성분 분석(PCA)는 다차원 데이터의 차원을 축소하여, 가장 중요한 정보를 유지하면서 데이터를 간결하게 표현하는 기법입니다. PCA를 활용하면, 변수들 간의 상관관계를 기반으로 데이터의 주요 특성을 추출할 수 있으며, 이를 통해 모델의 성능을 개선하고, 계산 비용을 줄일 수 있습니다. 본 글에서는 실제 부동산 가격 예측 문제에 PCA를 적용하여, 데이터 전처리와 모델링 과정을 어떻게 효율적으로 수행할 수 있는지에 대해 설명하고자 합니다. 이를 통해 데이터 분석과 머신러닝 알고리즘의 접근 방법에 있어서 차원 축소의 중요성과 유용성을 강조하고자 합니다.

 

코드 진행

 

이 코드는 주택 가격 예측 모델을 구축하는 과정을 담고 있습니다. 주어진 데이터는 Kaggle의 "House Prices: Advanced Regression Techniques" 대회에서 제공된 데이터셋을 사용하며, 주택의 다양한 특성(예: 면적, 방의 개수, 건축 연도 등)을 기반으로 해당 주택의 가격을 예측하는 것이 목표입니다. 코드의 주요 단계는 다음과 같습니다.

 

1. 데이터 로딩

 

`pandas` 라이브러리를 사용해 학습 데이터셋과 테스트 데이터셋을 로드합니다.

 

2. 데이터 전처리

 

- 결측치가 50% 이상인 열을 제거함으로써 데이터의 품질을 향상시킵니다.

- 수치형 데이터와 범주형 데이터를 구분합니다. 수치형 데이터는 숫자로 표현되는 반면, 범주형 데이터는 일반적으로 텍스트로 표현됩니다.

- `SimpleImputer`를 사용하여 수치형 데이터의 결측치를 각각 평균값으로 대체합니다.

- `StandardScaler`로 수치형 데이터를 표준화합니다.

 

3. 모델 학습 및 평가

 

- 목표 변수(`SalePrice`)를 설정하고, 데이터를 학습 세트와 검증 세트로 분할합니다.

- `Ridge` 회귀 모델을 사용하고, 주성분 분석(PCA)을 통해 차원 축소를 시도합니다. PCA는 고차원 데이터의 특성을 보존하면서 차원을 축소하는 방법으로, 모델의 복잡성을 줄이고 과적합을 방지할 수 있습니다.

- 각 PCA 컴포넌트 수에 대해 모델을 학습하고, 검증 데이터에 대한 Mean Squared Error(MSE), R^2 점수, 교차 검증 점수를 계산하여 최적의 컴포넌트 수를 결정합니다.

 

4. 테스트 데이터에 대한 예측

 

- 최적의 PCA 컴포넌트 수를 사용하여 테스트 데이터를 변환하고, 학습된 모델을 사용하여 최종적인 주택 가격을 예측합니다.

- 예측 결과를 `DataFrame`으로 변환하고, `Id`와 함께 `submission.csv` 파일로 저장합니다.

 

이 과정을 통해, 데이터의 전처리부터 모델링, 예측까지의 전체 머신러닝 파이프라인을 구현하며, 주택 가격 예측 문제에 대한 해결책을 제공합니다. 주택 가격 예측은 다양한 변수의 조합과 상호작용을 고려해야 하는 복잡한 문제이기 때문에, 이러한 종류의 접근 방식은 데이터로부터 유의미한 인사이트를 추출하고 예측 모델의 성능을 최적화하는 데 중요한 역할을 합니다.

 

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.decomposition import PCA
from sklearn.model_selection import cross_val_score

# 데이터 로딩
train = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/train.csv")
test = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/test.csv")

# 결측치 비율이 50% 이상인 열 제거
over_threshold = train.columns[train.isnull().mean() > 0.5]
train = train.drop(over_threshold, axis=1)
train2 = train.drop(['SalePrice'], axis=1)

# 수치형 데이터 선택
numeric_columns = train2.select_dtypes(include=[np.number]).columns

# 수치형 데이터 결측치 대체를 위한 Imputer 생성
numeric_imputer = SimpleImputer(strategy='mean')

# 표준화를 위한 Scaler 생성
scaler = StandardScaler()

# 수치형 데이터 결측치 대체 및 표준화
numeric_data = train2[numeric_columns]
numeric_data = numeric_imputer.fit_transform(numeric_data)
numeric_data = scaler.fit_transform(numeric_data)

# 수치형 변수와 범주형 변수 분리
num_cols = train2.select_dtypes(include=['int64', 'float64']).columns
cat_cols = train2.select_dtypes(include=['object']).columns

# 학습 데이터 설정
X = numeric_data

# 목표 변수 설정
y = train['SalePrice']

# 학습 데이터를 학습 데이터와 검증 데이터로 분할
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

 

# Ridge 회귀 모델 생성
model = Ridge(alpha=0.5)

max_r2 = 0
min_mse = np.inf
max_cross_val_score = 0
best_n_components = 0

for n_components in range(1, X_train.shape[1] + 1):
    # PCA 객체 생성
    pca = PCA(n_components=n_components)

    # PCA 수행
    X_train_pca = pca.fit_transform(X_train)
    X_val_pca = pca.transform(X_val)

    # Ridge 회귀 모델을 학습 데이터에 적합
    model.fit(X_train_pca, y_train)

    # 학습된 모델을 사용하여 검증 데이터에 대한 예측 수행
    y_pred = model.predict(X_val_pca)

    # Mean Squared Error (MSE) 계산
    mse = mean_squared_error(y_val, y_pred)

    # R^2 점수 계산
    r2 = r2_score(y_val, y_pred)

    # 교차 검증 수행
    cross_val_scores = cross_val_score(model, X_train_pca, y_train, cv=5)

    if r2 > max_r2 and mse < min_mse and cross_val_scores.mean() > max_cross_val_score:
        max_r2 = r2
        min_mse = mse
        max_cross_val_score = cross_val_scores.mean()
        best_n_components = n_components

print(f'Best number of components: {best_n_components}')
print(f'Max R^2 Score: {max_r2}')
print(f'Min Mean Squared Error (MSE): {min_mse}')
print(f'Max Cross Validation Score: {max_cross_val_score}')

 

# 최적의 컴포넌트 수로 PCA 객체 생성
pca = PCA(n_components=37)

# PCA 수행
X_train_pca = pca.fit_transform(X_train)
X_val_pca = pca.transform(X_val)

# Ridge 회귀 모델을 학습 데이터에 적합
model.fit(X_train_pca, y_train)

 

# 수정된 수치형 열과 범주형 열 이름을 합칩니다.
selected_cols = list(num_cols)

# test 데이터에서 selected_cols에 포함된 열들만을 유지합니다.
test_filtered = test[selected_cols]

# 수치형 데이터 선택
numeric_columns2 = test.select_dtypes(include=[np.number]).columns

# 수치형 데이터 결측치 대체 및 표준화
numeric_data2 = test[numeric_columns2]
numeric_data2 = numeric_imputer.fit_transform(numeric_data2)
numeric_data2 = scaler.fit_transform(numeric_data2)

# 수치형 변수와 범주형 변수 분리
num_cols2 = test.select_dtypes(include=['int64', 'float64']).columns


result = numeric_data2

# 학습된 모델을 사용하여 테스트 데이터에 대한 예측 수행
result_test = model.predict(result)

# 예측 결과를 DataFrame으로 변환
prediction = pd.DataFrame(test['Id'])
prediction['SalePrice'] = result_test

# 예측 결과를 csv 파일로 저장
prediction.to_csv('submission.csv', index=False)

 

제출 결과

 

결론

 

주택 가격 예측 문제에 주성분 분석(PCA)을 적용하여 데이터 전처리 및 모델링 과정의 효율성과 정확도를 높이는 방법을 탐색하였습니다. 이 과정에서 PCA의 중요한 역할은 다차원 데이터의 차원을 축소시키면서도 핵심적인 정보를 유지하여, 모델의 성능 개선과 계산 비용 절감에 기여한다는 것을 확인하였습니다.

 

실험 과정에서는 Kaggle의 "House Prices: Advanced Regression Techniques" 대회의 데이터셋을 활용하여, 다양한 주택의 특성을 기반으로 가격을 예측하는 모델을 구축하였습니다. 이때, PCA를 적용하여 최적의 컴포넌트 수를 찾는 과정은 모델의 예측력을 최대화하는 데 중요한 단계였습니다. 실험 결과, 최적의 컴포넌트 수를 사용했을 때 모델의 성능이 개선되었음을 확인할 수 있었습니다.

 

그러나 흥미롭게도, 최적의 컴포넌트 수보다는 테스트 데이터의 피쳐 개수인 37개를 활용하여 예측을 진행했을 때 더 유리한 결과를 얻을 수 있었습니다. 이는 PCA의 컴포넌트 선택 과정에서 모델의 일반화 능력을 최대화하는 것이 중요하다는 점을 시사합니다. 즉, 단순히 차원의 수를 줄이는 것뿐만 아니라, 모델이 새로운 데이터에 대해 얼마나 잘 예측할 수 있는지를 고려하는 것이 중요합니다.

 

해당 절차를 통해 PCA가 부동산 가격 예측 모델의 데이터 전처리 및 모델링 과정에서 어떻게 효율성과 성능을 개선할 수 있는지에 대한 유용한 인사이트를 제공하였습니다. 물론, 추가적인 최적화 작업을 통해 모델의 성능을 더욱 향상시킬 수 있을 것입니다. 예를 들어, 다른 차원 축소 기법의 적용, 하이퍼파라미터 튜닝, 다양한 모델 알고리즘의 비교 분석 등이 이에 해당할 수 있습니다.

 

결론적으로, PCA의 적용은 복잡한 부동산 가격 예측 문제에 있어서 데이터의 핵심적인 특성을 추출하고, 모델의 성능을 개선하는 데 있어서 매우 유용한 도구임을 확인하였습니다. 앞으로도 데이터 과학 분야에서의 차원 축소 기법의 적용은 다양한 문제 해결에 있어서 중요한 역할을 계속해서 할 것으로 기대됩니다.

반응형