본문 바로가기
Drawing (AI)/MachineLearning

Udemy - 머신러닝의 모든 것 (Intro+Data Preprocessing)

by 생각하는 이상훈 2023. 1. 15.
728x90

Machine Learning

머신 러닝은 딥러닝을 포함하는 큰 개념이다. 딥 러닝 강의를 듣는데 막히지는 부분이 있지는 않았지만 머신 러닝 강의를 듣고 오는것이 보다 수월하게 이해하는데 도움이 될 것 같고 순서를 맞춰서 듣는게 효율이 좋을 것 같아서 Machine Learning강의를 먼저 듣고자 한다.

 

Why ML is the future

인간은 data에 둘러쌓여서 살고 있다. 2005년까지 인간이 생성한 data는 130exabyte 이다. 그리고 2010년까지 인간이 생성한 data는 1200exabyte 이고 2015년에는 7900exabyte이고 2020년에는 40900exabyte이다. 인간을 둘러싼 data는 기하급수적으로 증가함을 볼 수 있다. ML을 통해서 직접 다룰 수 없는 data를 다루는 효과를 내어 커다란 이점을 가질 수 있다.


Data Preprocessing

Importing the libraries

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

 

Importing the dataset

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

print(x)

#변수 출력
[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 nan]
 ['France' 35.0 58000.0]
 ['Spain' nan 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]
 
 print(y)
 
 #종속변수 출력
 ['No' 'Yes' 'No' 'No' 'Yes' 'Yes' 'No' 'Yes' 'No' 'Yes']

 

Taking care of missing data

비어있는 데이터를 해결하여 model의 성능을 높이기 위해 머신러닝에서 가장 유명한 라이브러리인 사이킷런을 이용한다.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean') #빈칸을 평균으로 대체
imputer.fit(x[:, 1:3]) #Age, Salary의 모든 내용을 조사하여 빈칸을 채움
x[:, 1:3] = imputer.transform(x[:, 1:3]) #대체한 Age열과 Salary열을 x에 넣어줌

print(x)

#출력
[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 63777.77777777778]
 ['France' 35.0 58000.0]
 ['Spain' 38.77777777777778 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

 

Encoding categorical data

 

Independent Variable

Country열의 France, Spain, Germany를 encoding을 통해 숫자로 바꿔주어야하는데 0,1,2로 바꾸면 세개의 데이터간에 순서가 있는 것으로 착각을 할 수 있기 때문에 one-hot encoding을 이용한다. one-hot encoding은 하나만 1이되도록 001, 010, 100과 같이 세개의 열로 바꿔주는 것이다. 국가가 5개라면 5개의 열로 바꿔주면된다.

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
x = np.array(ct.fit_transform(x)) #x와 열결하기 위해 numpy array꼴로 변경

print(x)
#출력
[[1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [0.0 1.0 0.0 30.0 54000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 35.0 58000.0]
 [0.0 0.0 1.0 38.77777777777778 52000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 37.0 67000.0]]

Fance는 100, Fermany는 010, Spain은 001로 인코딩되었음을 확인할 수 있다.

 

Dependent Variable

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

print(y)
#출력
[0 1 0 0 1 1 0 1 0 1]

 

Splitting the dataset into the Training set and Test set

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)

print(x_train)
#출력
[[0.0 0.0 1.0 38.77777777777778 52000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 35.0 58000.0]]
 
print(x_test)
#출력
[[0.0 1.0 0.0 30.0 54000.0]
 [1.0 0.0 0.0 37.0 67000.0]]
 
print(y_train)
#출력
[0 1 0 0 1 1 0 1]

print(y_test)
#출력
[0 1]

 

Feature Scaling

모든 특성을 동일한 scale로 만들어주는 과정이다. 이는 모든 머신러닝 모델에 필요한 것은 아니다.

그러나 가중치를 결정하는 과정에서 사용된다. 그리고 이는 대부분의 머신러닝 모델에서 중요할 것으로 예상된다.

Feature Scaling의 대표적인 두가지 방식은 Standardisation과 Normalisation이 있다.

각각은 다음과 같이 계산된다.

Standardisation(표준화)는 모든 feature의 값을 특정 값 사이의 값으로 바꿔준다. 이는 언제나 잘 작동하는 방식이다.

Normalisation(정규화)는 모든 feature의 값을 0에서 1사이의 값으로 바꿔준다. 이는 자료가 정규 분포를 따를때 성능이 굉장히 좋다.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
#가변수에는 feature scaling을 하면 안됨
x_train[:, 3:] = sc.fit_transform(x_train[:, 3:])
x_test[:, 3:] = sc.transform(x_test[:, 3:])

print(x_train)
#출력
[[0.0 0.0 1.0 -0.1915918438457856 -1.0781259408412427]
 [0.0 1.0 0.0 -0.014117293757057902 -0.07013167641635401]
 [1.0 0.0 0.0 0.5667085065333239 0.6335624327104546]
 [0.0 0.0 1.0 -0.3045301939022488 -0.30786617274297895]
 [0.0 0.0 1.0 -1.901801144700799 -1.4204636155515822]
 [1.0 0.0 0.0 1.1475343068237056 1.2326533634535488]
 [0.0 1.0 0.0 1.4379472069688966 1.5749910381638883]
 [1.0 0.0 0.0 -0.7401495441200352 -0.5646194287757336]]
 
 print(x_test)
 #출력
 [[0.0 1.0 0.0 30.0 54000.0]
 [1.0 0.0 0.0 37.0 67000.0]]

위 경우 표준화가 -2에서 2사이로 진행이 되었다.


 

728x90