Data Science

[혼자공부하는머신러닝+딥러닝]머신러닝과 데이터 전처리

아란정 2024. 7. 31. 00:11

1. 나의 첫 머신러닝

  1. 인공지능과 머신러닝, 딥러닝
    인공지능, 머신러닝, 딥러닝이 무엇인지 알아보고 그 차이를 살펴본다. 
  2. 코랩과 주피터 노트북
  3. 마켓과 머신러닝
    KNN(K-Nearest Neighbor)을 사용해 2개 종류를 분류하는 머신러닝 모델을 훈련한다. 

2. 데이터 다루기

  1. 훈련 세트와 테스트 세트
    지도/비지도 학습의 차이를 배운다. 모델을 훈련시키는 훈련 세트와 모델을 평가하기 위한 테스트 세트로 데이터를 나눠서 학습한다. 
  2. 데이터 전처리
    전처리 과정을 거친 데이터로 훈련했을 때의 차이를 알고 표준점수로 특성의 스케일을 변환하는 방법을 배운다. 

인공지능이란

인공지능은 컴퓨터가 학습, 추론할 수 있는 지능을 의미한다. 이는 Strong AI와 Weak AI로 구분할 수 있다. 흔히 영화에서 묘사되는 사람처럼 대화하는 비서형이 Strong AI(=Artificial general intelligence), 우리가 현실에서 마주하는 특정분야에서 보조 역할을 수행하는 것이 Weak AI이다.  

머신러닝이란

머신러닝이란 규칙을 일일이 알려주지 않아도 스스로 규칙을 학습할 수 있는 "알고리즘"을 연구하는 분야다. 인공지능 하위 분야 중 지능을 구현하기 위한 sw 분야다. ( 패턴 파악은 지능을 의미해서 그런가보다.) 통계학과 깊은 관련이 있는 분야로 통계학에서 유래한 알고리즘이 많다. 최근에는 수학, 통계보다 경험을 바탕으로 발전하는 경우도 많다. 

머신러닝은 스스로 기준을 찾아서 일을 합니다. 

대표적인 머신러닝 라이브러리로 "사이킷런(scikit-learn)"이 있다. 파이썬 API를 받아와 사용하는데 파이썬이 가지는 직관성과 컴파일하지 않아도 되어 사용이 편리하다는 장점이 있다. 

딥러닝이란

머신러닝 알고리즘 중에 인공신경망을 기반으로 한 방법들을 딥러닝이라고 통칭한다. 따라서 인공 신경망(Aritificial Neural Network)과 딥러닝(Deep Learning)을 구분하지 않고 사용한다. 기존 머신러닝 방법 중 합성곱 신경망(LeNet-5)으로 손글씨 인식을 성공하고 이후 이미지 분류 대회에서 합성곱 신경망인 AlexNet이 압도적인 성능을 보이면서 이미지 분류에 합성곱 신경망이 사용된다. 

  • 순차 데이터 처리는 순환 신경망이 뛰어난 성능을 보인다. 

놀라운 성능의 원동력

1. 복잡한 알고리즘을 훈련할 풍부한 데이터와 컴퓨터 성능

2. 혁신적인 알고리즘 개발

파이썬 API를 제공하는 구글의 딥러닝 라이브러리: TensorFlow, 메타의 PyTorch가 있다. 

 

데이터 마이닝, 빅데이터, 데이터과학(데이터 사이언스)는 명확히 구분할 수 없다. 그 안에 속한 기술을 정확히 정의하기 어렵다. 이 모든 기술이 인공지능의 큰 범주 안에 포함되고 큰 흐름은 일맥상통한다. 

 

실습 환경

구글 코랩 colab - 노트북 Notebook

  • 대화형 프로그래밍 Jupyter의 커스터마이징
  • text cell 과 code cell을 함께 담을 수 있다.
  • 실행 결과가 노트북과 함께 저장된다. 
  • 최대 5개의 노트북 생성 가능 - 실행 중지

기본 용어

  • feature 특성 : 데이터의 특징들
  • 학습 fit
  • KNN 알고리즘
    주위의 다른 데이터를 보고 다수를 정답으로 한다.
  • 모델 : 머신러닝 프로그램에서 알고리즘이 구현된 객체
  • Accuracy

Classification
여러 종류(class) 중 하나를 구별하는 문제 - 2개 중 하나를 고르는 거면 binary classfication

  1. 데이터 준비
  2. colab 노트 생성

 

핵심 패키지와 함수
*패키지
: 기능 함수의 묶음

그래프 생성: matplotlib

  • scatter()
import matplotlib.pyplot as plt

plt.scatter(b_length, b_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

scikit-learn

  • 사이킷런은 feature가 새로로 늘어진 2차원 리스트가 필요하다. 
data = [[l,w] for l, w in zip(length, weight)]

//zip()은 나열된 리스트에서 원소를 하나씩 꺼내주는 역할을 한다
  • KNeighborsClassifier()
    근처 가까운 데이터의 개수의 기본값은 5다. 
#특정 클래스만 import할 때 from ~ import를 이용한다.
from sklearn.neighbors import KNeighborsClassifier

=
import sklearn
model = sklearn.neighbors.KNeighborsClassifier()

#참고 데이터 개수 변경
kn49 = KNeighborsClassifier(n_neighbors = 49)
  • fit()
    모델 훈련
  • predict()
  • score()
    훈련된 사이킷런 모델의 성능 측정: predict() 메서드로 예측을 수행하고 분류 모델일 경우 정답과 비교해 올바르게 예측된 개수의 비율[0, 1] 을 반환한다. 
kn.fit(data, target)
kn.score(data, target)

#predict() : 새로운 데이터의 정답을 예측한다.
#scroe() : 훈련된 모델의 성능을 평가한다. 

kn.predict([[30, 600]]) //리스트 형태로 전달해야 한다.

> KNN은 훈련된 것이 없고 fit()으로 저장한 데이터를 참조하여 유사값으로 구분한다. 

  • import
import numpy as np

input_arr = np.array(data)
target_arr = no.apper(target)

 

훈련 세트와 테스트 세트

샘플링 편향 Sampling data

훈련 세트와 테스트 세트는 같은 위치에 있다면 함께 선택되어야 한다. 

넘파이 numpy: 파이썬 배열array 라이브러리

  • 고차원 리스트 생성과 조작을 위해 사용
  • seed() 
    난수 생성을 위한 정수 초깃값 지정 - 동일한 재현을 위해 사용
  • 훈련/테스트 세트를 함께 선택하기 위해 인덱싱 
  • 배열 인덱싱 array indexing
#shape는 배열의 크기(샘플 수, 특성 수)를 알려준다
input_arr.shape()

#arange()는 1씩 증가하는 인덱스를 만든다.
#arrange(시작, 마지막, 간격)
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

#array indexing은 한 번에 여러 개의 인덱스로 여러 원소를 선택할 수 있다. 
print(input_arr[[1,3]]

 

?? 78쪽에 plt.scatter(train_input[:, 0], train_input[:,1] 에 [:] 과 0,1 은 어떤 뜻이지?

  • train_input( : ) : 배열의 모든 행에서 첫 번째 열 ( ,0)을 선택한다.
  • ( : ) 는 슬라이싱: 마지막 행은 선택되지 않는다.
  • 0, 1은 column index를 의미한다. 

plt.scatter() 은 두 배열의 특정 열을 선택하여 산점도를 그리는 구문이다. 

 

데이터 전처리

> 데이터 특성 스케일을 일정 기준으로 맞춰주는 작업

넘파이로 다차원 리스트 생성

#column_stack()은 전달받은 리스트를 일렬로 세워 나란히 연결한다. (행이 추가)
import numpy as np
np.column_stack(([1,2,3], [4,5,6]))

 

target data 생성 [1], [0] -> np.ones(), np.zeros()

#np.concatenate()는 한 차원에 이어붙인다. (열이 추가)
data_target = np.concatenate((np.ones(35), np.zeros(14)))

np.column_stack() 과 np.concatenate()

 

자동화: 사이킷런으로 훈련 세트와 테스트 세트 나누기

#train_test_split()과 stratify()
#stratify 매개변수에 타깃 데이터를 전달하면 클래스 비율에 맞게 데이터를 나눈다. 
from sklearn.model_selection import train_test_split
train_input, test_input_ train_target, test_target = train_test_split(data_, target_, stratify = target_, random_state = 42)

 

KNN에서 x축 간격과 y축 간격을 맞춰야 정확한 예측이 가능하다.

  • 두 feature의 값의 범위가 다르면 (= scale)이 다르면, 가까운 5개 샘플의 거리의 근묵자흑을 이용한 KNN은 정확한 값을 내지 못한다. 
  • x축과 y축의 범위는 xlim, ylim으로 조정하고
  • 특성의 스케일을 일정 기준으로 맞춰준다 
Scale
특성들(예로, 길이와 무게)의 값의 범위가 다르면 두 특성의 스케일이 다르다고 표현한다. 
Data proprocessing
알고리즘은 샘플 간의 거리에 영향을 많이 받으므로 제대로 사용하려면 특성값을 일정한 기준으로 맞춰야 한다. 

*트리 기반 알고리즘은 feature scale이 달라도 잘 동작한다. 

특성의 거리 전처리 방법 중 하나는 표준점수다. (z 점수) 표준점수는 실제 특성값의 크기와 관계없이 특성들을 동일 조건에서 비교할 수 있게 한다.

  • 표준점수
    각 특성값이 0에서 표준편차의 몇 배만큼 떨어져 있는지를 나타낸다. 
  • 표준편차
    데이터가 평균에서 먼 정도 - 분산을 나타낸다. 

 

#특성마다 값의 스케일이 다르므로 평균과 표준편차는 각 특성별로 계산한다. 
#axis = 0

mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)

 

 

 

Broadcasting 브로드캐스팅
샘플 모든 행에 대해 mean을 빼고 std를 적용하는 넘파이 기능
> 크기가 다른 넘파이 배열에서 자동으로 사칙 연산을 모든 행이나 열로 확장하여 수행하는 기능

#표준점수 z점수 변환
train_scaled = (train_input - mean)/std

*훈련 세트에도 적용해줘야 한다. 

브로드캐스팅을 통해 x, y축의 범위를 통일해주었다. 이제 Knn 모델 훈련이 가능하다.

#test_set도 broadcasting 해준다. 
test_scaled = (test_input - mean) / std

 

특성의 스케일을 조정하는 경우, 표준점수로 충분하다. 
데이터 전처리 시에는 훈련 세트를 변환한 방식 그대로 테스트 세트를 변환해야 한다는 것이다. 

 

학습 내용 정리

KNN 이란 거리 기반 타겟 데이터 예측 - 지도 학습 -알고리즘을 사용해 입력 데이터가 도미인지, 다른 종류인지 예측해보았다. 모델을 학습하기 위해 훈련 / 테스트 데이터 세트로 나누어주는데 이때 scikit-learn 라이브러리의 train_test_split을 이용해 편향을 예방할 수 있었다.  

모델의 정확도를 높이기 위해 데이터 특성 스케일을 조정해주는 데이터 전처리 작업을 진행했다. 데이터의 특성 마다 범위가 다르므로 같은 범위 내에서 처리하도록 정규화했다. normalize 하면 비율로 처리할 수 있다. 

예측하는 알고리즘은 지도 학습, 특징을 찾는 것은 비지도 학습니다. 

 

- numpy

# numpy는 계산을 위해 필요한 라이브러리

# 난수 생성을 위한 정수 초깃값 지정 seed
np.seed()

# 일정 간격의 배열 생성 arange()
np.arange()

 

- scikit-learn

# 훈련/테스트 세트 분리
train_test_split()

# 세트 비율 조정 stratify
fish_train, fish_test = train_test_split(fish_data, fish_target, stratify(fish_target))

# 세트 무작위로  shuffle
np.seed(숫자)
np.random.shuffle(index)

# KNN 이웃 객체의 메서드
# 입력한 데이터에 가장 가까운 이웃을 찾아 이웃 샘플의 인덱스 반환
from sklearn.neighbors import KNeighborsClassifier

# 기본값 5
kn = KNeighborsClassifier()

# 변경
indexs = kn.n_neighbors([[,]])

# 변경 방법 2
kn49 = kn.KNeighborsClassifier(n_neighbors = 49)