[ML] 나누기 vs 전처리

Tino-Kim·2022년 12월 26일
0
post-thumbnail

[ML] 나누기 vs 전처리

전처리와 훈련 데이터와 테스트 데이터를 나누는 작업을 하다 보니 그들 간의 순서를 어떻게 해야 되는지 헷갈렸다. 그래서 구글링을 통해서 그 답을 알아내고자 했다.

일단 두 개의 순서를 바꿔서 결과값이 같은지, 차이점은 없는지 확인하고자 한다. 데이터는 sklearn에 내장되어있는 iris 데이터를 이용하고자 한다.

0. 필요한 라이브러리 가져오기.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import accuracy_score

1. 데이터를 먼저 나누고, 전처리하기.

Step 1. train_test_split를 이용하여 데이터 나누기.
Step 2. 데이터 전처리하기. 여기서는 MinMaxScaler를 이용하여 정규화를 시켜줄 것이다.
여기서 주의할 점은 훈련 데이터는 fit_transform()을 이용하고 테스트 데이터는 fit()을 이용해야 한다. 테스트 데이터에서는 fit_transform()을 이용하면 안된다.
Step 3. LogisticRegression 모델을 만들고 학습하고 예측하기.

iris = load_iris()
iris_data = iris.data # X
iris_target = iris.target # y

# Step 1. 데이터 나누기.
train_x, test_x, train_y, test_y = train_test_split(iris_data, iris_target, test_size=0.2, random_state=2)

# Step 2. 데이터 전처리 하기. (정규화 Normalization)
## 훈련 데이터 (train_x) : fit_transform() 이용하기.
## 테스트 데이터 (test_x) : transform() 이용하기.

ms = MinMaxScaler()
scaled_train_x = ms.fit_transform(train_x) 
scaled_test_x = ms.transform(test_x)

# Step 3. 모델 만들고 훈련시키기.
lr = LogisticRegression()
lr.fit(scaled_train_x, train_y)
pred = lr.predict(scaled_test_x)

print('예측 정확도: {0:.4f}'.format(accuracy_score(test_y, pred)))

예측 정확도는 0.9333이 나왔다.

2. 데이터 전처리 후, 데이터 나누기.

Step 1. 데이터 전처리하기. MinMaxScaler를 이용하여 정규화를 시켜준다.
Step 2. train_test_split를 이용하여 데이터 나누기.
Step 3. LogisticRegression 모델을 만들고 학습하고 예측하기.

iris = load_iris()
iris_data = iris.data # X
iris_target = iris.target # y

# Step 1. 데이터 전처리하기. (정규화 Normalization)
mm = MinMaxScaler()
scaled_iris_data = mm.fit_transform(iris_data)

# Step 2. 데이터 나누기.
train_x, test_x, train_y, test_y = train_test_split(scaled_iris_data, iris_target, test_size=0.2, random_state=2)

# Step 3. 모델 생성하고, 학습하고 예측하기.
lr = LogisticRegression()
lr.fit(train_x, train_y)
pred = lr.predict(test_x)
print('예측 정확도: {0:.4f}'.format(accuracy_score(test_y, pred)))

예측 정확도는 0.9333이 나왔다.

결론

1번 방법과 2번 방법 둘다 같은 정확도가 나오기 때문에 어떤 것을 사용하더라도 문제가 되지 않는다.

허나 최대한 2번 방법을 사용하는 것이 좋고 (왜냐하면 2번에 비해 덜 복잡하기 때문이다.), 안되는 경우에는 1번 방법을 사용하되 fit_transform()과 fit()을 잘 구분하여 사용해야 한다.

profile
알고리즘과 데이터 과학과 웹 개발을 공부하는 대학생

0개의 댓글