Part 1에서 머신러닝 훈련을 위한 데이터 전처리 과정을 배웠다.

2023.08.25 - [ML & DL/머신러닝의 모든 것] - Part 1. 데이터 전처리

 

Part 1. 데이터 전처리

머신러닝 모델을 훈련시키기 전에 데이터를 전처리해야한다. 데이터 전처리는 아래와 같은 과정으로 이루어지며, 이미 잘 만들어진 라이브러리들이 많아 그것을 이용하면 된다. 위 데이터를 머

jijibae.tistory.com


선형 회귀(Linear Regression)란?

 선형 회귀는 널리 사용되는 회귀 알고리즘이다.

 선형회귀는 종속 변수 y와 하나 이상의 독립 변수 x와의 선형 상관관계를 모델링하는 기법이다.

 독립 변수 x가 1개라면 단순 선형 회귀, 2개 이상이면 다중 선형 회귀라고 한다.

 

1) 단순 선형 회귀(Simple Linear Regression)

 위와 같은 식이 단순 선형 회귀의 식이며, 우리가 알고 있는 직선의 방정식이다. 

모델을 학습 시킨다는 뜻은 새로운 데이터를 입력했을 때 정확도가 높은 예측을 할 수 있게끔 상수 b0의 값과 기울기 b1의 값을 알아내는 것이다. 

 

2) 다중 선형 회귀(Multiple Linear Regression)

단순 선형 회귀의 식과 다르게 독립변수 x의 개수가 1개 이상인 것을 알 수 있다.

 

이 글에서는 단순 선형 회귀 실습만을 해보겠다.

다중 선형 회귀 실습은 다음 글에서 하겠다.

 

단순 선형 회귀 실습

출처:머신러닝의 모든것(유데미)

위와 같은 연차별 연봉 데이터가 30행 있고, 우리는 이 데이터를 학습하여 새로운 데이터에 대한 예측 연봉을 찾을 것이다.

 

<목차>

1. 라이브러리 임포트

2. 데이터세트 임포트

3. 데이터 세트를 훈련세트와 테스트세트로 나누기

4. 단순 선형 회귀 모델을 훈련세트로 학습시키기

5. 테스트세트 결과를 예측하기

6. 훈련세트의 결과를 시각화하기

7. 테스트세트의 결과를 시각화하기

 

 

 

1. 라이브러리 임포트

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

 

2. 데이터세트 임포트

dataset = pd.read_csv('파일명')
x = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

 

 

3. 데이터 세트를 훈련세트와 테스트세트로 나누기

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)

 

4. 단순 선형 회귀 모델을 훈련세트로 학습시키기

from sklearnl.model_selection import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train)

line1 : 사이킷런의 model_selection 모듈에 접근해 LinearRegression 클래스를 임포트한다.

line2 : LinearRegression의 인스턴스를 regressor라는 이름으로 만든다.

line3 : fit 메소드를 사용하여 단순 선형 회귀 모델 regressor를 x_train, y_train 의 데이터를 이용해 학습한다.

 

5. 테스트세트 결과를 예측하기

y_pred = regressor.predict(x_test)

line1 : 훈련된 단순 선형 회귀 모델 regressor를 이용해 학습에 사용되지 않은 데이터가 있는 x_test(새로운 데이터)의

          결과값을 예측한다.

 

6. 훈련세트의 결과를 시각화하기

 이 과정은 훈련된 단순 선형 회귀 모델의 결과를 테스트세트 결과와 비교하기 위해 진행된다.

plt.scatter(x_train, y_train, color = 'red')
plt.plot(x_train, regressor.predict(x_train), color = 'blue')
plt.title('Salary vs Experience (Training set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

line1 : matplotlib.pyplot(이하 plt)에 접근해 scatter 함수를 사용하여 2D 구성에 점을 빨간색으로 찍는다.

line2 : plt의 plot 함수를 사용하여 회귀선을 파란색으로 긋는다. y좌표는 모델에 값을 넣었을 때 나오는 결과 값

          (plot(x좌표, y좌표))

line3~5 : 차트를 예쁘게 꾸미기 위해 사용한 것

line6 : 출력을 위해 사용한다.

단순 선형 회귀 훈련 세트 결과

파란색 선이 우리가 만든 단순 선형 회귀 모델이 구한 회귀 선이다. 이 선을 기반으로 새로운 데이터를 예측할 것이다.

 

7. 테스트세트의 결과를 시각화하기

 x_test의 경우 단순 선형 회귀 모델 입장에서는 새로운 데이터에 해당한다.

 y_test는 실제 데이터의 결과이므로 모델 입장에서는 정답에 해당한다.

 즉, x_test의 입력을 받은 모델이 출력한 결과가 y_test와 얼마나 다른지를 비교하는 것이다.
      여기서 중요한 것은 회귀선은 (6)에서 구한 회귀선과 동일하다는 것이다.

 

plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_train, regressor.predict(x_train), color = 'blue')
plt.title('Salary vs Experience (Test set)')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()

line1 : matplotlib.pyplot(이하 plt)에 접근해 scatter 함수를 사용하여 2D 구성에 점을 빨간색으로 찍는다.

line2 : 훈련세트에서 나타내는 회귀선과 동일하므로 코드를 수정할 필요가 없다.

line3~5 : 차트를 예쁘게 꾸미기 위해 사용한 것

line6 : 출력을 위해 사용한다

 

 

 

단순 선형 회귀 테스트 세트 결과

 

새로운 데이터를 넣어도 회귀선의 정확도가 높은 것을 알 수 있다.

단순 선형 회귀 모델은 독립변수와 결과가 선형의 관계를 가질 때, 유용하게 사용할 수 있으며,

만약 데이터가 비선형관계인 경우 단순 선형 회귀 모델을 사용하면 큰 오차를 가질 수 있다.

머신러닝 모델을 훈련시키기 전에 데이터를 전처리해야한다.

 

데이터 전처리는 아래와 같은 과정으로 이루어지며, 이미 잘 만들어진 라이브러리들이 많아 그것을 이용하면 된다.

 

출처 - 머신러닝의 모든 것 (유데미)

위 데이터를 머신러닝 훈련에 적합하게 데이터 전처리 하는 법을 알아보자.

 

<목차>

1. 라이브러리 임포트

2. 데이터세트 임포트

3. 누락된 데이터 처리

4. 범주형 데이터 인코딩

   4-1. 독립 변수 인코딩 

   4-2. 종속 변수 인코딩

5. 데이터세트를 훈련세트와 테스트세트로 분할

6. 특징 스케일링

 

데이터 전처리

   i.  라이브러리 임포트 

  데이터 전처리를 위한 라이브러리는 numpy, matplotlib, pandas 가 있다.

import numpy as np
import matplotlib as mlt
import pandas as pd

 뒤의 as~ 부분의 예로 numpy 를 np라는 별명으로 사용할 것이라는 뜻이다.

 

 

   ii.  데이터셋 불러오기

  판다스에 데이터셋을 불러올 수 있는 메소드가 있다. 이를 이용하여 데이터셋을 불러올 수 있다.

dataset = pd.read_csv('Data.csv')
x = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

 x 는 특징행렬로 마지막의 예측열을 제외한 모든 데이터값을 가진다.

 y 는 종속변수 벡터인데 우리가 할 예측결과를 저장하는 변수이다.

 x 와 y 두개의 Entity를 선언하는 이유는 모델들을 만들 때 사용하는 클래스들이 데이터 세트 전체를 원하지 않고, 두 개의

  분리된 Entitiy를 원하기 때문이다.

 

 

 iii. 누락된 데이터 처리하기

 누락된 데이터는 모델을 훈련시킬 때, 오류가 생길 수 있으므로 반드시 처리해야한다.

처리하는 방법으로는 누락된 데이터 집합의 평균또는 중간값을 구해 누락된 데이터를 처리해주면 된다.

어떠한 경우에는 그냥 누락된 데이터를 무시해버린다. 

누락된 데이터를 처리할 때 사이킷런이라는 과학 라이브러리를 사용할 것이다.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values = np.nan, starategy = 'mean')
imputer.fit(x[:, 1:3])
x[:, 1:3] = imputer.transform(x[:,1:3])

line 1 : 사이킷런의 impute 모듈에 접근해, SimpleImputer라는 클래스를 임포트한다.

line 2 : SimpleImputer의 인스턴스 imputer를 생성하고, 누락된 값에 대해 평균을 적용하는 객체를 생성한다.

line 3 : SimpleImputer 클래스의 fit 메소드가 객체 imputer와 특징행렬(x)를 연결해준다.

            fit 함수가 결측치를 보고 평균값을 계산한다.

line 4 : transform 메소드는 누락된 값을 해당 열의 평균값으로 대체해준다.

 

 

 iv. 범주형 데이터를 인코딩하기

  해당 열의 데이터 값이 France, Germany, Spain 과 같이 범주형 데이터라면 이 데이터를 숫자로 바꿔야한다.

 만일, 프랑스 독일 스페인을 각각 0,1,2로 바꿔버리면 머신러닝 모델이 숫자 사이의 관계가 있다고 여기기때문에

 one-hot 인코딩 방식을 이용해야한다.

 독일 (1 0 0), 스페인 (0 1 0) 프랑스 (0 0 1)로 이진 벡터화해서 인코딩하면 세 개의 열이 새로 생성되는 의미이고, 숫자의     순서도 사라진다. 만일 우리가 가진 데이터가 독립 변수에도 범주형 데이터가 존재하고, 예측해야하는 종속 변수도 범주형 데이터가 존재한다면 독립 변수 인코딩 후에 종속 변수 인코딩을 한다.

 

  

 iv-1. 독립 변수를 인코딩하기

from sklearn.compose import ColumTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumTransformer(transformers= [('encoder', OneHotEncoder(), ['열'])], remainder='passthrough')
x = np.array(ct.fit_transform(x))

line 1 : 사이킷런의 compose 모듈에 접근해, ColumTransformer라는 클래스를 임포트한다.

line 2 : 사이컷런의 preprocessing 모듈에 접근해, OneHotEncoder라는 클래스를 임포트한다.

line 3 : ColumTransformer는 두 개의 인자를 요구하는데, (변환하고싶은열, 유지하고싶은열) 의 형식이다.

line4 :  np.array 형식으로 반환 받을 것이고, 객체 ct(인코딩)와 특징행렬(독립변수) x를 연결한다.

 

 

iv-2. 종속 변수를 인코딩하기

 이 데이터셋의 종속 변수는 물건을 사는가(Yes), 물건을 사지 않는가(No)의 범주형 데이터이고, Yes/No는 하나뿐인 싱글 벡터 이다.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

line1 : 사이킷런의 preprocessing 모듈에 접근해, OneHotEncoder라는 클래스를 임포트한다.

line2 : Yes/No는 하나뿐인 싱글 벡터이다. 어떤 것을 인코딩해야하는지 명확하므로 괄호를 비워도 된다. Yes =>1, No =>0

line3 : 종속 변수 벡터라서 np.array 형식이 필요없다.

 

 

-------- 이 과정까지하면 학습에 필요한 데이터 자료의 형태는 준비한 것이다.--------

 

 

v. 데이터셋을 훈련 세트와 테스트 세트로 나누기

 훈련 세트에 특징 행렬과 종속 변수 벡터 한 쌍, 테스트 세트에 똑같은 한 쌍을 만들 것이다.

분할 크기의 권장 값은 훈련 세트 80% 관측값, 테스트 세트 20% 관측값이다.

훈련 세트로는 머신 러닝 모델을 훈련시킨다.  ==>  훈련된 머신 러닝 모델을 A라고 하면

잘 훈련된 A에 테스트 세트의 특징 행렬 데이터를 넣었을 때, 나오는 결과를 B라고 하면

우리는 B와 실제 데이터인 테스트 세트의 종속 변수 벡터와의 비교를 통해 정확도를 비교하게 된다.

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 1)

line1 : 사이킷런의 model_selection 모듈에 접근해, train_test_split 이라는 함수를 임포트한다.

line2 : train_test_split 함수는 4개의 인자를 요구한다. 2개는 데이터 세트 전체를 요구하지 않고 특징 행렬 x와 종속 변수 벡터 y를 요구한다. 인자 4개로는 (특징행렬, 종속변수벡터, 분할크기, 무작위 요소) 이다.

 

 

vi. 특징을 스케일링하기

 일부 기계 모델에서 일부 특성이 다른 특성에 의해 지배되어 기계 모델에 인식되지 않은 상황을 방지하기 위해 모든 특성을 동일한 크기로 조정해주는 도구이다.

표준화 방식으로 스케일링 하면 모든 데이터 값이 원래 값에 기반하여 -3 ~ 3 의 값으로 변경된다.

정규화 방식으로 스케일링 하면 모든 데이터 값이 원래 값에 기반하여 0 ~ 1 의 값으로 변경된다.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train['범위'] = sc.fit_transform(x_train['범위'])
x_test['범위'] = sc.fit_transform(x_test['범위'])

line1 : 사이킷런의 preprocessing 모듈에 접근해, StandardScaler라는 클래스를 임포트한다.

line2 : StandardScaler의 인스턴스 sc를 생성

line3 : fit은 각 평균과 표준편차를 구하는 것이고, transform은 이 공식을 적용해서 표준화나 정규화를 하는 것이다.

 

i ~ vi 과정을 마치면 우리는 머신러닝 훈련을 위한 준비는 모두 마친것이다.

 

***

Q. 데이터셋을 훈련 세트와 테스트 세트로 나누고, 특징을 추출해야하는가? 아니면 그 반대인가?

 

A. 데이터셋을 두 세트로 나누고, 특징을 추출해야한다.

    훈련이 끝날 때까지 가져오면 안되는 테스트 정보가 유출되는 것을 막기 위해서이다.

 

 

데이터를 전처리를 할 때 변함없이 진행되는 부분이 있다.

i. 라이브러리 임포트

ii. 데이터셋 불러오기 + 특징 행렬과 종속 변수 벡터 만들기

iii. 훈련 세트와 테스트 세트를 만드는 것

위 3 과정은 이미 템플릿이 있을 정도로 변함없이 자주 사용하는 부분이다. 이미 있는 것을 사용하면 빠르고 쉽게 데이터 전처리가 가능하다.