열심히 코딩 하숭!

머신러닝 개념, numpy 알아보기 | 1주차 - 1 | 파이썬 머신러닝 완벽가이드 본문

프로그래밍 언어/python

머신러닝 개념, numpy 알아보기 | 1주차 - 1 | 파이썬 머신러닝 완벽가이드

채숭이 2023. 1. 3. 23:38

* 해당 글은 inflearn의 강의 '[개정판] 파이썬 머신러닝 완벽가이드'를 정리한 글입니다.

 

 

회색 - 강의 제목

노란색, 주황색 - 강조

민트색 - 발표할 때 짚고 넘어가면 좋을 것 같은 부분

 

 


 

1일

 

[0:07:49] 개정판 강의 소개

 

실제 업무에 머신러닝이 어떻게 적용되는지 애플리케이션을 작성해 보면서 익히는게 매우 중요하다  

 


[0:07:49] 머신러닝의 개념

 

Machine Learning (머신러닝)

- 데이터를 기반으로 패턴을 학습하고 결과를 예측

- 숨겨진 패턴을 인지해 해결한다

- ex) 데이터마이닝, 영상 인식, 음성 인식, 자연어 처리

 

 

[0:11:45] 머신러닝의 유형과 데이터의 중요성

 

지도학습(Supervised Learning)

- 문제(feature)와 답(target, label)을 모두 학습

- ex) 분류, 회귀, 추천 시스템, 시각/음성 감지/ 인지, 텍스트 분석, NLP(자연어처리)

 

비지도학습(Un-Supervised Learning)

- 주어지는 문제만 학습

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

 

데이터의 중요성

- 머신러닝의 단점: 데이터에 매우 의존적, 과적합, 복잡한 논리구조, 최적화의 어려움

- > 데이터를 이해하고 효율적으로 가공, 처리, 추출하는 능력이 매우 중요하다

 


[0:10:57] 파이썬 기반 머신러닝의 특징및 장점과 구성요소

 

파이썬(python)의 특징

- 구글, 페이스북 등의 IT 업계에서도 파이썬의 높은 생산성으로 인해 활용도가 매우 높음

- 오픈 소스, 많은 라이브러리, 개발 시 높은 생산성 보장

- 속도는 느리지만, 뛰어난 확장성, 유연성, 호환성을 가짐

 


[0:10:34] 파이썬기반 머신러닝을 위한 SW의 설치

 

- Anaconda3 설치

 

패키지

- Scikit-Learn(사이킷런) : 머신러닝

- NumPy(넘파이) : 행렬/선형대수 | SciPy(사이파이) : 통계

- Pandas(판다스) : 데이터 처리, 2차원 데이터 처리에 특화되어 있음

- Matplotlib(맷플롯립), Seaborn(시본): 데이터 시각화

 


[0:12:00] 사이킷런 업그레이드 수행 및 XGBoost와 LightGBM 설치

 

- 4장 분류에 사용되는 LightGBM과 9장 추천 시스템에 사용되는 Surprise 패키지를 설치하기 위해서는 Visual Studio Build Tools가 먼저 설치되어 있어야 함

- 다운로드 완료


[0:19:45] 주피터 노트북 사용법과 넘파이/판다스의 필요성

 

jupyter notebook 간단한 사용 방법

- Cell 단위로 실행됨

- shift + enter : Run & Cell 추가

- ctrl+enter : Run은 하는데 Cell 추가는 하지 않음

- 가위모양: 삭제

- Edit > Undo Delete Cells : 삭제한 쎌 복구

- Cell > Current Outputs > Clear : 최근 output 값이 clear 됨 (실행까지 Clear 되지는 않음!)

- Kernel > Restart & Clear Output :  메모리에서 모든 실행이 사라짐. 다시 처음부터 실행시킬 수 있음

- Kernel > Interrupt : 오래 수행되는 Cell을 멈출 수 있음

- File > Make a copy => 현재까지의 내용과 같지만 이름은 다른, 새로운 파일이 생김

 

markdown

- ### -> 헤더 (#의 개수 1~6에 따라 크기 달라짐)

- ** -> 강조

- 1. 내용 / 2. 내용 -> 순서

- *, +, - -> 모두 •으로 표기된다

- 앞에 띄어쓰기, tab -> 들여쓰기

=> 더 자세한 내용은 그때그때 구글링을 하면서 참고하도록 하자

 

Numpy 기초 실습

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # <- 넣어줘야 함

array1 = np.array([1,2,3,4])
plt.hist(array1)

- %matplotlib inline

: 브라우저에서 바로 그림을 확인할 수 있게 해줌

: pycharm에서는 대신 plt.show()를 작성하여 그림 확인을 할 수 있다 (해당 코드는 Anaconda를 통해 Juptyer Notebook에서 사용되고 plt.show()가 자동호출 되는데, pycharm은 그렇지 않기 때문)

 

넘파이와 판다스의 중요성

- 사이킷런이 넘파이 기반에서 작성됨

- 넘파이와 판다스에 대한 이해가 부족하면 다른 데이터 분석 전문가가 만든 머신러닝 코드에 대한 맥락을 이해할 수 없는 경우가 많음

 

 

[0:02:42] 강의에 사용될 예제 소스 코드 다운로드 받기

 

다운로드 완료

 

 


 

2일

 

[0:10:58] 넘파이 배열 ndarray 소개

 

NumPy(Numerical Python)

- 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원

- 루프를 사용하지 않고 대량 데이터의 배열 연산을 가능하게 함 -> 빠른 연산 속도

- C/C++과 같은 저수준 언어 기반의 호환 API를 제공 -> 타 프로그램과 쉽게 통합 가능

(수행 성능이 매우 중요한 부분은 C/C++로 작성하고 이를 넘파이에서 호출하는 식으로 하면 쉽게 통합 가능! -> 대박 신기하다... 나중에 도전해보고싶다)

- 판다스에 비해서는 다양한 가공, 변환, 통계용 함수 적용이 편리하지 못 함

- 넘파이를 상세하게 알 필요는 없으나 이해하고 있으면 파이썬 기반의 머신러닝에 큰 도움이 됨 -> 입력, 출력 데이터를 넘파이 배열 타입으로 사용하기 때문

 


[0:08:04]   넘파이 배열 ndarray 생성, shape, 차원, 타입 실습        

 

ndarray - array, type, shape

- 넘파이의 기반 데이터 타입은 ndarray

- array() 함수 : 파이썬 리스트와 같은 인자를 받아서 ndarray로 변환함

- type() 함수 : 인자의 type을 반환

- shape 변수 : ndarray의 크기(행과 열 수)를 튜플로 가지고 있음

 

코드

더보기

 

import numpy as np

array1 = np.array([1,2,3])
print("array1 type: ", type(array1))
print("array1 shape: ", array1.shape, '\n')

array1 = np.array([[1,2,3]])
print("array2 type: ", type(array2))
print("array2 shape: ", array2.shape, '\n')

array3 = np.array([[1,2,3],[2,3,4]])
print("array3 type: ", type(array3))
print("array3 shape: ", array3.shape)

결과

더보기
array1 type:  <class 'numpy.ndarray'>
array1 shape:  (3,) 

array2 type:  <class 'numpy.ndarray'>
array2 shape:  (2, 3) 

array3 type:  <class 'numpy.ndarray'>
array3 shape:  (2, 3)

 

 

 

 

- array1의 경우, 1차원 array로 3개의 데이터를 가지고 있음을 의미함!

- 데이터는 서로 동일하나 차원이 달라서 오류가 발생하는 경우가 빈번하기 때문에 명확히 이해하고 있어햐 함

 

ndarray - ndim, type

- ndim 변수 : 배열의 차원을 반환

- type : 숫자(int, unsigned int, float, complex), 문자열, 불 등 저장 가능

(type 주의사항 : 한개의 ndarray 객체에는 같은 타입의 데이터만 저장 가능, 만약 다른 type의 데이터가 섞여서 들어가게 될 경우 데이터의 크기가 더 큰 타입으로 형변환이 됨)

 

- dtype 변수 : ndarray내의 데이터 타입 확인

- astype() 함수 : 원하는 type으로 강제 변환시킬 수 있음 (메모리를 절약해야 할 때 사용)

(보통 메모리로 데이터를 전체 로딩한 다음 이를 기반으로 알고리즘을 적용하기 때문에, 대용량의 데이터를 로딩할 때 수행속도가 느려지거나 메모리 부족으로 오류가 발생할 수도 O)

 

- arange() 함수 : 0부터 인자 값 -1 까지의 값을 순차적으로 ndarray의 데이터값으로 변환해줌

- zeros() 함수 : 인자로 튜플 형태의 shape 값을 입력하면 0으로 채운 ndarray를 반환

- ones() 함수 : 인자로 튜플 형태의 shape 값을 입력하면 1로 채운 ndarray를 반환, dtype을 지정해주지 않으면 default 값은 float64임

 

코드

더보기
import numpy as np

array1 = np.array([[1,2,3],[2,3,4]])
print("array1 ndim: ", array1.ndim, '\n') #ndim

array2 = np.array([1,2,3.0])
print(array2, array2.dtype) #dtype
print("astype('int32')", array2.astype('int32').dtype, '\n') # astype

sequence_array = np.arange(3,10)
print(sequence_array, '\n')

zero_array = np.zeros((3,2), dtype='int32')
print(zero_array, '\n')

one_array = np.ones((3,2))
print(one_array)

결과

더보기
array1 ndim:  2 

[1. 2. 3.] float64
astype('int32') int32 

[3 4 5 6 7 8 9] 

[[0 0]
 [0 0]
 [0 0]] 

[[1. 1.]
 [1. 1.]
 [1. 1.]]

 

 

 

[0:07:17]   numpy ndarray의 axis 축 이해           

 

axis (축)

- shape이 행, 열, 높이가 아니라 axis0, axis1, axis2 -> axis 단위로 부여됨

shape : (4, 2, 4)

여기서 axis 뒤의 번호가 클수록 더 작은 단위라고 보면 됨!

axis 2는 [1,2,3,4] 단위

axis 2은 [[1,2,3,4],[5,6,7,8]] 단위

axis 3은[[[ ],[ ]], [[ ],[ ]]] 단위

 

       
[0:07:59]   넘파이 배열 ndarray 초기화 방법과 ndarray차원과 크기를 변경하는 reshape()의 이해 - 01                  

 

reshape() 함수 개념

- ndarray를 원하는 특정 차원, 크기로 변환해줌

- 지정된 사이즈로 변경이 불가능하면 오류가 남

- 만약 인자에 -1을 사용하게 되면, 원래의 ndarray와 호환되는 새로운 shape으로 변환해줌 (-1을 사용하더라도 호환될 수 없는 형태일 경우 변환 불가)

 

reshape 함수 사용 코드

더보기
import numpy as np

array1 = np.arange(10)
print(array1, '\n')

array2 = array1.reshape(2,5)
print(array2, '\n')

array3 = array1.reshape(5,2)
print(array3)

결과

더보기
[0 1 2 3 4 5 6 7 8 9] 

[[0 1 2 3 4]
 [5 6 7 8 9]] 

[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

 

 

-1 인자 사용 코드

더보기
import numpy as np

array1 = np.arange(10)
print(array1)

array2 = array1.reshape(-1,5)
print('array2 shappe: ', array2.shape)

array3 = array1.reshape(5,-1)
print('array3 shappe: ', array3.shape)

결과

더보기
[0 1 2 3 4 5 6 7 8 9]
array2 shappe:  (2, 5)
array3 shappe:  (5, 2)

 

 

 

 

 

[0:07:55]   넘파이 배열 ndarray 초기화 방법과 ndarray차원과 크기를 변경하는 reshape()의 이해 - 02                  

 

reshape() 함수 - reshape(-1,1) , tolist() 함수

- reshape(-1,1) : 사용해서 2차원이면서 1개의 컬럼을 가진 ndarray로 변환

- tolist() 함수 : ndarray를 list로 변환

 

코드

더보기
import numpy as np

array1 = np.arange(8)
array3d = array1.reshape((2,2,2))

array5 = array3d.reshape(-1,1)
print('array5 shape: ', array5.shape)

결과

더보기
array5 shape:  (8, 1)

 

 

 

[0:11:21]   넘파이 ndarray 인덱싱(Indexing) 이해 - 단일값과 슬라이싱 인덱싱                  

 

인덱싱 - 단일값

- 특정 데이터 추출 : 인덱스 값을 []안에 넣으면 됨

- 0부터 시작

- -1은 맨 뒤, -2는 맨 뒤에서 두번째

- 다차원의 경우 [2,3,1]

 

인덱싱 - 슬라이싱

- : <-- 기호를 사용하여 연속한 데이터 슬라이싱

- 시작 인덱스에서 종료-1 위치에 있는 데이터의 ndarray를 반환

- 시작, 종료 인덱스 생략 가능 (처음, 끝으로 인식함)

- 2차원 ndarray에서 뒤에 오는 인덱스를 없애면 1차원 ndarray가 반환됨

 

 

[0:08:18]   넘파이 ndarray 인덱싱(Indexing) 이해 - 팬시와 불린 인덱싱                  
              

인덱싱 - 팬시

- 인덱스에 집합을 지정하면 해당하는 값들만 반환함

 

 

코드

더보기
import numpy as np

array1d = np.arange(1,10)
array2d = array1d.reshape(3,3)

array3 = array2d[[0,1], 2]
print('array2d[[0,1], 2] => ', array3.tolist())

array4 = array2d[[0,1], 0:2]
print('array2d[[0,1], 0:2] => ', array4.tolist())

array5 = array2d[[0,1]]
print('array2d[[0,1]] => ', array5.tolist())

결과

더보기
array2d[[0,1], 2] =>  [3, 6]
array2d[[0,1], 0:2] =>  [[1, 2], [4, 5]]
array2d[[0,1]] =>  [[1, 2, 3], [4, 5, 6]]

 

 

 

 

인덱싱 - 불린

- 인덱스 안에 조건문을 넣기

- true 값을 만족시키는 인덱스 값들만 출력됨

 

코드

더보기
import numpy as np

array1d = np.arange(1,10)

array3 = array1d[array1d > 5]
print('array1d > 5 불린 인덱싱 결과 값 : ', array3)

결과

더보기
array1d > 5 불린 인덱싱 결과 값 :  [6 7 8 9]

 

 

 


 


3일  

 

[0:11:05]   넘파이 ndarray 인덱싱 실습 - 01 

 

위에서 실습 완료

 


[0:07:35]   넘파이 ndarray 인덱싱 실습 - 02

 

위에서 실습 완료

 


[0:14:06]   넘파이 ndarray의 sort와 argsort

 

sort() 함수

- np.sort() : ndarray를 인자로 넣어서 사용. 넘파이에서 호출, 원 행렬은 그대로 유지된 채로 정렬된 행렬을 반환

- ndarray().sort() : 행렬 자체에서 호출, 원 행렬 자체를 변환하고 끝 (반환값 None)

- 기본은 오름차순임. 내림차순 -> np.sort()[::-1] 이렇게 사용하면 됨!

- 행렬이 2차원 이상일 경우 axis 축 값 설정을 통해 축을 기준으로 정렬할 수 있음

 

 

코드

더보기
import numpy as np

array2d = np.array([[8,12], [7,1]])

sort_array2d_axis0 = np.sort(array2d, axis=0)
print('로우 방향 정렬 : \n', sort_array2d_axis0, '\n')

sort_array2d_axis1 = array2d.sort(axis=1) # 반환값이 None임
print('칼럼 방향 정렬 : \n', array2d)

결과

더보기
로우 방향 정렬 : 
 [[ 7  1]
 [ 8 12]] 

칼럼 방향 정렬 : 
 [[ 8 12]
 [ 1  7]]

 

 

argsort() 함수

- 원본 행렬이 정렬되었을 때 기존 원본 행렬의 원소에 대한 인덱스를 필요로 할 때

- np.argsort()는 원본 행렬 인덱스를 ndarray형으로 반환함

 

코드

더보기
import numpy as np

org_array = np.array([3,1,9,5])
sort_indices_desc = np.argsort(org_array)[::-1]
print(sort_indices_desc)

결과

더보기
[2 3 0 1]

 

 

 


[0:05:09]   넘파이 ndarray의 내적과 전치행렬

 

행렬 내적(행렬 곱)

- np.dot(A, B)

내적의 예시

 

전치 행렬

- np.transpose(A)

 

 

 

이상으로 1주차 첫번째 포스팅이였습니다~