ABC부트캠프 데이터 탐험가 과정

[19일차] ABC 부트캠프 머신러닝의 기초 및 선형회귀

hwibeenjeong 2024. 7. 30. 23:45

1. 머신 러닝의 기초

머신러닝에서 가장 중요한 것은 데이터이다. 신뢰성이 높은 데이터가 정확도가 높은 머신러닝 모델을 만든다고 해도 과언이 아니다. 그렇기 때문에 우리는 데이터 전처리를 진행하고, 학습 데이터와 테스트 데이터를 잘 구분해야 한다.

 

데이터는 정말 다양한 분야에서 채집되고, 많은 분야에서 사용된다. 사용 분야 예시를 확인해 보자.

  • 연구
  • 공공데이터
  • 경연
  • 학술, 교육
  • 사업, 서비스

위와 같은 분야에서 다양한 데이터들이 활용된다. 그렇다면 데이터의 종류에는 어떤 것들이 있을까?

데이터에는 크게 3가지 유형이 있다. Tabular(테이블화) 데이터, 영상이미지 데이터, 순차적 데이터로 이루어져 있다. 영상이미지 데이터는 정적 이미지(사진)와 동적 이미지(동영상)로 나뉘고, 순차적 데이터는 시간 데이터, 소리 데이터가 있다. 해당 데이터들을 가공하고, 필요에 맞게 사용해야 한다.

 

데이터에 대해 알아보았으니, 머신러닝의 개념에 대해서 살펴보자.

인공지능은 크게 3가지 범주로 나뉜다.

가장 큰 범주의 인공지능, 그 안의 머신러닝, 그 안의 딥러닝으로 나뉜다. 인공지능은 기계가 인간의 지능적인 행동을 모방할 수 있도록 하는 기술을 말하고, 머신 러닝은 컴퓨터가 명시적인 프로그래밍 없이 데이터를 통해 학습하도록 하는 기술을 말한다. 딥러닝은 인간의 뇌 구조를 모방한 인공 신경망을 사용하여 데이터를 학습하는 방식을 말한다. 

 

현재의 컴퓨터는 스스로 학습할 수 없기 때문에 우리가 컴퓨터에게 작업을 시키려면 프로그램을 작성하여 작업을 지시해야 한다. 인공지능의 범주에 대해서 알아보았으니 머신러닝의 종류에 대해서 알아보자

 

머신 러닝에는 3가지 종류가 존재한다. 

  • 지도 학습: 학습 데이터와 정답 데이터를 모두 제공하여 정답에 가깝게 모델을 설정한다.
  • 비지도 학습: 레이블이 없는 데이터에서 패턴 혹은 구조를 찾아낸다.
  • 강화학습: 행동에 대한 보상과, 체벌이 주어짐으로써 최대한 많은 보상을 수령하는 방향으로 학습되고, 예측한다.

대표적인 지도학습에는 회귀, 분류 등이 있고, 비지도학습에는 군집화 등이 있다.

2. 선형 회귀 1 (Linear Regression)

회귀란 여러 개의 독립변수와 한 개의 종속 변수 간의 상관관계를 모델링하는 기법을 의미한다. 예를 들어 부모의 키가 자식의 키에 어떤 영향을 미치고, 상관 관계를 가지는 지를 모델링하고 예측하는 것을 말한다.

 

선형 회귀는 산점도에서 모든 데이터에 대해 최소한의 오차범위를 가진 선형 그래프를 찾아가는 것을 의미한다. 

빨간색 점이 데이터라고 한다면, 점과 점 사이에서 가장 적은 오차 범위를 발생시킬 수 있는 선형 그래프를 그린 것이 파란색 선이다. 전체적인 코드를 살펴보자.

import matplotlib.pyplot as plt
from sklearn import linear_model

reg = linear_model.LinearRegression()
# linear_model 패키지 안에 클래스의 생성자 호출, 객체 reg 생성
# 대문자 X는 Matrix의미, 소문자 y는 벡터를 의미

X = [[0], [1], [2]] # 입력 데이터
y = [3, 3.5, 5.5]   # 출력이자, 정답이자, 레이블이자, 타겟
# y = wx + b 이때 b는 바이어스를 의미

# fit함수를 이용하여 모델 훈련 및 정확도 계산
reg.fit(X = X, y = y) # 모델 훈련
reg_score = reg.score(X = X, y = y)
# 정해진 답변과 지속적으로 비교하면서 정확성을 따지는 과정을 거쳐 높은 정확성을 위해 계속된 학습 진행 
print(reg_score)
print(reg.coef_) # coefficient가 1.24가 나온다. wx + b에서 가중치 w를 의미
print(reg.intercept_) # 2.75의 바이어스를 갖게 됨. wx + b에서 바이어스 b를 의미
print(reg.predict(X = [[5]]))

plt.scatter(x = X, y = y, color = 'red')
# 데이터에 대한 산점도 출력
# plt.show()

y_predict = reg.predict(X = X)
plt.plot(X, y_predict, color = 'blue', linewidth = 2)
plt.show()
# 파란 직선에서부터 실제 값( 빨간 점 )에 도달할 때까지의 거리가 오차 범위를 의미.

Linear Regression과 Logistic Regression으로 나눌 수 있다. Linear Regression은 단일 종속 변수만을 취급하지만, Logistic Regression은 범주형 데이터를 취급한다. Logistic Regression을 확인해 보자.

3. 선형회귀 2 (Logistic Regression)

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

wine = pd.read_csv(filepath_or_buffer = "./wine_csv_data.csv")
print(wine.info())
# 가중치가 2 개 이상인 경우 logistic regression 사용

data = wine[['alcohol', 'sugar', 'pH']].to_numpy() # 데이터프레임 형식의 wine을 Numpy 배열로 변환
print(data)
print(data.shape)
'''
[[값1, 값2, 값3]] -> 값1, 값2, 값3을 행 벡터라고 함
[[값1], [값2], [값3]] -> 값 1을 열 벡터라고 함
'''
target = wine['class'].to_numpy()
print(target)
print(target.shape)

(train_input, test_input, train_target, test_target) = train_test_split(data, target, train_size = 0.8, test_size = 0.2)
# 6497개의 데이터중에 0.8만큼은 학습에 사용되고, 0.2만큼은 예측(구별)에 사용
#(X_train, X_test, Y_train, Y_test) 보편적으로 사용.

lr = LogisticRegression()
lr.fit(X = train_input, y = train_target)
print(lr.score(X = train_input, y = train_target))
print(print(lr.score(X = test_input, y = test_target)))

print(lr.coef_)      # 가중치 (alcohol, sugar, ph) [0.42, 0.34, -3.99] 
print(lr.intercept_) # 바이어스 [8.25]

세 가지 변수 'alcohol', 'sugar', 'ph'에 대한 'class'를 예측하는 코드이다. train_test_split함수를 이용하여 데이터 셋을 4가지 영역으로 분할한다.

 

'X_train'과 'Y_train'을 이용하여 지도학습을 진행하게 된다. 모델의 학습이 완료되면 'X_test'를 통해 학습된 데이터를 토대로 예측을 진행하게 된다. 예측을 진행했다면 Y_test와 비교하며 정확도를 평가할 수 있다.

 

이러한 기능을 수행하는 함수가 train_test_split함수이고, 해당 함수는 데이터 배열을 수동으로 조작하지 않아도 된다는 장점이 있다.

 

(train_input, test_input, train_target, test_target) = train_test_split(data, target, train_size = 0.8, test_size = 0.2)

이 코드에서 train_size와 test_size를 보게 되면 합쳐서 1인 것을 알 수 있다. train과 test 영역을 8:2 비율로 나눈다는 뜻이다.

 

이제부터 머신러닝과 관련된 내용들을 서서히 배우기 시작하니 앞으로 집중해서 들어야겠다.