Euron 첫 예습과제...
열심히 해야지.
CV 관련 공부도 필요하다. <컴퓨터 비전과 딥러닝> 이라는 책을 참고해볼 계획
01. 머신러닝의 개념
머신러닝이란?
- 애플리케이션을 수정하지 않고도 데이터를 기반으로 패턴을 학습하고 결과를 예측하는 알고리즘 기법
머신러닝의 분류
- 지도학습
- 분류
- 회귀
- 추천 시스템
- 시각/음성 감지/인지
- 텍스트 분석, NLP
- 비지도학습
- 클러스터링
- 차원 축소
- 강화학습
R또한 머신러닝 부분에서 많이 쓰인다. 다만 R은 통계 전용 프로그램 언어이고, 파이썬은 개발 생산성이 뛰어나다.
파이썬은 여러 딥러닝 프레임워크, 대표적으로 텐서플로(TensorFlow), 케라스(Keras), 파이토치(pyTorch) 등, 가 파이썬을 지원하고 있다.
02. 파이썬 머신러닝 생태계를 구성하는 주요 패키지
주요 필요 패키지
- 머신러닝 패키지 : 대표적으로 사이킷런(Scikit-Learn)이 있다.
- 행렬/선형대수/통계 패키지 : 대표적으로 넘파이(NumPy)가 있다.
- 데이터 핸들링 : 대표적으로 판다스(Pandas)가 있다. 넘파이는 행렬 기반 데이터 처리에 특화되어있는 반면, 판다스는 2차원 데이터 처리에 특화되어 있으며 Matplotlib을 호출해 쉽게 시각화가 가능하다.
- 시각화 : 맷플롯립(Matpoltlib)을 이용한 대표적 시각화 라이브러리이다. api와 디자인을 보완하기 위한 시본(Seaborn)이 있다.
- 서드파티 라이브러리 : 파이썬 기반의 머신러닝을 편리하게 지원
- 주피터 노트북 : 아이파이썬 툴
파이썬 머신러닝을 위한 s/w 설치
파이썬 기반의 머신러닝에 필요한 패키지들을 일괄적으로 설치할 수 있는 Anaconda를 이용한다.
Jupyter Notebook 서버 프로그램(기본 주소 : 8888)를 이용하여 주피터 노트북을 사용할 수 있다. 위 패키지들이 잘 import 되면 성공!
나중에 서드파티 라이브러리 사용을 위한 Mincrosoft Visual Studio Build Tools까지 설치 완료!
03. 넘파이
넘파이는 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원한다.
여러 데이터 행들링 기능도 제공(판다스 하위호환)
넘파이 ndarray 개요
ndarray : 넘파이의 기반 데이터타입. 다차원 배열을 쉽게 생성하고 다양한 연산을 수행할 수 있다.
함수 정리
- array() : 파이썬 리스트와 같은 다양한 인자를 입력 받아서 ndarray로 젼환하는 기능. 하나의 데이터 타입만 입력 가능
- shape() : ndarray의 크기, 즉 행과 열의 수를 튜플 형태로 가지고 있다. + ndarray 배열의 차원
- ndim : 각 ndarray의 차원 반환
- dtype : ndarray 내의 데이터 타입(하나의 데이터 타입만 가능하지만 숫자, 문자열, 불 값등 모두 가능)
- 여러 유형이 섞인 리스트를 ndarray로 변환 시 데이터 크기가 더 큰 데이터 타입으로 형 변환을 일괄 적용한다.
- astype() : 데이터값의 타입 변경. 인자로 원하는 문자열을 지정한다.
- arange() : 파이썬 함수 range()와 유사. 0부터 함수 인자 값-1까지의 값을 순차적으로 ndarray의 데이터값으로 변환
- start, stop값 지정 가능
- zeros() : 튜플 형태의 shape 값을 입력하면 모든 값을 0으로 채운 ndarray 반환
- ones() : zeros()와 유사하게 1로 채운 ndarray 반환
- dtype을 인자로 정해주지 않으면 default float64형으로 반환
- reshpe() : ndarray를 특정 차원 및 크기로 반환한다.
- -1을 인자로 사용하면 원래 ndarray와 호환되는 새로운 shape로 변환한다.
- 특히 reshape(-1,1)은 2차원이고, 여러 로우를 지며 1개의 칼럼을 가진 ndarrayfh qusghks.
- ndarray는 tolist()를 이용해 리스트 자료형으로 변환할 수 있다.(시각화를 위함)
- 호환되지 않는 형태로는 반환 x
인덱싱(Indexing) - 데이터 세트 선택
- 단일 값 추출
- ndarray 객체에 인덱스 값을 [] 안에 입력한다.
- 2차원의 경우 콤마로 분리된 로우와 칼럼 위치의 인덱스를 통해 접근한다.
- 로우(행) == axis0, 칼럼(열) == axis1, 따라서 인덱싱은 axis0=0, axis1=1과 같이 해야한다.(+ 높이 == axis2)
- 슬라이싱(Slicing)
- [시작 인덱스 : 종료 인덱스 +1]로 표시
- ':' 사이의 인덱스는 생략 가능
- 시작 인덱스 default == 0, 종료 인덱스 default == 마지막 인덱스(-1)
- 다차원 슬라이싱에서 뒤에 오는 인덱스를 없애면 차원이 낮은 ndarray를 반환한다.
- 팬시 인덱싱(Fancy Indexing)
- 리스트나 ndarray로 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray를 반환
- 불린 인덱싱(Boolean Indexing)
- 조건 필터링과 검색 동시 가능
- ndarray의 인덱스를 지정하는 [] 내에서 조건문을 그대로 기재, True 값이 있는 인덱스의 데이터를 반환
행렬의 정렬
- np.sort()
- 넘파이에서 sort() 호출
- 원행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬 반환
- ndarray.sort()
- 행렬 자체에서 sort() 호출
- 원 행렬 자체를 정렬한 형태로 변한, 반환 값 None
내림차순으로 정렬하기 위해서는 [::-1] 적용
행렬이 2차원 이상인 경우에는 axis 축 값 설정을 통해 정렬을 수행할 수 있다.
- argsort()
- 정렬 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환한다.
- 넘파이의 ndarray는 메타 데이터를 가질 수 없으므로, 실제 값과 그 값이 뜻하는 메카 데이터를 별도의 ndarray로 가져야 한다.
- np.argsort(ndarray)를 이용해 반환된 인덱스를 ndarray에 팬시 인덱스로 적용해 추출할 수 있다.
선형대수 연산
- 행렬 내적(행렬 곱)
- np.dot()를 이용해 계산
- 왼쪽 행렬의 열 개수와 오른쪽 행렬의 행 개수가 동일해야 내적 연산이 가능하다.
- 전치 행렬
- 원 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬
- transpose()를 이용해 구할 수 있다.
04. 데이터 핸들링 - 판다스
판다스는 행과 열로 이루어진 2차원 데이터를 효율적으로 가공/처리할 수 있는 기능을 제공한다.
내부 데이터뿐만 아니라 csv 등의 파일을 쉽게 DataFrame으로 변경해 가공할 수 있다.
DataFrame : 여러 개의 행과 열로 워진 2차원 데이터. 판다스의 핵심 객체
Index : 개별 데이터를 고유하게 식별하는 Key 값
Series : 칼럼이 하나뿐인 데이터 구조체(DataFrame은 칼럼이 여러개)
함수 정리
- read_csv() + read_table(), read_fwf 등...
- 다양한 포맷의 파일을 DataFrame으로 로딩 가능
- 디폴트 필드 구분 문자는 탭 문자, 인자로 sep에 해당 구분 문자를 입력 가능
- r'파일 경로' 혹은 같은 디렉터리에 있다면 '파일명'으로 불러올 수 있다.
- Index는 로딩하며 저절로 생성, 칼럼명이 표시되지 않는다.
- head() : DataFrame의 맨 앞에 있는 N개의 로우를 반환한다.
- info() : 총 데이터 건수와 데이터 타입, Null 건수를 알 수 있다.
- describe() : 칼럼별 숫자형 데이터 값의 n-percentile 분포도, 평균값, 최댓값, 최솟값을 나타낸다.
- 숫자형 칼럼의 분포도만 조사한다. object 타입 제외
- value_counts() : 데이터의 분포도 확인
- [] 연산자 내부에 칼럼명을 입력하면 Series 형태로 특정 칼럼 데이터 세트가 반환된다.
- 칼럼 값별 데이터 건수를 반환하므로 고유 칼럼 값을 식별자로 사용할 수 있다.
- Null값을 무시하고 결과값을 내놓는다. dropna=False로 Null값 포함 가능
내부 데이터와 DataFrame 변환
DataFrame은 칼럼명을 가지므로 변환 시 칼럼명을 지정해준다. columns 인자로 지정할 수 있다.
딕셔너리를 DataFrame으로 변환 시 딕셔너리의 키는 칼럼명으로, 값은 칼럼 데이터로 변환된다.
- values() : DataFrame을 ndarray로 변환
- tolist() : values()를 통해 얻은 ndarray에 호출하여 리스크로 면환한다.
- to_dict() : DataFrame을 딕셔너리로 변환, 인자로 'list' 입력 시 딕셔너리 값이 리스트로 반환된다.
DataFrame의 칼럼 데이터 세트 생성과 수정
[] 내에 새로운 칼럼명 혹은 수정할 칼럼명을 입력하고 값을 할당해준다.
상숫값을 할당하면 Series의 모든 데이터 세트에 일괄적용 된다.
DataFrame 데이터 삭제
drop() 메서드를 이용한다.
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
axis 값에 따라서 특정 칼럼 또는 특정 행을 드롭한다.
axis를 0으로 지정하면 자동으로 labels에 오는 값을 인덱스로 간주한다.
inplace=True로 설정 시 원본 데이터가 삭제된다. 반환값 None
Index 객체
- index : DataFrame, Series에서 index 객체만 추출한다.
- index 객체의 실제 값은 1차원 series로 볼 수 있다.
- values : 인덱스 객체의 values로 ndarray 값을 알 수 있다.
- reset_index() : 새롭게 인덱스를 연속 숫자 형으로 할당하며, 기존 인덱스는 index라는 새로운 칼럼명으로 추가
- reset_index()는 DataFrame을 반환한다.
- drop=True 설정 시 기존 인덱스는 삭제 된다.
데이터 셀렉션 및 필터링
DataFrame의 [] 에는 칼럼명 또는 인덱스로 변환 가능한 표현식이 들어간다. 즉, 칼럼 지정 연산자
판다스의 인덱스 형태로 변환 가능한 표현식은 []내에 입력 가능하다.
불린 인덱싱 표현 가능
- iloc[]
- 위치 기반 인덱싱 방식
- 행과 열 위치를, 0을 출발점으로 하는 세로축, 가로축 좌표 정숫값으로 지정한다.
- 열 위치에 -1을 입력하여 DataFrame의 가장 마지막 열 데이터를 가져오는 데 자주 사용한다.
- loc[]
- 명칭 기반 인덱싱 방식
- 데이터 프레임의 인덱스 값으로 행 위치를, 칼럼의 명칭으로 열 위치를 지정한다.
- loc[]에 슬라이싱 기호를 적용할 때에는 종료값-1 이 아니라 종료 값까지 포함하는 것을 의미한다.
불린 인덱싱
[], loc[]에서 공통으로 지원한다. iloc[]은 x
and 조건 ==&, or 조건 == | , NOT 조건 == ~
정렬, Aggregation 함수, GroupBy 적용
- sort_values()
- by로 특정 칼럼을 입력하면 해당 칼럼으로 정렬을 수행한다.
- ascending=True로 오름차순, False로 내림차순을 성정한다.
- inplace로 원본 유지 및 반환을 설정한다.(True면 원본에 결과 적용)
- aggregation 함수
- 모든 칼럼에 해당 aggregation을 적용한다.
- count(), min(), max(), sum(), count() 등
- count()는 Null 값을 반영하지 않은 결과를 반환한다.
- 특정 칼럼만 반영하고 싶다면 DataFrame에 대상 칼럼들만 추출한다.([] 이용)
- groupby()
- by에 칼럼을 입력하면 대상 칼럼으로 groupby된다. 또다른 DataFrame 반환
- 여러 칼럼을 적용하려면 DataFrameGroupBy 객테의 agg() 내에 인자로 입력해서 사용한다.
- agg() 내에 입력값으로 딕셔너리 형태로 aggregation이 적용될 칼럼들과 aggregation 함수를 입력해 한 번에 계산 가능
결손 데이터 처리하기
결손 데이터는 넘파이의 NaN으로 표시한다.
- isna() : NaN여부 확인
- fillna() : NaN값을 다른 값으로 대체, inplace로 반환 및 원본 처리 가능
apply lambda 식으로 데이터 가공
lambda : 함수의 선언과 함수 내의 처리를 한 줄의 식으로 쉽게 변환 가능
' : '의 왼쪽에 있는 x 는 입력 인자, 오른쪽은 입력 인자의 계산식이다.
- map()
- map() 함수를 결합하여 lambda식을 이용한다.
- if else 절로 복잡한 가공 가능, 단 if 식보다 반환 값을 먼저 기술해야 한다.
- else if 는 지원하지 않는다. 따라서 더 복잡한 if else나 switch 문은 별도의 함수를 생성한다.
'Euron > 정리' 카테고리의 다른 글
[Week4] 04. 분류 - 캐글 실습 (0) | 2023.09.29 |
---|---|
[Week3] 04. 분류(2) (0) | 2023.09.21 |
[Week2] 04. 분류(1) (0) | 2023.09.17 |
[Week1] 03. 평가 (0) | 2023.09.12 |
[Week1] 02. 사이킷런으로 시작하는 머신러닝 (0) | 2023.09.12 |