1. 머신러닝의 개념

  • 애플리케이션을 수정하지 않고도 데이터를 기반으로 패턴을 학습하고 결과를 예측하는 알고리즘 기법
    • 데이터를 기반으로 숨겨진 패턴을 인지하고, 이에 기반한 예측을 수행

1-1. 머신러닝의 분류

a. 지도 학습(Supervised Learning)

  • 분류, 회귀
  • 추천 시스템, 시각/음성 감지/인지
  • 텍스트 분석, NLP

    b. 비지도 학습(Un-supervised Learning)

  • 클러스터링(군집화)
  • 차원 축소
  • 강화 학습

1-2. 데이터 전쟁

  • 머신러닝의 가장 큰 단점은 데이터에 매우 의존적이라는 것
    • Garbage in, Garbage out

1-3. 파이썬과 R 기반의 머신러닝 비교

  • 둘 다 오픈 소스 프로그램 언어
  • 딥러닝에서는 파이썬이 조금 더 유리함

2. 파이썬 머신러닝 생태계를 구성하는 주요 패키지

  • 머신러닝 패키지: 사이킷런(Scikit-learn)
  • 행렬/선형대수.통계 패키지: 넘파이(Numpy), 사이파이(Scipy)
  • 데이터 핸들링: 판다스(Pandas)
  • 시각화: 맷플롭립(Matplotlib), 시본(Seaborn)
  • 이 외 서드파티 라이브러리

3. 넘파이

  • Numerical Python
  • 파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지
  • 루프를 사용하지 않고 대량 데이터의 배열 연산을 가능하게 하므로 빠른 배열 연산 속도를 보장
  • C/C++과 같은 저수준 언어 기반의 호환 API를 제공
  • 배열 기반의 연산과 더불어 다양한 데이터 핸들링 기능을 제공
  • 많은 머신러닝 알고리즘의 입력 데이터와 출력 데이터 타입으로 넘파이 배열을 이용

3-1. 넘파이 ndarray

● 넘파이 모듈 import

import numpy as np    # np는 alias(별칭)
  • ndarray: n-dimensional array, 다차원 배열
    • 1차원: 1행 n열 구조
    • 2차원: n행 m열 구조
    • 3차원: n행 m열 k면 구조
  • np.array()함수는 다양한 인자(ex> 파이썬 리스트)를 입력 받아 ndarray로 변환
  • shape 변수를 통해 ndarray의 크기를 파악할 수 있음, 튜플 반환(행, 열 등)
  • ndim 변수를 통해 ndarray의 차원을 파악할 수 있음

3-2. ndarray의 데이터 타입

  • ndarray 내의 데이터 값은 숫자, 문자열, bool 등 모두 가능
  • ndarray 내의 데이터 타입은 같은 데이터 타입만 가능
    • 한 개의 ndarray에 두 개 이상의 데이터 타입이 존재할 수 x
    • 만약 다른 데이터 유형이 섞여 있는 경우 데이터 크기가 더 큰 데이터 타입으로 일괄적으로 형변환 적용
  • dtype 속성으로 ndarray 내의 데이터 타입 확인 가능
  • astype() 함수를 통해 ndarray 내의 데이터 값의 타입 변경
    • astype(데이터형)
    • 대용량 데이터의 ndarray 생성 시 메모리 절약을 위해 보통 이용됨

3-3. arange, zeros, ones

  • arange(start = 0, stop, step) : start부터 (stop-1)까지의 값을 순차적으로 ndarray의 데이터 값으로 반환
  • zero((nrows, ncols)): 튜플 형태의 shape 값 입력 시 모든 값을 0으로 채운 해당 shape를 가진 ndarray 반환
  • ones((nrows, ncols), dtype = float64): 튜플 형태의 shape 값 입력 시 모든 값을 1으로 채운 해당 shape를 가진 ndarray 반환

3-4. 차원/ 크기 변경

  • reshape(nrows, ncols) 함수: ndarray를 특정 차원 및 크기로 변환
  • 지정된 사이즈로 변경이 불가능하면 오류 발생
    ValueError: cannot reshape array of size 10 into shape (4,3)
    
    • nrows * ncols가 전체 데이터 수와 일치해야 함
  • -1을 인자로 사용하면 원래 ndarray와 호환되는 새로운 shape로 변환
    • reshape(-1,5) => 원래 ndarray와 호환되게 행 수를 자동으로 계산해 n행 5열의 ndarray로
  • 여러 개의 넘파이 ndarray를 stack이나 concat으로 결합할 때 각각의 ndarray의 형태를 통일하기 위해 유용하게 사용됨
    tolist() 함수: ndarray -> 파이썬 리스트

3-5. 데이터 세트 선택 - 인덱싱(Indexing)

  • ● 종류
  • 특정한 데이터만 추출
    • 원하는 위치의 인덱스 값을 지정하면 해당 위치의 데이터가 반환됨
  • 슬라이싱(slicing)
    • 연속된 인덱스 상의 ndarray 추출
    • ex> 1:5라고 하면 인덱스 1 이상 5 미만에 해당하는 ndarray 반환
  • 팬시 인덱싱(Fancy Indexing)
    • 일정한 인덱싱 집합을 리스트 또는 ndarray 형태로 지정해 해당 위치에 있는 데이터의 ndarray를 반환
  • 불린 인덱싱(Boolean Indexing)
    • 특정 조건에 해당하는지의 여부인 True/False 갑 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 데이터의 ndarray 반환

a) 단일 값 추출

  • ndarray 객체에 해당하는 위치의 인덱스 값을 [] 안에 입력
    • 2차원의 경우 행,열로 분리된 로우와 칼럼 위치의 인덱스 활용
  • 인덱스는 0부터 시작
  • 추출된 값은 더 이상 ndarray 타입이 아니고 ndarray 내의 데이터 값을 의미
  • 인덱스에 마이너스 기호 사용 시 뒤에서부터 데이터 추출
    • -1은 맨 마지막 데이터
  • 단일 인덱스를 통해 ndarray 내의 데이터 값도 간단히 수정 가능
  • axis = 0: 로우 방향(↓)의 축, axis = 1: 컬럼 방향(→)의 축
    • 축 기반의 연산에서 axis 생략 시 axis = 0을 의미

b) 슬라이싱

  • : 기호를 이용해 연속된 데이터를 추출할 수 있음
    • 2차원의 경우 행,열로 분리된 로우와 칼럼 위치의 인덱스 활용
  • 추출된 데이터 세트는 ndrray 타입
    • 데이터 타입이 유지된다.
  • arr[0:3]: 인덱스 0 이상 3 미만에 해당되는 데이터 추출
  • 시작, 종료 인덱스는 생략 가능
    • 시작 인덱스 생략 시 자동으로 맨 처음 인덱스인 0으로 간주
    • 종료 인덱스 생략 시 자동으로 맨 마지막 인덱스로 간주
    • 시작/종료 인덱스를 모두 생략 시 전체 데이터 추출
  • 2차원 ndarray에서 뒤에 오는 인덱스를 없애면 1차원 ndarray를 반환

c) 팬시 인덱싱

  • 리스트나 ndarray로 인덱스 집합 지정 시 해당 위치의 인덱스에 해당하는 ndarray를 반환하는 인덱싱 방식
  • array2d[[0,1],2]: (0,2), (1,2)에 해당하는 데이터 추출

d) 불린 인덱싱

  • 조건 필터링검색 을 동시에 활용하는 방식
  • ndarray의 인덱스를 지정하는 [] 내에 조건문을 그대로 기재하는 방식
  • 동작 순서
    1. ndarray의 필터링 조건을 [] 안에 기재
    2. False 값은 무시하고 True 값에 해당하는 인덱스 값만 저장
      ※ True 값 자체인 1을 저장하는 것이 아닌 True 값을 가진 인덱스를 저장한다는 의미
    3. 저장된 인덱스 데이터 세트로 ndarray 조회

3-6. 행렬의 정렬

a. sort()

  • np.sort()의 경우 원래 행렬은 그대로 유지한 채 원본 행렬의 정렬된 행렬을 반환
  • ndarray.sort()의 경우 원래 행렬 자체를 정렬한 형태로 변환
    • 반환값이 없음(None)
  • 기본적으로 오름차순 정렬
    • 내림차순으로 정렬하기 위해 np.sort()[::-1] 와 같이 사용
  • 행렬이 2차원 이상일 경우 axis 축 값 설정을 통해 row 방향(axis = 0)이나 column 방향(axis = 1)으로 정렬 수행 가능

b) 정렬된 행렬의 인덱스 반환

  • np.argsort() 함수를 통해 정렬된 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환

  • 내림차순으로 정렬 시 원본 행렬의 인덱스를 구하려면 np.argsort()[::-1]과 같이 사용
  • 넘파이의 경우 메타 데이터를 가질 수 x
    • 실제 값과 그 값이 뜻하는 메타 데이터를 별도의 ndarray로 각각 가져야만 함 ```Python

      ex>

    name_array = [‘apple’, ‘banana’, ‘kiwi’] score_array = [90,80,50]

    시험 성적순으로 이름 출력

    idx = np.argsort(score_array) name_array[idx] ```

3-7. 선형대수 연산 - 행렬 내적/ 전치 행렬

a) 행렬 내적(행렬 곱)

  • np.dot()을 이용해 계산
  • 왼쪽 행렬의 행(row)과 오른쪽 행렬의 열(column)의 원소들을 순차적으로 곱한 뒤 그 결과를 모두 더한 값

  • 왼쪽 행렬의 개수와 오른쪽 행렬의 행 개수가 동일해야 내적 연산 가능

b) 전치 행렬

  • 원 행렬에서 행과 열의 위치를 교환한 원소로 구성한 행렬
  • 행렬 A의 전치 행렬을 $A^{T}$와 같이 표기
  • np.transpose()를 통해 쉽게 구할 수 있음