Group Study (2023-2024)/Machine Learning 입문

[ML입문] week1 - 나의 첫 머신러닝, 데이터 다루기

임지 Imjee 2023. 11. 6. 22:43

1. 인공지능

1) 인공지능

: 사람처럼 생각하고 추론하는, 지능이 있는 컴퓨터 시스템 알고리즘

이러한 인공지능은 기능에 따라 여러 하위범주를 가진다. 그 중 머신러닝과 딥러닝이 가장 대표적이다.

2) 머신러닝

  • 인공지능의 하위 범주 중 하나이다.
  • 머신러닝은 데이터를 통해 컴퓨터가 스스로 학습하고 작업을 수행하도록 한다.
  • 다른 인공지능에 비해 소프트웨어와 관련이 있다는 점에서 차이가 있다.
  • 대표적인 머신러닝 라이브러리는 ‘사이킷런’이다.

3) 딥러닝

  • 머신러닝의 하위 범주 중 하나이다.
  • 딥러닝은 머신러닝 중에서도, 인공신공망을 사용한다.
  • 대표적인 딥러닝 라이브러리는 '텐서플로' 이다.

2. 지도 학습과 비지도 학습

지도학습과 비지도학습은 타겟 데이터, 즉 데이터의 정답를 제공하느냐를 기준으로 나뉜다.

1) 지도 학습

: 입력과 타겟이 있는 데이터를 사용해 학습하는 걸 지도학습 (supervised learning)이라고 한다.

 밑에서 설명할 K-최근접 이웃 (KNN) 방식도 지도학습의 일종이다.

2) 비지도 학습

: 타겟이 없고 입력만 있는 데이터를 사용해 학습하는 걸 비지도학습 (unsupervised learning)이라고 한다.

 


3. 훈련 세트, 테스트 세트 생성

훈련 세트와 테스트 세트를 각각 가지고 있다면 가장 이상적이겠으나, 실제로는 훈련 데이터에서 훈련 세트와 테스트 세트를 나누어 머신러닝모델을 구축하는 것이 일반적이다.

단, 훈련 세트와 테스트 세트를 만들 때, 다양한 데이터들이 골고루 분배되었는지가 중요하다.

 

1) 데이터 분배 -  train_test_split

from sklearn.model_selection import train_test_split

train_input , test_input, train_target, test_target =
train_test_split(fish_data, fish_target, stratify = fish_target, random_state = 42)

사이킷런의 model_selection 모듈에서, train_test_split 을 호출한다.

fish_data 넘파이 배열을 train_inputtest_input으로, fish_target 넘파이 배열을 train_targettest_target으로 나눈다.

이때, stratify = fish_target 을 통해, fish_target 배열의 값이 골고루 섞이도록 한다.

 

이를 그림으로 간단히 나타내보면 다음과 같다.

 

2) 데이터 분배 확인 - matplotlib

import matplotlib.pyplot as plt

plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(test_input[:,0], test_input[:, 1])

plt.xlabel('length')
plt.ylabel('weight')
plt.show()

matplotlib.pyplot 라이브러리를 이용하면, 데이터를 시각화해서 볼 수 있다.

plt.scatter(train_input[:, 0], train_input[:, 1])plt.scatter(test_input[:,0], test_input[:, 1]) 를 통해,

데이터가 훈련 세트와 테스트 세트에 골고루 분배되었는지를 산점도(scatter)로 확인 할 수 있다.

파랑색 : 훈련세트 , 주황색 : 테스트 세트

 

 


4. K - 최근접 이웃 (KNN) 알고리즘

1)  K - 최근접 이웃 (KNN) 알고리즘

: 가장 가까운 데이터를 K개(기본값 k=5)를 확인한 후, K 개의 데이터 중 많은 클래스로 새로운 데이터의 특성을 정하는 알고리즘이다. 

 

2)  KNN 알고리즘 구현

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit = (train_input, train_target)
kn.score(test_input, test_target)

사이킷런의 neighbors 모듈에서, KNeighborsClassifier 클래스를 호출한다.

kn.fit = (train_input, train_target) : 훈련 세트로 모델을 하나 구축한다.

kn.score(test_input, test_target) : 훈련 세트로 구축된 모델에 테스트 세트를 대입했을 때의 정확도를 확인한다.

 

 


5. 데이터 전처리

1) 데이터 전처리

: 입력 데이터를 머신러닝 모델이 사용할 수 있도록 적절히 가공하는 것을 뜻한다.

 대표적인 전처리 방법으로는 표준화가 있다.

 표준화 식은 다음과 같다.

더보기

표준화식 = ( 특정 값 - 평균 ) / 표준편차

 

2) 데이터 표준화 (표준점수로 바꾸기)

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

train_scaled = (train_input - mean) / std
test_scaled = (test_input - mean) / std

넘파이 라이브러리의 mean 메소드를 통해 평균을 구하고, std 메소드를 통해 표준편차를 구한다.

이때, axis = 0 은 행을 따라서, 즉 열을 하나하나 계산한다.

반대로, axis = 1은 열을 따라서, 즉 행을 하나하나 계산한다.

 

보통 행렬에서 샘플을 행에, 특성을 열에 두므로, axis = 0을 통해 값을 구했다.

 

이때, train_input 배열은 (36,2)이고, 우리가 구한 mean은 (1,2)이다.
넘파이는 위 같은 계산을, 각 행에 하나하나씩 mean을 빼는 방법으로 처리한다.
이와 같은 걸 넘파이 브로드캐스팅이라 한다.

 

3) 새로운 데이터

이렇게 만든 모델로, 새로운 데이터를 분류해보려 한다.

단, 각 훈련 세트와 테스트 세트를 전처리 했으므로, 새로운 데이터 또한 전처리해야한다.

이때, 표준화할 때 평균과 표준편차는 훈련 세트의 것을 사용해야함에 주의해야한다.

 

new = ([25,150] - mean) /std

plt.scatter(train_scaled[:,0] , train_scaled[:,1])

plt.scatter(new[0], new[1], marker = '^')

plt.show()

4) 전처리 데이터에서 모델 훈련

최종적으로 배운 걸 모두 종합하면 다음과 같다.

kn.fit(train_scaled, train_target)

test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)

print(kn.predict([new]))

distances, indexes = kn.kneighbors([new])

plt.scatter(train_scaled[:,0] , train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.scatter(train_scaled[indexes,0], train_scaled[indexes, 1])

plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

새로운 데이터와 가까운 데이터들은 초록색 원으로 나타냈다.


6. 요약

1. 인공지능의 한 부류로 머신러닝이 있고, 머신러닝의 한 부류로 딥러닝이 있다.

2. 타겟 데이터의 유무에 따라 지도학습과 비지도학습으로 나뉜다.

3. matplotlib 라이브러리를 통해 데이터를 시각화해서 볼 수 있다.

4. 훈련 세트와 테스트 세트를 나누기 위해 sklearn.model_selectiontrain_test_split를 사용한다.

5. KNN 알고리즘은 특정 데이터와 가까운 k의 데이터를 선정해 다수결에 따라 클래스를 분류한다.

6. 데이터를 머신러닝모델이 사용할 수 있도록 하려면 전처리 작업이 필요하다.

 


* 참고자료

'혼자 공부하는 머신러닝 딥러닝'  인프런 강의

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90%EA%B3%B5%EB%B6%80-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D/dashboard