본문 바로가기
Daily/Daily_2 후기

[패스트캠퍼스 후기] 데이터 처리를 위한 Python (Numpy) 내용 정리 및 요약 - 1

by 와우멍 2020. 10. 14.

 안녕하세요 와우멍입니다.

 코로나 시국에 회사 내/외부 교육들이 모두 취소되면서, 복지차원으로 패스트캠퍼스의 온라인 강의를 들을 기회를 얻게 되었습니다.

 연구하면서 필요한 것들을 덕지덕지 찾아가며 해왔었기에, 한번쯤은  체계적으로 배워보고 싶었는데 수강신청 성공한 게 너무 행복하네요 허헛..

 강의의 명칭은 "머신러닝과 데이터분석 AtoZ"입니다.

각 챕터에 대한 설명은 아래와 같습니다. 요건 좀 기니까 접어둘께요! 필요한 분들 펼쳐서 봐주세요:-)

더보기
강의 목차

01. Python Programming 기초

 - 파이썬을 아직 접해보지 않은 분들을 위한 파트입니다. 파이썬의 기초적인 문법부터 
클래스와 인스턴스, 정규표현식까지 꼭 배워야하는 문법들을 학습합니다. 

02. 데이터 수집을 위한 Python (Crawling) 
 - 파이썬은 웹 크롤링을 위한 대표적인 언어입니다. 반복되는 작업을 효율적으로 줄일 
수 있는 크롤링을 위한 간단한 문법과 실제 예제를 통해 크롤링을 배워봅니다. 

03. 데이터 처리를 위한 Python (Numpy) 
 - 파이썬은 수치계산과 백터연산에 최적화된 라이브러리 numpy를 제공하고 있습니다. 
numpy를 통해 데이터 처리의 기초를 학습해봅니다. 

04. 데이터 분석을 위한 Python (Pandas) 
 - 데이터는 ‘엑셀’과 같이 행과 열로 이루어져 있습니다. 파이썬은 pandas를 통해 
행렬로 이루어진 데이터프레임을 다룰 수 있습니다. pandas에 대해 알아봅니다. 

05. Machine learning의 개념과 종류 
 - 본격적으로 머신러닝을 학습하기 전에 머신러닝과 딥러닝 전반에 대한 개념을 
숙지합니다. 

06. 회귀분석 
 - 머신러닝의 가장 기본 ‘회귀분석’을 알아봅니다. 회귀분석을 통해 지도학습의 개념을 
이해하고 나아가 차원축소를 위한 PCA도 간단하게 다뤄봅니다. 

07. 기본적인 Machine learning 모형 
 - 대표적으로 사용되는 머신러닝 모형은 나이브베이즈, KNN, LDA, SVM, 
의사결정나무, 신경망 총 6개 정도로 추려볼 수 있습니다. 수많은 알고리즘들이 더 
있지만 기본적으로 알아야 하는 6개 알고리즘을 먼저 알아보고 머신러닝의 개념을 더 
깊게 이해합니다. 

08. 앙상블 기법의 종류와 원리 
 - 앞에서 배운 알고리즘들을 이리저리 섞어서 더 좋은 정확도를 내는 방법으로 앙상블 
기법이 사용됩니다. 앙상블의 원리와 개념을 실습을 통해 알아봅니다. 

09. 클러스터링 
 - K-means 클러스터링은 비지도학습의 가장 기본적인 모형입니다. 이를 먼저 이해하고 
더 나아가 Hierarchical 클러스터링과 DBSCAN 클러스터링까지 알아봅니다. 

10. 불균형 데이터 
 - 실제 데이터를 마주하면 항상 일정한 비중의 데이터가 주어지지 않습니다. 불균형 
데이터를 받았을 때 어떤 방식으로 처리해야 좋은 성능을 얻어낼 수 있을지 
알아봅니다. 

11. 빅콘테스트 Review 
 - 강사님이 참여한 빅콘테스트에 대해 개발 과정과 인사이트를 공유합니다. 

12. 딥러닝 
딥러닝은 신경망 알고리즘으로 구성된 머신러닝의 한 기법입니다. 신경망의 원리와 
손실함수, 최적화 알고리즘 등을 통해 딥러닝을 이해하고 대표적인 딥러닝 모델인 
CNN, RNN에 대해 알아봅니다. 

13~17. [Project] 
지금까지 배운 내용을 활용해 단계적으로 실습 프로젝트에 도전해봅니다.

 

 

01. Python Programming 기초
02. 데이터 수집을 위한 Python (Crawling) 
03. 데이터 처리를 위한 Python (Numpy) 
04. 데이터 분석을 위한 Python (Pandas) 
05. Machine learning의 개념과 종류 
06. 회귀분석 
07. 기본적인 Machine learning 모형 
08. 앙상블 기법의 종류와 원리 
09. 클러스터링 
10. 불균형 데이터 
11. 빅콘테스트 Review 
12. 딥러닝 
13~17. [Project] 

오늘은 Chapter3. Numpy에 대해서 완강하며 정리한 내용을 포스팅하겠습니다.

 

1. numpy 모듈 & ndarray 이해하기

 파이썬에서 List는 일반 대괄호 [ ] 안에 성분을 입력하는 방법으로, ndarray는 list를 numpy함수 안에 넣는 방법으로 선언이 가능한다.

 그런데 List도 있는데 Numpy를 사용하는 이유는....!! 속도와 편의성(확장성?)

 ndarray는 기본적으로 c언어로 구현되어, 생성되는 원소들이 연속적인 메모리(물리적인)에 잡히게 됨. 따라서 연산을 할때 더 빠르게 적용이 된다. 게다가 Vectorization이 가능(e.g., 100x1 행렬에 2를 곱할 때, list는 loop를 돌려야 함, ndarray는 한덩어리로 가능)해서 생각도 시간도 매우 아낄 수 있음!!

 정리하면..

 - 메모리 사이즈 : 파이썬 기본 리스트보다 적은 메모리 사용

 - 성능 : 파이썬 기본 리스트보다 빠름 

 - 빌트인 함수 : 선형대수, 통계 관련 여러 함수들 내장되어 있어 이를 이용해서 편리하게 계산을 할 수 있음.

*개인적으로 연구할 때는, ndarray는 정적 할당이라 성분 갯수가 바뀔 때 이에 맞춰 resize를 해야 했지만, List는 동적할당으로 그냥 성분을 편하게 추가해줄 수 있었다. 그래서 output이 일정하지 않을 경우에는 list에 append를 하여 데이터를 정리하기도 했었다.

출처: 패스트 캠퍼스 강의자료

2. ndarray 데이터 생성하기 (numpy 모듈 함수 이용)

 - 앞서 언급했듯이, ndarray는 np.array([성분1, 성분2 ~]) 형식으로 list를 array로 바꿔주며 선언할 수 있다.

 - np.arange는 숫자들을 원하는 간격으로 출력해주는 모듈로써, 꽤 자주 쓰이는 numpy모듈 중 하나이다.

np.arange(시작숫자, 끝숫자+1, 간격) 식으로 선언할 수 있는데, 위 예시에서와 같이 5부터 100까지, 5의 간격으로 숫자가 출력되는 것을 볼 수 있다.

 - np.ones나 np.zeros는 정적함수라는 특성때문에 미리 사이즈에 맞춰 결과를 받을 array를 선언해놓을 때 사용한다(저는 그랬어용)

사용법은 간단하게, np.ones((사이즈)) // np.zeros((사이즈)) 인데, np.ones( ) 내에 사이즈가 ( )로 들어가야해서 결과적으로 괄호가 두번 연달아 온다는 것에 유의하자.

 - np.empty와 np.full은 np.ones나 np.zeros와 비슷한 용도로 쓰인다고 보면 될 듯하다.

 np.empty((사이즈)) , np.full((사이즈), 원하는 값) 식으로 사용한다.

 다만, empty는 0에 가깝긴 하지만 noise값들이 들어가니까, 실수로 성분입력을 건너뛴다면 결과에 지대한 영향을 미칠 수 있으니 주의하자.

 - np.linspace는 np.aragne랑 헷갈릴 수도 있지만, 살짝 다르다.

 np.linspace(숫자1, 숫자2, 숫자3) 식으로 선언하는데 숫자1과 숫자2 사이를 숫자3 등분하라 라는 의미이다.

그래서 결과를 보면 1과 10 사이를 4등분한 것을 볼 수 있다.

 - reshape함수는 정말정말 많이 쓰인다.

 numpy array는 정적할당이라고 했었다. 따라서, 값이나 크기에 맞지 않은 것을 입력하면 에러가 난다.

그러니 미리미리 맞춰서 형태와 차원을 바꿔주고 값을 입력해야겠지.

바꾸고 싶은 함수.reshape(형태) 꼴로 사용하면 된다.

위의 예시에서, 1x15 size의 array가 3x5 size의 array가 된 것을 볼 수 있다. 

 

3. ndarray 데이터 생성하기 (random 서브 모듈 함수 이용)

이번 챕터에서는 numpy 모듈의 서브모듈 중 하나인 random함수의 사용법에 대해.

 - np.random.rand(사이즈) 로 선언하면, 입력한 사이즈에 각 성분이 [0, 1]의 값이 랜덤하게 입력되어 출력된다.

 - np.random.randn(사이즈) 는 입력한 사이즈에 각 성분이 [-1, 1]내의 정규분포의 확률에 따라 입력되어 값이 출력된다. (아래의 정규분포를 따라)

정규분포 (출처: 위키피디아)

  - np.random.randint(숫자1, 숫자2, (사이즈))는 사이즈에 맞춰 각 성분에 숫자1과 숫자2 사이의 숫자를 랜덤하게 입력하여 출력해준다.

 - np.random.seed(임의숫자)위 랜덤함수들에서 출력되는 숫자들의 seed를 바꿔주는 역할을 한다. 

 - np.random.choice(성분1, (사이즈) ,replace=True) 로 선언되는데,

 성분1이 숫자면 그 숫자까지의 arange 배열 생성후 그 내에서 각 성분에 랜덤하게 값을 뽑아서 입력해주고,

 성분1에 array가 들어가면 그 array내의 성분에서 랜덤하게 값을 뽑아 사이즈에 맞게 출력해준다.

 세번째의 replace는 복원추출/비복원추출 여부를 결정해주는 옵션으로써, default값은 True로 되어 있다.

 - np.random.uniform(숫자1, 숫자2, 사이즈)는 숫자1과 숫자2 사이의 값들이 같은 확률로 랜덤하게 뽑혀 사이즈에맞는 배열을 형성.

 - np.random.normal(숫자1, 숫자2, 사이즈)는 숫자1과 숫자2 사이에 정규분포 확률분포를 만들어(mean은 숫자1-숫자2 사이의 가운데 값이겠지) 이에 따라 랜덤하게 뽑혀 사이즈에 맞는 배열을 형성.

 

4. ndarray 인덱싱 - 슬라이싱 이해하기

 슬라이싱은 array내에서 내가 필요한 값, 혹은 필요한 범위만 잘라서 뽑아내는 것을 의미한다.

 기본적으로 2차원에 대해 (행, 렬) 이고, 파이썬은 첫번째 성분이 0번째이다. (Matlab은 1이 첫번째 성분)

 결과를 보면 x[3]은 0부터 포함해서 4번째 성분인 것을 알 수 있다.

 x[0,2]는 1번째 행, 3번째 열 이므로 2가 출력된다.

 3차원도 다르지 않다.

x[1, 2, 1]을 순서대로 가보면, x[1, :, :]는 [[12,13,14], [15,16,17], [18,19,20], [21,22,23]] 이고,

x[1, 2, : ]는 [18,19,20]이니, x[1, 2, 1]은 19가 되는 것이다..!

\

슬라이싱은 인덱싱의 연장선에서 생각해보면

x[1:7]은 0,1,2,3,4,5,6,7,8,9에서 두번째부터 7번째성분까지 출력되어 [1,2,3,4,5,6]이 나오겠지.

x[1, 1:4]는 2번째 행의 두번째부터 4번째까지의 값인 [6,7,8]이 출력된다.

 

3차원 array에서의 인덱싱도 마찬가지.

x[:1, :, :]는 첫번째 덩어리인 [[0,1,2,],[3,4,5],[6,7,8],[9,10,11]]이고, 

x[:1, :2, ]는 이중에 :2는 [0,1] 이므로, [[0,1,2],[3,4,5]]가 된다.

 

5. ndarray 데이터 형태를 바꿔보기 (reshaping, flatten 등 함수 이용)

 - np.ravel 함수는 n차원 행렬을 그냥 쭉 펴버리는 함수.

위의 예시에서처럼 np.ravel(x) 혹은 x.ravel() 두 형식으로 모두 사용 가능하다.

 - np.flatten 함수는 얼핏보면 ravel과 같은 기능을 하지만, 다른 점은 위 예시의 가운데에서 처럼, ravel은 해당 함수를 펴버리는 것이라 x라는 행렬 자체가 펼처지는 것이라 앞으로 x를 불러오면 펼쳐진 행렬이 불러와진다. 하지만 flatten함수는 펼쳐진 행렬 인스턴스를 새로 만드는 것이라 x를 다시 불러와도 x의 모양은 변하지 않은 상태이다.

또한 ravel에는 펼쳐지는 순서를 c언어 스타일로 하냐, fortran 스타일로 하냐에 대한 옵션이 있는데, 

전자는 1행-2행-3행 순으로 펴버리고, 후자는 1열-2열-3열 순으로 펴버린다.

- 앞에서도 계속 사용한 reshape(사이즈) 함수는 단어 그대로 형태를 바꿔주는 것. 다만, 성분의 갯수는 같아야 한다!

(사이즈 바꿀 때, 행이나 열 하나만 입력하고 나머지는 알아서 계산해달라 할 때는 -1을 입력하면 된다고 한다.)

 

 

쓰다보니 너무 길어져서 나눠서 포스팅하겠습니다.

혹시 잘못된 점이나, 추가의견 주시면 잘 반영하겠습니다 :-)

댓글