[ESSA 1주차 과제]파머완 1장_파이썬 기반의 머신러닝과 생태계 이해
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차원의 경우
행,열
로 분리된 로우와 칼럼 위치의 인덱스 활용
- 2차원의 경우
- 인덱스는 0부터 시작
- 추출된 값은 더 이상 ndarray 타입이 아니고 ndarray 내의 데이터 값을 의미
- 인덱스에 마이너스 기호 사용 시 뒤에서부터 데이터 추출
- -1은 맨 마지막 데이터
- 단일 인덱스를 통해 ndarray 내의 데이터 값도 간단히 수정 가능
- axis = 0: 로우 방향(↓)의 축, axis = 1: 컬럼 방향(→)의 축
- 축 기반의 연산에서 axis 생략 시
axis = 0
을 의미
- 축 기반의 연산에서 axis 생략 시
b) 슬라이싱
:
기호를 이용해 연속된 데이터를 추출할 수 있음- 2차원의 경우
행,열
로 분리된 로우와 칼럼 위치의 인덱스 활용
- 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의 인덱스를 지정하는 [] 내에 조건문을 그대로 기재하는 방식
- 동작 순서
- ndarray의 필터링 조건을 [] 안에 기재
- False 값은 무시하고 True 값에 해당하는 인덱스 값만 저장
※ True 값 자체인 1을 저장하는 것이 아닌 True 값을 가진 인덱스를 저장한다는 의미 - 저장된 인덱스 데이터 세트로 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] ```
- 실제 값과 그 값이 뜻하는 메타 데이터를 별도의 ndarray로 각각 가져야만 함
```Python
3-7. 선형대수 연산 - 행렬 내적/ 전치 행렬
a) 행렬 내적(행렬 곱)
np.dot()
을 이용해 계산-
왼쪽 행렬의 행(row)과 오른쪽 행렬의 열(column)의 원소들을 순차적으로 곱한 뒤 그 결과를 모두 더한 값
- 왼쪽 행렬의 열 개수와 오른쪽 행렬의 행 개수가 동일해야 내적 연산 가능
b) 전치 행렬
- 원 행렬에서 행과 열의 위치를 교환한 원소로 구성한 행렬
- 행렬 A의 전치 행렬을 $A^{T}$와 같이 표기
np.transpose()
를 통해 쉽게 구할 수 있음