컴공댕이 공부일지
[ Alchmist 1주차 ] chapter 01 머신러닝과 생태계의 이해 (1)~(5) 본문
참고 교재 - (위키북스) 파이썬 머신러닝 완벽 가이드 개정 2판
01. 머신러닝의 개념
머신러닝 (Machine Learning)
데이터를 기반으로 패턴을 학습하고 결과를 예측하는 알고리즘 기법
소프트웨어 코드만으로는 해결하기 어려운 복잡한 문제들에 활용
머신러닝은 문제를 관통하는 일정한 패턴을 찾기 어려운 경우에도,
데이터를 기반으로 숨겨진 패턴을 인지해 문제 해결.
- 머신러닝의 분류
지도학습 / 비지도학습 / 강화학습
지도학습 ( 정답 있는 데이터를 활용한 학습 )
- 분류
- 회기
- 추천 시스템
- 시각/음성 감지/인지
- 텍스트 분석, NLP
비지도학습 ( 정답 없는 데이터를 비슷한 특징끼리 모아 새로운 데이터에 대한 결과 예측 )
- 클러스터링
- 차원 축소
- 강화학습 (데이터 없이 그냥 해보면서 그에 따른 보상을 받으며 학습하는 것)
- 데이터 전쟁
garbage in, garbage out
머신러닝 알고리즘도 중요하지만, 좋은 데이터가 있어야 좋은 결과도 나오는 것.
최적의 머신러닝 알고리즘을 구축하는 능력도 중요하지만,
데이터를 이해하고 효율적으로 가공, 처리, 추출해 최적의 데이터를 기반으로
알고리즘을 구동할 수 있도록 준비하는 능력이 더 중요할 수도 있다.
( 02는 sw 설치 파트 )
03. 넘파이
파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지
루프를 사용하지 않고 대량 데이터의 배열 연산을 가능하게 하므로 빠른 배열 연산 속도
대량 데이터 기반의 과학 공학 프로그램은 빠른 계산 능력이 매우 중요하므로
파이썬 기반의 많은 과학 공학 패키지들은 넘파이에 의존한다.
편리성 면에서는 넘파이보다 판다스가 우세.
BUT! 많은 머신러닝 알고리즘이 넘파이 기반으로 작성됨.
알고리즘의 입력 데이터와 출력 데이터를 넘파이 배열 타입으로 사용한다.
따라서 넘파이를 이해하는 것은 파이썬 기반의 머신러닝에서 매우 중요!
- 넘파이 ndarray 개요
[ 넘파이 모듈 임포트 ]
import numpy as np //np 약어로 모듈 표현
넘파이 기반 데이터 타입 : ndarray
이를 이용해 다차원 배열을 쉽게 생성하고, 다양한 연산이 가능하다.
함수 array()
파이썬의 리스트처럼 다양한 인자를 입력받아 ndarray로 변환
생성된 ndarray 배열의 shape 변수는 크기(=행과 열의 수)를 튜플 형태로 가지고 있다.
(이를 통해 배열의 차원 알 수 있음.)
[ array() 함수, shape , ndim 활용 예제 ]
import numpy as np
a1= np.array([1,2,3])
print("타입 : ", type(a1))
print("배열 형태 : ", a1.shape) # (3,) 일차원 배열로 3개의 데이터를 가짐
a2 = np.array([[1,2,3],
[2,3,4]])
print("타입 : ", type(a2))
print("배열 형태 : ", a2.shape) # (2,3) 2행 3열의 이차원 배열로 총 6개 데이터
a3 = np.array([[1,2,3]])
print("타입 : ", type(a3))
print("배열 형태 : ", a3.shape) # (1,3) 1행 3열의 이차원 배열로 총 3개 데이터
print('a1 : {0}차원, a2 : {1}차원, a3 : {2}차원'.format(a1.ndim, a2.ndim, a3.ndim))
# a1 : 1차원, a2 : 2차원, a3 : 2차원
# format : 문자열 중간중간 특정 변수 값을 넣어주는 포메팅 함수
# ndim : 배열의 차수
>>>
타입 : <class 'numpy.ndarray'>
배열 형태 : (3,)
타입 : <class 'numpy.ndarray'>
배열 형태 : (2, 3)
타입 : <class 'numpy.ndarray'>
배열 형태 : (1, 3)
a1 : 1차원, a2 : 2차원, a3 : 2차원
[] = 1차원
[[]] = 2차원
- ndarray 의 데이터 타입
ndarray 내의 데이터 값은 숫자( int, unsigned int, float ), 문자열, 불 값 모두 가능
한 개의 연산에 여러 다른 데이터 타입이 함께 있을 순 없다.
dtype 속성
ndarray 내의 데이터 타입을 확인
ndarray 자동 형변환
list2 = [1,2,'test']
a2 = np.array(list2)
print(a2, a2.dtype)
list3 = [1,2, 3.0]
a3 = np.array(list3)
print(a3, a3.dtype)
>>>
['1' '2' 'test'] <U11
[1. 2. 3.] float64
list2는 숫자형 값과 문자열 값이 섞여있었기 때문에, 숫자가 유니코드 문자열로 모두 변환됨
list3는 int와 float가 섞여있어서, 모두 float으로 변환됨.
list : 서로 다른 데이터 타입을 가질 수 있음
ndarray : 연산 특성상 같은 데이터 타입만 가질 수 있음
그래서 만약 위의 예제 코드처럼 데이터 유형이 섞여있는 리스트를 ndarray로 변경하면,
데이터 크기가 더 큰 타입으로 형 변환을 일괄 적용한다.
astype() 메소드
ndarray 내 데이터 값의 타입 변경
array_int = np.array([1,2,3])
array_float = array_int.astype('float64') #astype()을 활용해 int를 float64으로 변환!
print(array_float, array_float.dtype) #[1. 2. 3.] float64
>>>
[1. 2. 3.] float64
- ndarray 를 편리하게 생성하기 - arange, zeros, ones
ndarray를 연속값이나, 0 또는 1로 초기화 해 생성
arange() 파이썬의 range()와 유사한 기능
0부터 함수 인자 값 -1 까지 값을 순차적으로 ndarray의 데이터값으로 변환
[ arange 활용 예제 ]
a=np.arange(10)
print(a)
print(a.dtype, a.shape)
>>>
[0 1 2 3 4 5 6 7 8 9]
int32 (10,)
arange(n) : 0부터 n-1까지 순차적으로 ndarray 데이터값으로 변환
zeros( (n,m) , dtype = 'int32' ) : n행 m열의 int 0으로 채워진 ndarray
ones( (n,m) ) : n행 m열의 1로 채워진 ndarray (dtype 지정 안하면 디폴트는 float64)
- ndarray 의 차원과 크기를 변경하는 reshape()
ndarray의 차원과 크기를 변경하는 reshape()
ar1.reshape( n,m ) : ar1을 n행 m열로!
이때, n= -1 or m= -1이면, -1 부분에 적절한 값 알아서 넣어줌!
알맞은 칼럼 또는 로우값을 자동으로 새롭게 생성해 변환함.
reshape(-1,1) => x차원 배열을 무조건 2차원으로 만들어줌!
- 넘파이의 ndarray의 데이터 세트 선택하기 - 인덱싱(indexing)
1. 특정한 데이터만 추출
원하는 위치의 인덱스 값 지정 => 해당 위치 데이터 반환
array = np.arrange(start = 1, stop = 10) # array = [1 2 3 4 5 6 7 8 9]
value1 = array[3] # 4번째 값을 변수에 저장
array[0] = 100 # 첫번째 값을 100으로!
valueEnd = array [-1] # 마이너스 부호로 뒤에서부터 인덱싱 가능.
참고 링크 ) 배열의 축 이해하기
https://pybasall.tistory.com/129
[파이썬 numpy] 배열의 축(axis) 이해하기
[파이썬 numpy] 배열의 축(axis) 이해하기 배열에는 축이라는 헷갈리는 개념이 있습니다. 특히 concatenate 메소드를 사용하여 배열을 이어붙일때 그렇습니다. 배열의 축이 헷갈리는 이유는 행렬개념
pybasall.tistory.com
2. 슬라이싱 (Slicing)
: 기호로 연속된 인덱스상의 ndarray를 추출
array[n:m] #n번 인덱스부터 m-1번 인덱스까지의 위치에 있는 데이터를 ndaaray로 반환
2차원 ndarray의 슬라이싱
array[ n:m , i:j ]
3. 팬시 인덱싱
: 인덱스 집합을 지정하면(리스트나 ndarray로 지정) 해당 위치의 인덱스에 해당하는 ndarray를 반환
4. 불린 인덱싱
: arr = arr1[ arr1 > 3 ]
조건문에 해당하는, true인 인덱스를 저장하고,
저장한 인덱스로 ndarray를 조회
- 행렬의 정렬 - sort()와 argsort() - 선형대수 연산
np.sort( ndarray ) => 원본 보존. 새 배열에 새로 정렬.
ㄴ [::-1] 을 붙이면 내림차순 정렬 가능!
ndarray.sort() => 원본이 정렬됨.
• 2차원 이상은 축 값을 설정해 정렬
ex) np.sort( arr, axis=0 )
• 정렬된 행렬의 인덱스 반환하기 : np.argsort()
np.argsort( ndarray )
: 정렬된 행렬의 원본 행렬 인덱스를 ndarray로 반환
• 팬시 인덱스와 결합해 활용.
# 성적 순으로 학생 이름을 정렬하는 예제
argsort()로 정렬한 인덱스 값을 얻어서, 그를 팬시 인덱싱 기법을 활용해 이름 행렬을 정렬한다.
- 행렬 내적과 전치 행렬 구하기
1. 행렬 내적 (행렬 곱)
np.dot( A, B ) #ndarray A와 B의 내적을 구해줌.
2. 전치 행렬 = 행과 열의 위치를 교환한 함구
np.transpose() : 전치 행렬 구하는 함수
4. 데이터 핸들링 - 판다스
파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지
판다스의 핵심 객체 DataFrame
Df는 2차원 데이터 담는 데이터 구조체
Index
개별 데이터를 고유하게 식별하는 키 값
Series
칼럼이 하나뿐인 데이터 구조체
= Index와 단 하나의 칼럼으로 구성된 데이터 셋
(Df는 칼럼 여러 개!)
read_csv( '파일명', sep = ', ' )
여러 구분 문자 기반의 파일 포맷을 df으로 변환!
인덱스는 고유성을 가지며, 레코드를 식별하는 역할 한다!
.head( n ) : 처음 n개 row를 출력(디폴트 n=5)
.shape : df의 행과 열을 튜플 형태로 반환.
.info() : 총 데이터 건수, 데이터 타입, Null 데이터 수 등의 여러 정보들 볼 수 있음.
describe() : 숫자형 칼럼의 분포 조사
이를 통해 숫자형 카테고리 칼럼인지 알 수 있다!
ㄴ 숫자형 카테고리 칼럼 = 남:1, 여:2 이런식으로 표현하는 것.
value_counts() : 지정된 칼럼의 데이터값 건수 반환 => 데이터의 분포도를 확인하는데 유용한 함수
DF[ '칼럼명' ] : 해당 칼럼에 해당하는 Series객체 반환
DataFrame 데이터 삭제
.drop( [0,1,2], axis=0, inplace=True )
• Labels: drop할 칼럼이나 행 지정 ([ ] 안에 넣어서 입력)
• Axis : 특정 칼럼 또는 행 drop (axis=0: row, axis=1: column)
• inplace: 대체! drop한 데이터프레임을 원본으로 저장 (default: False)
: inplace = True 일 경우 원본이 새로운 DF로 대체
5. 정리
머신러닝 모델을 생성하고 예측을 수행하는 데 있어,
머신러닝 알고리즘보단 데이터 전처리와 적절한 피처를 가공하고 추출하는 부분이 더 비중이 크다!
그래서 넘파이와 판다스 등 머신러닝 생태계를 이루는 여러 패키지들에 대한 이해가 중요하다.