[파이썬 머신러닝 완벽가이드] 1장. 파이썬 기반의 머신러닝과 생태계 이해(Numpy, Pandas)
Eileen's
2021. 9. 11. 21:35
머신러닝의 개념: -어플리케이션을 수정하지 않고 데이터를 기반으로 패턴을 하긋ㅂ하고 결과를 에측하는 알고리즘 기법 -복잡한 조건/규칙, 데이터 분석(예측 분석), 개발 복잡도(영상, 음석, 자연어, 데이터마이닝 등)에 활용 1) 머신러닝의 종류: 지도학습(분류, 회귀, 추천 시스템, 시각/음석감지/인지, 텍스트분석/NLP); 비지도학습(군집, 차원축소, 강화학습) 2) ML의 단점- 데이터에 매우 의존적(Garbage In, Garbage Out); 데이터 이해, 가공, 처리, 추출이 알고리즘/모델보다 더 중요 3) Python vs R: -R: 통계전용 프로그램 언어; 전통적 통계 및 마이닝 패키지(SPSS, SAS, MATLAB)의 고비용 개선을 위해 만들어짐 -Python: 다양한 영역에서 사용되는 개발 전문 프로그래밍 언어; R보다 더 뛰어난 점(쉽고 뛰어난 개발 생산성, Interpreter언어로 뛰어난 확장성, 유연성, 호환성, 오픈소스 계열의 전폭 지원/ 딥러닝 프래임워크(텐서플로, 케라스, 파이토치 등) 파이썬 우선 지원
파이썬 머신러닝 생태계 구성 주요 패키지: ML 패키지(sklearn 등), 행렬/선형대수/통계패키지(Numpy, SciPy), 데이터 핸들링(Pandas), 시각화(Matplotlib, Seaborn), Ipython(Interactive Python툴-Jupyter Notebook)
Numpy (Numerical Python) : 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 패키지 - Loop 없이 대량 데이터 배열 연산으로 빠른 배열 연산 속도; C/C++과 같은 저수준 언어 기반 호환 API; 데이터 핸들링 [ndarray] -넘파이 기반 데이터 타입; 많은 ML알고리즘 넘파이 기반 작성(입/출력 데이터 ndarray사용), 판다스 등 데이터 핸들링 패키지 이해 - 한 ndarray 내 동일한 데이터 유형(다를 경우, 범주/크기가 더 큰 데이터로 일괄 적용) 1) 기본 API : np.array(), ndarray.shape, ndarray.ndim, ndarray.dtype, ndarray.astype() 2) 생성/ 초기화 함수: np.arange(), np.zeros(), np.ones() - zeros()/ones()의 인자로 명시하지 않으면 dtype은 디폴트로 float64을 가짐 3) 차원/크기 변경 : ndarray.reshape() - '-1'은 고정된 행/열에 맞추어 자동생성; reshape(-1, 1) : 2차원 1 열은 concat/stack 결합시 ndarray 형태 통일에 사용 4) 데이터세트 선택(indexing, slicing) : slicing, fancy indexing, boolean indexing - axis 0: row; axis 1: column; 1차원 [1:3], 2차원 [1:3, 2:-1]. 3차원 - boolean indexing는 겉으로 보이진 않아도, True에 해당하는 index로 저장/조회(p.33) 5) 행렬의 정렬 : np.sort(), ndarray.sort(), np.argsort() - 오름차순이 디폴트이며 내림차순은 [::-1]사용 - np.sort() 원본유지, ndarray.sort() 원본변경 - np.argsort() : 정렬행렬의 원본 행렬인덱스를 ndarray형으로 반환 (활용 p.36) 6) 선형대수 연산 : 행렬내적(행렬 곱) : np.dot(); 전치 행렬: np.transpose()
Pandas -넘파이 기반으로 작성되었으나 저수준 API의 넘파이와는 달리 더욱 유연/편리한 데이터 핸들링 가능 -DataFrame : 파이썬 핵심 객체; 여러개의 Series로 구성(여러개의 columns) -Series : Index + 1 column; -기본 API : pd.read_csv(sep=) sep을 통해 csv(콤마 분리 문자 뿐 아니라, tab 분리 문자 등 모두 로딩가능) DataFrame.head(), DataFrame.shape DataFrame.info() : 총 데이터 건수, 데이터 타입, Null 건수 DataFrame.describe() : 칼럼별 n-percentile분포도(count, std, 25%, 50%, 75%), 평균값, 최대값, 최소값 (숫자형 칼럼만 조사, object타입은 자동 제외) Series.value_counts() : 데이터 유형/건수; DataFrame에 해당 메소드 X, []연산자로 특정 칼럼(Series) 데이터 분포도
[기본 데이터 핸들링] -DataFrame []연산자 : ['칼럼명']시 Series형태로 특정 칼럼 데이터 세트반환 -DataFrame 칼럼 생성/ 수정 : df[''] = value -DataFrame 데이터 삭제 : DataFrame.drop(labels, axis, inplace) *)df1 = df1.drop('Age', inplace = True)의 경우 None반환(p.58) -결손데이터 처리: isna(), isna.sum(), fillna(inplace)
[DataFrame/List/Dictionary/Ndarray 상호 변환 (p.49)] -sklearn의 많은 API는 기본적으로 ndarray를 입력 인자로 사용하기에 상호간 변환이 많은 -ndarray/list/dict -> DataFrame: pd.DataFrame(객체명, columns= ) -DataFrame -> ndarray/list/dict : 1) ndarray명.values, 2)list명.values.tolist() : ndarray로 반환 후 list로 반환 3)dict명.to_dict('list') : 'list'로 변환이 아니라 리스트형 dict으로 반환
[apply lambda 식 데이터 가공 (p.82)] -파이썬에서 lambda식은 함수형 프로그래밍 지원하며 판다스에서 파이썬의 lambda식을 DataFrame에 동일하게 적용시킴 -Series.map() : python에서 여러개의 값을 입력 인자로 사용할 경우 map(lambda x: expression) -DataFrame.apply(): http://www.leejungmin.org/post/2018/04/21/pandas_apply_and_map/ -lambda 조건문 : if else 활용(lambda x :'반환값' 조건 else '반환값'; if elif는 지원X, 여러 조건 적용 : 1) lambda x :'반환값' 조건 else ( '반환값' 조건 else '반환값') - 많은 조건에는 불편함 2) 별도 함수 생성 후 적용: def condition(age): 조건..return; df['age'].apply(lambda x : condition(x))
[Index] - Ndarray의 index와 같이, 단일값 반환, 슬라이싱 가능, but 단순 수정불가(ex- df1[0] = 0 오류) ; - reset_index() : 새롭게 인텍스를 연속 숫자 형으로 할당(기존 index는 칼럼으로 추가, drop =True설정하면 기존 index 삭제) - 데이터 셀렉션 & 필터링 : -넘파이 []연산자 : 행/열 위치, 슬라이싱 빔위 지정 -> 단일 값 추출, 슬라이싱, 팬시 인덱싱, 불린 인덱신 -판다스 []연산자: 넘파이/시리즈 []연산자와 다름; []만 사용하는 연산자에는 '칼럼지정 연산자' 사용 (칼럼명 문자 or 인덱스 변환 가능 표현식)/ 불린 인덱스 위치 기반 인덱싱(DataFrame.iloc[]): 행,열의 좌표 사용 *) 인덱스가 아닌 좌표(위치)를 사용한다 *) 위치 기반 인덱싱이 어려운 불린인덱싱은 제공 X 명칭 기반 인덱싱(DataFrame.loc[]) : 인덱스/ 칼럼명 사용 *) 명칭기반이라도 index가 숫자형일 수 있음 (0이 아닌 1로 시작할 수도 있음) *) 명칭기반의 특성 상, 슬라이싱[시작값:종료값]에서 종료값이 -1가 아닌 명시된 값까지 포함 ***Boolean 인덱싱 : 로직/조건을 []내 바로 명시하여 가져올 수 있기에 위치/명칭 기반 인덱싱보다 더 많이 사용; iloc지원 X -복합조건 결합 : &(and), |(or), ~(not); 개별 조건 변수를 만들어서 결합하여 사용가능(p.74) 1. []연산자 : 조건 & 칼럼 자유롭게 명시 : df[df['age'] > 60][['name','age']] 2. .loc[] : []내 row조건, column 순으로 명시 : df.loc[df['age'] > 60],['name','age']]
[정렬, Agg함수, Groupby] - 정렬 : DataFrame/Series.sort_values(by, ascending, inplace) - Aggregation함수 : DataFrame.min(), DataFrame.max(), DataFrame.sum(), DataFrame.count() - groupby() : * DataFrame.groupby()호출 시, DataFrameGroupBy라는 데이터 형태 반환 - groupby + aggregation : DataFrame.DataFrameGroupBy().min(), DataFrame.DataFrameGroupBy().count() 등 -agg() : 여러개의 함수명 입력 ex> df.groupby('Pclass')['Age'].agg([max,min]) -칼럼별 서로 다른 aggregation 함수 호출 : 딕셔너리 형태 활용