일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 논문리뷰
- 알고리즘
- zerodivide
- 수학
- 코테공부
- 유클리드 호제법
- 백준
- numpy
- 그래프란
- allow_pickle
- 질문 정리
- 글또8기
- 추천시스템 입문
- 강의정리
- BruteForchSearch
- 파이썬 머신러닝 완벽가이드 공부
- CS224W
- 이코테
- 추천시스템
- Graph Representation Learning
- graph
- #이코테2021
- BruteForceSearch
- #나동빈
- 데이콘 필사
- 나동빈
- 소수 판정
- nan값
- paper review
- 에스토스테네스의 체
- Today
- Total
꾸준히 써보는 공부 기록
Numpy & Pandas 본문
Machine Learning
Machine Learning이란 어플리케이션을 수정하지 않고도 데이터를 기반으로 패턴을 학습하고 결과를 추론하는 알고리즘 기법을 통칭한다
그렇다면 Machine Learning은 왜 필요한가 ?
현실 세계의 복잡한 업무와 규칙을 구현하기 위해서는 매우 복잡하고 방대한 코드가 필요하다. 그리고 수시로 변하는 업무 환경, 정책, 사용자 성향에 따라야 하기 때문에 어플리케이션 개발 또한 어렵다. 여러 변형으로 인해 숫자 인식에 필요한 여러 특징(feature)들을 일일이 고려하기가 힘들다.
⇒ 머신러닝은 이러한 복잡한 문제를 데이터를 기반으로 숨겨진 패턴을 인지해 해결한다. 머신러닝 알고리즘은 데이터를 기반으로 통계적인 신뢰도를 강화하고 예측 오류를 최소화하기 위한 다양한 수학적 기법을 적용해 데이터 내의 패턴을 스스로 인지하고 신뢰도 있는 예측 결과를 도출해 낸다.
Machine Learning의 분류
Supervised Learning과 Un-supervised Learning, Reinforcement Learning으로 나뉜다.
지도 학습은 명확한 결정값이 주어진 데이터를 학습하는 것이며, 비지도 학습은 결정값이 주어지지 않은 데이터를 학습하는 것이다.
지도 학습 - 분류, 회귀, 시각/음성 감지/인지 → labeling되어 있는 상태
비지도 학습 - 군집화(클러스터링), 차원 축소
Machine Learning의 단점
- 데이터에 너무 의존적이다.(Garbage In, Garbage Out)
- 학습 시에 최적의 결과를 도출하기 위해 수립된 머신러닝 모델은 실제 환경 데이터 적용 시 과적합되기 쉽다.
- 블랙 박스 형식이다.
- 데이터의 특성을 파악하고 최적의 알고리즘과 파라미터를 구성할 수 있는 능력이 필요.
머신러닝 패키지 - sklearn, tensorflow, pytorch
배열,선형대수,통계 패키지 - numpy, scipy
데이터 핸들링 - pandas
시각화 - matplotlib, seaborn
대화형 파이썬 툴 - jupyter notebook
Numpy ndarray
ndarray : N차원(Dimension) 배열(Array) 객체
1차원 배열 : 선
2차원 배열 : 행과 열
3차원 배열 : +높이
import numpy as np
array1 = np.array([1,2,3]) # 1차원,shape:(3,)
array2 = np.array([[1,2,3],[2,3,4]]) # 2차원,shape:(2,3)
Numpy 모듈의 array( ) 함수로 생성한다. 인자로 주로 파이썬 list 또는 ndarray.
ndarray의 shape는 ndarray.shape 속성으로, 차원은 ndarray.dim 속성으로 알 수 있다.
ndarray 내의 데이터 값은 숫자 값, 문자열 값, bool 값이 모두 가능하다.
주의해야될 점 : ndarray 내의 데이터 타입은 그 연산의 특성상 같은 데이터 타입만 가능하다. list는 다른 데이터 타입도 가능하다.
ndarray 내의 데이터 타입은 ndarray.dtype로 확인할 수 있다.
ndarray 타입(type) 변환
astype( )을 이용하여 변환한다. 변경을 원하는 타입을 astype( )에 인자로 입력한다. 대용량 데이터를 ndarray로 만들 때 메모리를 절약하기 위해서 자주 사용한다. 크지 않은 범위의 숫자를 위해서 64bit float형 보다는 8 bit 또는 16 bit의 integer 형으로 변환하는 것이 훨씬 메모리를 많이 절약할 수 있다! 대용량 데이터 다룰 시 메모리 절약을 위해서 형변환을 특히 고려해야 한다.
Numpy ndarray의 axis(축)
ndarray의 shape는 행,열,높이 단위로 부여되는 것이 아니라 axis 0, axis 1, axis 2와 같이 axis 단위로 부여된다.
axis 0 ⇒ 열 방향
axis 1 ⇒ 행 방향
ndarray를 편리하게 생성하기 - arange, zeros, ones
특정 크기와 차원을 가진 ndarray를 연속값이나 0 또는 1로 초기화 생성해야 할 경우 arange( ), zeros( ), ones( )를 이용해 쉽게 ndarray를 생성할 수 있다. 주로 테스트용으로 데이터를 만들거나 대규모의 데이터를 일괄적으로 초기화해야 할 경우에 사용된다.
np.arange(10) ⇒ [0 1 2 3 4 5 6 7 8 9]
np.zeros((3,2), dtype='int32') ⇒ [[0 0] [0 0] [0 0]]
np.ones((3,2)) ⇒ [[1. 1.] [1. 1.] [1. 1.]]
ndarray의 차원과 크기를 변경하는 reshape( )
ndarray를 특정 차원 및 형태로 변환. 변환 형태를 함수 인자로 부여한다. reshape(-1, 5)와 같이 인자에 -1을 부여하면 -1에 해당하는 axis의 크기는 가변적이되 -1이 아닌 인자값(여기서는 5)에 해당되는 axis 크기는 인자값으로 고정하여 ndarray의 shape를 변환한다. 고정된 값에 맞춰서 자동으로 생성한다.
Fancy Indexing
리스트나 ndarray로 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray를 반환하는 인덱싱 방식이다. 그 위치의 데이터값을 반환하는 방식이다.
array1[ [2, 4, 7] ] = [3, 5, 8]
Boolean Indexing
조건 필터링과 검색을 동시에 할 수 있기 때문에 매우 자주 사용되는 인덱싱 방식이다.
예) ndarray 내의 값이 5보다 큰 ndarray를 추출하고자 한다면? array1[array1 > 5]
array1d>5 Boolean 조건을 [ ] 내에 입력!! ⇒ False 값은 무시하고 True값에 해당되는 index값만 저장 ⇒ 저장된 index값으로 데이터 조회
sort( )
np.sort( ) : 원 행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬을 반환한다.
ndarray.sort( )는 원 행렬 자체를 정렬한 형태로 변환하며 반환 값은 None이다. np.sort( )나 ndarray.sort( ) 모두 기본적으로 오름차순으로 행렬 내 원소를 정렬한다. 내림차순으로 정렬하기 위해서는 [::-1]을 적용한다. np.sort( )[::-1]과 같이 사용하면 된다.
np.sort(A, axis=0) : 열을 기준으로 sorting
np.sort(A, axis=1) : 행을 기준으로 sorting
argsort( )
원본 행렬 정렬 시 정렬된 행렬의 원래 인덱스를 필요로 할 때 np.argsort( )를 이용한다. np.argsort( )는 정렬 행렬의 원본 행렬 인덱스를 ndarray형으로 반환한다.
np.dot(A,B) - 행렬 내적
내가 아는 그 행렬 내적이다! [[행열,행열] [행열,행열]] 이 형태!
np.transpose(A) - 전치 행렬
Pandas의 주요 구성 요소 - DataFrame, Series, Index
DataFrame
Column * Row 2차원 dataset
Series
1개의 column값으로만 구성된 1차원 dataset
read_csv( )
csv 파일을 편리하게 DataFrame으로 로딩한다. sep 인자를 콤마가 아닌 다른 분리자로 변경하여 다른 유형의 파일도 로드가 가능하다.
DataFrame 데이터 삭제
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
axis : DataFrame의 row를 삭제할 때는 axis = 0, column을 삭제할 때는 axis = 1로 설정
원본 DataFrame은 유지하고 드롭된 DataFrame을 새롭게 객체 변수로 받고 싶다면 inplace=False로 설정 (Default 값이 False이다)
예) titanic_drop_df = titanic_df.drop('Age_0', axis=1, inplace=False)
원본 DataFrame에 드롭된 결과를 적용할 경우에는 inplace=True를 적용
예) titanic_df.drop('Age_0', axis=1, inplace=True)
원본 DataFrame에서 드롭된 DataFrame을 다시 원본 DataFrame 객체 변수로 할당하면 원본 DataFrame에서 드롭된 결과를 적용할 경우와 같음 (단, 기존 원본 DataFrame 객체 변수는 메모리에서 추후 제거됨)
예) titanic_df = titanic_df.drop('Age_0', axis=1, inplace=False)
Index 객체
RDBMS의 PK(Primary Key)와 유사하게 DataFrame, Series의 레코드를 고유하게 식별하는 객체이다. DataFrame, Series에서 Index 객체만 추출하려면 DataFrame.index 또는 Series.index 속성을 통해 가능하다. Series 객체는 Index 객체를 포함하지만 Series 객체에 연산 함수를 적용할 때 Index는 연산에서 제외한다. Index는 오직 식별용으로만 사용한다. DataFrame 및 Series에 reset_index( ) method를 수행하면 새롭게 index를 연속 숫자 형으로 할당한다. 기존 인덱스는 'index'라는 새로운 컬럼 명으로 추가한다.
Data selection 및 filtering
- : column 기반 filtering 또는 boolean indexing filtering 제공
- ix[ ], loc[ ], iloc[ ] : 명칭 / 위치 기반 인덱싱을 제공
- Boolean Indexing : 조건식에 따른 filtering을 제공 (추천!!)
ix, loc, iloc
명칭(Label) 기반 인덱싱은 컬럼의 명칭을 기반으로 위치를 지정하는 방식이다. '컬럼 명' 같이 명칭으로 열의 위치를 지정하는 방식이다.
위치(Position) 기반 인덱싱은 0을 출발점으로 하는 가로축, 세로축 좌표 기반의 행과 열 위치를 기반으로 데이터를 지정한다. 따라서 행, 열 위치값으로 정수가 입력이 된다.
- ix[ ]: 명칭 기반과 위치 기반 인덱싱을 함께 제공
- loc[ ] : 명칭 기반 인덱싱
- iloc[ ] : 위치 기반 인덱싱
Boolean Indexing
위치 기반, 명칭 기반 인덱싱 모두 사용할 필요 없이 조건식을 [ ] 안에 기입하여 간편하게 필터링한다.
titanic_boolean = titanic_df [ titanic_df ['Age'] > 60 ]
tip)
titanic_df [0:2] 이런 식으로 하는 것보다
titanic_df [ titanic_df ['Pclass'] == 3 ].head(3) 이런 식으로 하는 것이 오류가 덜 발생한다.
결손 데이터(Missing Data) 처리하기
- isna( ) : DataFrame의 isna( ) 메소드는 주어진 컬럼값들이 NaN인지 True/False를 반환(NaN이면 True)
- fillna( ) : 결손 데이터를 NaN으로 채워준다
Python lambda 식 이해
<파이썬 lambda 식>
lambda_square = lambda x : x**2
print('3의 제곱은:', lambda_square(3))
x는 입력 인자이다. x ** 2는 입력 인자를 기반으로 한 계산식이며 호출 시 계산 결과가 반환된다. 판다스의 경우 컬럼에 일괄적으로 데이터를 가공하는 것이 속도 면에서 더 빠르나, apply(lambda식)을 사용해서 복잡한 데이터 가공을 한다.