본문 바로가기
Tech/Python

Data Handling - fit, transform, and fit_transform

by Jyubaeng2 2023. 8. 3.

Difference between fit, transform, and fit_transform

데이터 전처리를 하다 보면 fit, transform, 그리고 fit_transform 함수들을 자주 보게 됩니다. 각각의 함수들이 어떤 동작을 하는지 그리고 그들 간에 차이점은 무엇인지 알아보겠습니다.

 

  1. fit 함수:
    • fit 함수는 기계 학습 모델을 훈련하는 데 사용됩니다.
    • 모델이 학습 데이터에 적합하도록 매개변수를 조정하고 모델 내부에서 필요한 정보를 학습합니다.
    • 훈련된 모델은 훈련 데이터에서 보지 못한 새로운 데이터에 대해 예측을 수행할 수 있습니다.
  2. transform 함수:
    • transform 함수는 데이터 변환에 사용됩니다.
    • 특히, 데이터 전처리 단계에서 사용되며, 훈련된 변환을 새로운 데이터에 적용합니다.
    • 예를 들어, 데이터 스케일링, 주성분 분석(PCA), 텍스트 벡터화 등과 같은 작업에서 사용됩니다.
  3. fit_transform 함수:
    • fit_transform 함수는 fittransform을 한 번에 수행하는 편리한 함수입니다.
    • 데이터를 학습하면서 동시에 변환을 적용하는 데 사용됩니다.
    • fit_transform은 일반적으로 훈련 데이터에만 사용되며, 테스트 데이터는 transform 함수를 사용합니다.

 

이제, Boston 주택 가격 데이터셋을 사용하여 간단한 예제 코드를 보여드리도록 하겠습니다.

 

Boston 주택 가격 데이터셋은 scikit-learn의 load_boston() 함수로 불러올 수 있습니다.

 

이 데이터셋은 주택 가격과 관련된 여러 특성들을 포함하고 있습니다.

 

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# Boston 주택 가격 데이터셋 로드
data = load_boston()
X, y = data.data, data.target

# 데이터 분할: 훈련 데이터와 테스트 데이터로 나눔
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링을 위해 StandardScaler 사용
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # fit_transform이 사용됨
X_test_scaled = scaler.transform(X_test) # tranform이 사용됨

# 선형 회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train_scaled, y_train)

# 테스트 데이터에 대한 예측 수행
y_pred = model.predict(X_test_scaled)

# 평균 제곱 오차(Mean Squared Error)를 사용하여 모델 평가
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

 

위 코드에서는 먼저 load_boston() 함수를 사용하여 Boston 주택 가격 데이터셋을 로드합니다.

 

데이터를 훈련 데이터와 테스트 데이터로 나눈 후, StandardScaler를 사용하여 데이터를 스케일링합니다.

 

그리고 선형 회귀 모델을 생성하고 훈련 데이터를 사용하여 모델을 학습합니다.

 

마지막으로, 테스트 데이터를 사용하여 예측을 수행하고, 평균 제곱 오차를 사용하여 모델의 성능을 평가합니다.

 

그런데 왜 X_test_scaled 에서는 fit_transform 대신에 transform를 사용했을까요?

 

fit_transform 함수는 주로 데이터의 훈련과 변환 단계를 동시에 수행할 때 사용합니다.

 

하지만 fit_transform 함수를 사용하여 테스트 데이터를 변환하는 것은 지양해야 합니다.

 

그 이유는 테스트 데이터에 대해서는 이미 훈련 데이터에서 학습한 변환 정보를 사용하여 변환해야 하기 때문입니다.

 

테스트 데이터를 사용하여 새로운 변환을 학습하면 훈련 데이터와 동일한 변환을 보장하지 못하며, 모델의 성능을 정확하게 평가할 수 없게 됩니다.

 

따라서, 훈련 데이터에서 학습한 변환 정보를 사용하여 테스트 데이터를 변환하기 위해 transform 함수를 사용합니다.

 

transform 함수는 훈련 데이터에서 학습한 변환을 새로운 데이터에 적용할 수 있도록 합니다.

 

이제 예시 코드를 통해 설명드리겠습니다:

 

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# Boston 주택 가격 데이터셋 로드
data = load_boston()
X, y = data.data, data.target

# 데이터 분할: 훈련 데이터와 테스트 데이터로 나눔
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링을 위해 StandardScaler 사용
scaler = StandardScaler()

# 훈련 데이터에 대해서만 fit_transform을 사용하여 변환을 학습하고 적용
X_train_scaled = scaler.fit_transform(X_train)

# 테스트 데이터에 대해서는 transform만 사용하여 훈련 데이터에서 학습한 변환을 적용
X_test_scaled = scaler.transform(X_test)

# 선형 회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train_scaled, y_train)

# 테스트 데이터에 대한 예측 수행
y_pred = model.predict(X_test_scaled)

# 평균 제곱 오차(Mean Squared Error)를 사용하여 모델 평가
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

 

위 코드에서 StandardScaler를 생성하고, fit_transform 함수를 사용하여 훈련 데이터인 X_train에 대해서만 데이터를 스케일링합니다.

 

그리고 transform 함수를 사용하여 테스트 데이터인 X_test에 대해서는 이미 훈련 데이터에서 학습한 스케일링 변환을 적용합니다.

 

이렇게 하면 테스트 데이터에 대해서도 훈련 데이터와 동일한 스케일링을 적용할 수 있으며, 모델의 성능을 올바르게 평가할 수 있습니다.

'Tech > Python' 카테고리의 다른 글

pandas - Joining Datasets  (0) 2023.08.16
Data Handling - Dates and Times  (38) 2023.08.04
Data Handling - Data Type  (2) 2023.08.03
pandas - Adding New Columns and Rows to DataFrame  (4) 2023.07.30
pandas - Subsetting Rows with Categorical Variables  (1) 2023.07.30

댓글