[혼공머신] 1주차_도미와 빙어와 함께 호기롭게 시작!

01_1 인공지능과 머신러닝, 딥러닝

인공지능이란

  • 인공지능(artificial intelligence) : 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술

  • 인공일반지능(강인공지능) : 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템
  • 약인공지능 : 특정 분야에서 사람의 일을 도와주는 보조 역할만 가능

 

머신러닝이란

  • 머신러닝(machine learning) : 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야
  • 사이킷런(scikit-learn) : 컴퓨터 과학 분야의 대표적인 머신러닝 라이브러리

 

딥러닝이란

  • 딥러닝(deep learning) : 많은 머신러닝 알고리즘 중에 인공 신경망(artificial neural network)을 기반으로 하는 방법들을 통칭
  • LeNet-5 : 1998년 얀 르쿤이 신경망 모델을 만들어 손글씨 숫자를 인식하는 데 성공(최초의 합성곱 신경망)
  • AlexNet : 2012년 제프리 힌턴의 팀이 이미지 분류 대회인 ImageNet에서 압도적인 성능으로 우승
  • 알파고 : 2016년 이세돌과의 대국
  • 챗GPT : 2022년

 

인공신경망이 이전과 다르게 놀라운 성능을 달성하게 된 원동력

  1. 복잡한 알고리즘을 훈련할 수 있는 풍부한 데이터
  2. 컴퓨터 성능의 향상
  3. 혁신적인 알고리즘 개발

 

오픈소스 라이브러리

  • 텐서플로 : 2015년 구글이 오픈소스로 공개한 가장 널리 사용되는 딥러닝 라이브러리
  • 파이토치 : 2018년 메타(구 페이스북)이 오픈소스로 발표한 딥러닝 라이브러리

 

01-2 코렙과 주피터 노트북

회사 컴퓨터에 VS Code를 설치하기는 쵸큼 곤란하여서 회사에서는 Google Colab을 사용합니다.
그래서 이 파트를 그냥 건너뛸까하다가 복습하는겸 꼼꼼히 읽었습니다.
Default 폰트가 영 마음에 들지 않아서 D2coding 폰트로 변경하고 다크모드로 사용중입니다.
Colab의 설정창에서는 변경이 안되어서
[Chrome 설정] – [모양] – [글꼴 맞춤설정] – [고정폭 글꼴] 에서 변경하였습니다.

구글 코렙

  • 셀(cell) : 코렙에서 실행할 수 있는 최소 단위
  • 텍스트 셀 : HTML과 마크다운을 혼용해서 사용할 수 있습니다.
  • 코드 셀
  • 노트북 : 구글이 대화식 프로그래밍 환경인 주피터를 커스터마이징한 것

노트북은 구글 클라우드의 컴퓨팅 엔진에 연결되어 있으며 이 서버의 메오리는 약 12기가이고 디스크 공간은 약 225기가입니다.

코랩 노트북으로 동시에 사용할 수 있는 구글 클라우드의 가상 서버는 최대 5개 입니다.

 

 

01-3 마켓과 머신러닝

분류(classification) : 머신러닝에서 여러 개의 종류(혹은 클래스) 중 하나를 구별해 내는 문제

이진 분류(binary classification) : 2개의 클래스 중 하나를 고르는 문제

특성 : 데이터의 특징

산점도 : x, y축으로 이뤄진 좌표계에 두 변수(x,y)의 관계를 표현하는 방법

matplotlib : 파이썬에서 과학계산용 그래프를 그리는 대표적인 패키지

import : 따로 만들어둔 파이썬 패키지(클래스와 함수의 묶음)를 사용하기 위해 불러오는 명령

 

 

k-최근접 이웃(k-Nearest Neighbors, KNN) 알고리즘 : 새로운 데이터가 들어왔을 때, 기존 데이터 중에서 가장 가까운 k개의 이웃을 찾아보고, 그 다수의 특성에 따라 새 데이터를 분류하거나 값을 예측하는 방법

 

zip() : 여러 개의 순차 자료형(리스트, 튜플 등)을 병렬로 묶어주는 함수

for l, w in zip(length, weight)

zip(length, weight)가 만들어준 튜플을 하나씩 꺼내서 첫 번째 값을 l, 두 번째 값을 w에 할당

 

훈련 : 모델에 데이터를 전달하여 규칙을 학습하는 과정

fit() 메서드 : 주어진 데이터로 알고리즘을 훈련

score() 메서드 : 사이킷런에서 모델을 평가하는 메서드 (0에서 1 사이의 값을 반환)

모델 : 머신러닝 알고리즘을 구현한 프로그램

 

 

사이킷런의 k-최근접 이웃 알고리즘은 주변에서 가장 가까운 5개의 데이터를 보고 다수결의 원칙에 따라 데이터를 예측합니다.

 

02-1 훈련 세트와 테스트 세트

지도 학습과 비지도 학습

머신러닝 알고리즘은 크게 지도학습(supervised learning)과 비지도 학습(unsupervised learning)으로 나눌 수 있습니다.

지도 학습 알고리즘은 입력(데이터)과 타깃(정답)으로 이뤄진 훈련 데이터가 필요합니다.

특성(feature) : 데이터의 입력값이자 예측하는데 사용하는 데이터의 데이터의 속성 값

지도 학습은 정답(타깃)이 있으니 알고리즘이 정답을 맞히는 것을 학습합니다.

반면 비지도 학습 알고리즘은 타깃 없이 입력 데이터만 사용합니다.

머신러닝 알고리즘은 지도 학습, 비지도 학습 외에 강화 학습(reinforcement learning)을 또 다른 종류로 크게 분류합니다.

강화 학습 알고리즘은 타깃이 아니라 알고리즘이 행동한 결과로 얻은 보상을 사용해 학습합니다.

 

훈련 세트와 테스트 세트

  • 테스트 세트(test set) : 평가에 사용하는 데이터
  • 훈련 세트(train set) : 훈련에 사용하는 데이터
  • 샘플(sample) : 하나의 데이터

머신러닝의 정확한 평가를 위해서는 테스트 세트와 훈련 세트가 따로 준비되어야 합니다.

 

zip() 함수 : 여러 개의 순차형 자료형(리스트, 튜플, 문자열 등)을 같은 인덱스끼리 묶어서 튜플 형태로 반환해주는 함수

zip(fish_length, fish_weight)

: 두 리스트 fish_length와 fish_weight를 동일한 인덱스끼리 묶어서 (길이, 무게) 튜플을 만듦.

[[l, w] for l, w in zip(...)]

: 각 쌍의 (l, w)를 다시 [l, w] 리스트 형태로 변환해서 결과적으로 2차원 리스트로 만듦.

fish_target = [1]*35 + [0]*14

: 정답값(레이블, target) 리스트를 만드는 부분

 

샘플링 편향

훈련하는 데이터와 테스트하는 데이터에는 샘플이 고루 섞여 있어야 합니다.

일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미로 샘플링 편향(sampling bias)이라고 부릅니다.

훈련 세트와 테스트 세트에 있는 샘플의 클래스 비율이 다르면 제대로 된 지도 학습 모델을 만들 수 없습니다.

 

넘파이

넘파이(numpy)는 파이썬의 대표적인 배열(array) 라이브러리입니다.

넘파이는 고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구를 많이 제공합니다.

1차원 배열은 선이고, 2차원 배열은 면, 3차원 배열은 공간을 나타냅니다.

 

 

첫 번째 [] : 배열에서 값을 가져오겠다는 의미

두 번째 [] : 가져올 인덱스 번호들을 리스트로 전달

배열 인덱싱(array indexing) : 1개의 인덱스가 아닌 여러 개의 인덱스로 한 번에 여러 개의 원소를 선택할 수 있습니다.

 

 

두 번째 머신러닝 프로그램

fit() 메서드를 실행할 때마다 KNeighborsClassifier 클래스의 객체는 이전에 학습한 모든 것을 잃어버립니다.

이전 모델을 그대로 두고 싶다면 KNeighborsClassifier 클래스 객체를 새로 만들어야 합니다.

 

predict() 매서드 : 머신러닝 모델에서 학습이 끝난 모델(kn 등)이 새로운 데이터에 대한 예측값(분류 또는 회귀값)을 반환하는 함수

predict() 메서드가 반환하는 값은 단순한 파이썬 리스트가 아니라 넘파일 배열입니다.

 

훈련 모델 평가

모델을 훈련할 때 사용한 데이터로 모델의 성능을 평가하는 것은 정답을 미리 알려주고 시험을 보는 것과 같습니다.

공정하게 점수를 매기기 위해서는 훈련에 참여하지 않은 샘플을 사용해야 합니다.

 

02-2 데이터 전처리

넘파이로 데이터 준비하기

np.column_stack() : 여러 1차원 배열(리스트, 넘파이 배열)을 열 단위로 묶어서 2차원 배열로 만드는 함수

 

즉, 각 배열을 열(column)로 세워서 옆으로 나란히 쌓는 것

※ 주의 : 괄호 () 안에 튜플 형태로 여러 배열을 묶어서 넣어야 합니다.
그래서 괄호가 두 겹으로 보이는 것!

np.ones(shape) : 지정한 모양(shape)으로 1로 채워진 배열을 생성

np.zeros(shape) : 지정한 모양(shape)으로 0으로 채워진 배열을 생성

np.concatenate() : 여러 배열을 지정한 축(axis) 방향으로 이어 붙이는 함수

  • axis=0 → 행 방향 (위아래)
  • axis=1 → 열 방향 (좌우)

 

데이터 특성과 타겟값을 하나로 묶기
np.column_stack()

데이터 여러 세트를 합치기
np.concatenate()

 

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

train_test_split() : 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나누어 주는 함수

물론 나누기 전에 알아서 섞어 줍니다!

사이킷런의 model_selection 모듈 아래에 있습니다.

자체적으로 랜덤 시드를 지정할 수 있는 random_state 매개변수도 존재합니다.

이 함수는 기본적으로 25%를 테스트 세트로 떼어냅니다.

무작위로 데이터를 나누었을 때 샘플이 골고루 섞이지 않을 수 있습니다.

특히 일부 클래스의 개수가 적을 때 이런 일이 생길 수 있습니다.

이럴때 stratify 매개변수에 타깃 데이터를 전달하면 클래스 비율에 맞게 데이터를 나눕니다.

훈련 데이터가 작거나 특정 클래스의 샘플 개수가 적을 때 특히 유용합니다.

 

 

KNeighborsClassifier 클래스는 주어진 샘플에서 가장 가까운 이웃을 찾아 주는 kneighbors() 메서드를 제공합니다.

이 메서드는 이웃까지의 거리와 이웃 샘플의 인덱스를 반환합니다.

KNeighborsClassifier 클래스의 이웃 개수인 n_neighbors의 기본 값은 5이므로 5개의 이웃이 반환됩니다.

삼각형 샘플에 가장 가까운 5개의 샘플이 초록 다이아몬드로 표시되었습니다.

 

기준을 맞춰라

 

스케일(scale) : 두 특성(길이와 무게)의 값이 놓인 범위

데이터 전처리(data preprocessing) : 특성값을 일정한 기준으로 맞추어 주는 것

표준점수(standard score) : 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지를 나타냅니다. (혹은 z 점수라고도 부릅니다)

표준화(standardization) : 데이터를 표준점수로 변환하는 과정

브로드캐스팅(broadcasting) : 서로 다른 크기의 배열간 연산을 가능하게 해주는 넘파이 기능

 

전처리 데이터로 모델 훈련하기

 

훈련 후 테스트 세트를 평가할 때는 훈련 세트의 기준으로 테스트 세트를 변환해야 같은 스케일로 산점도를 그릴 수 있습니다.

 


train_test_split() 함수란?

머신러닝에서 데이터를 훈련용과 테스트용으로 나누는 함수

1
2
3
4
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target)
cs

주요 매개변수

1️⃣ shuffle

  • 기본값 : True

  • 데이터를 나누기 전에 무작위로 섞을지 여부를 결정.

  • 데이터가 순서대로 정렬되어 있다면, 섞지 않으면 훈련 세트와 테스트 세트가 한쪽으로 몰릴 수 있습니다.
    → 일반적으로 shuffle=True로 해두는 게 좋아요.

train_test_split(data, target, shuffle=False)

이렇게 하면 섞지 않고 순서대로 나눔.

2️⃣ stratify

  • 클래스 비율(분류 문제의 경우)을 훈련 세트와 테스트 세트에 똑같이 유지해주는 옵션.

  • 특정 클래스 샘플이 너무 적거나, 비율이 치우친 데이터셋에서는 반드시 필요!

train_test_split(data, target, stratify=target)

target의 클래스 비율을 그대로 유지하며 훈련/테스트 세트로 나눔.

 

이걸 안 쓰면 섞였을 때 샘플 비율이 훈련 세트나 테스트 세트에서 심하게 달라질 수 있어요.
샘플링 편향(Sampling Bias) 문제를 예방하는 역할.

함수와 메서드의 차이

구분 설명
함수(Function) 독립적으로 호출되는 코드 조각 print(), len(), train_test_split()
메서드(Method) 객체(object)에 종속된 함수, 클래스 안에 포함 list.append(), array.mean(), kn.fit(), kn.predict()

 

데이터를 전처리할 때 전체 데이터를 먼저 표준점수로 변환한 후 훈련 세트와 테스트 세트로 나누면 안되나요?

반드시 먼저 훈련 세트를 사용해서 표준점수로 변환해야 합니다.

그다음 훈련세트에서 구한 평균, 표준편차를 사용해 테스트 세트를 변환해야 합니다.

그렇지 않고 훈련 세트와 테스트 세트를 합친 전체 데이터로 표준화를 수행하면 테스트 세트의 정보가 유출된 셈입니다.

이를 정보 누설(Information Leak) 또는 데이터 누설(Data Leak)이라고 합니다.

데이스트 세트를 전처리에 사용하면 모델이 실전에 투입되었을 때 만나는 데이터와 테스트 세트를 동등하게 취급하지 않는 셈입니다.

 


기본 숙제(필수)

코랩 실습 화면 캡쳐하기

 

추가 숙제(선택)

Ch.02(02-1) 확인 문제 (p.90) 풀고 설명하기

1번 문제

머신러닝 알고리즘의 한 종류로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습 지도방법은 무엇인가요?

① 지도 학습
② 비지도 학습
③ 차원 축소
④ 강화 학습

정답 : ① 지도 학습

해석 :
지도 학습은 입력 데이터와 그에 대한 정답을 함께 제공하여, 모델이 정답을 맞히도록 학습시키는 방법입니다.
이 정답이 있어야  지도가 가능하므로, 타깃이 없는 경우는 비지도 학습, 보상에 따라 학습하는 경우는 강화 학습에 해당합니다.

2번 문제

훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

① 샘플링 오류
② 샘플링 실수
③ 샘플링 편차
④ 샘플링 편향

정답 : ④ 샘플링 편향

해석 :
훈련 데이터와 테스트 데이터가 고르게 섞여 있지 않고 한쪽에 치우치게 되면 발생하는 문제를 샘플링 편향이라 합니다.
이 편향이 발생하면 모델이 특정 데이터에만 치우쳐서 학습하기 때문에 실제 성능이 떨어지고 일반화가 어려워집니다.

3번 문제

사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

① 행 : 특성, 열 : 샘플
② 행 : 샘플, 열 : 특성
③ 행 : 특성, 열 : 타깃
④ 행 : 타깃, 열 : 특성

정답 : ② 행 : 샘플, 열 : 특성

해석 :
사이킷런에서는 항상 행은 각 샘플(데이터)을, 열은 각 특성을 의미합니다.
예를 들어, 49개의 샘플에 대해 2개의 특성이 있다면 배열의 형태는 (49, 2)가 됩니다.

4번 문제

다음 중 배열 arr에서 두 번째 원소에서부터 다섯 번째 원소까지 선택하기 위해 올바르게 슬라이싱 연산자를 사용한 것을 무엇인가요?

① arr[2:5]
② arr[2:6]
③ arr[1:5]
④ arr[1:6]

정답 : ③ arr[1:5]

 

해석 :
파이썬의 슬라이싱 규칙은 시작 인덱스는 포함, 끝 인덱스는 포함하지 않습니다.
두 번째 원소는 인덱스 1, 다섯 번째 원소는 인덱스 4까지니까 arr[1:5]가 정답입니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다