Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Archives
Today
Total
관리 메뉴

데이터분석 공부하기

[파이썬 머신러닝 완벽가이드] 1장. 파이썬 기반의 머신러닝과 생태계 이해(Numpy, Pandas) 본문

머신러닝

[파이썬 머신러닝 완벽가이드] 1장. 파이썬 기반의 머신러닝과 생태계 이해(Numpy, Pandas)

Eileen's 2021. 9. 11. 21:35
  1. 머신러닝의 개념
    -어플리케이션을 수정하지 않고 데이터를 기반으로 패턴을 하긋ㅂ하고 결과를 에측하는 알고리즘 기법
    -복잡한 조건/규칙, 데이터 분석(예측 분석), 개발 복잡도(영상, 음석, 자연어, 데이터마이닝 등)에 활용 
    1) 머신러닝의 종류: 지도학습(분류, 회귀, 추천 시스템, 시각/음석감지/인지, 텍스트분석/NLP); 비지도학습(군집, 차원축소, 강화학습)
    2) ML의 단점- 데이터에 매우 의존적(Garbage In, Garbage Out); 데이터 이해, 가공, 처리, 추출이 알고리즘/모델보다 더 중요
    3) Python vs R:
        -R: 통계전용 프로그램 언어; 전통적 통계 및 마이닝 패키지(SPSS, SAS, MATLAB)의 고비용 개선을 위해 만들어짐
        -Python: 다양한 영역에서 사용되는 개발 전문 프로그래밍 언어; R보다 더 뛰어난 점(쉽고 뛰어난 개발 생산성,
          Interpreter언어로 뛰어난 확장성, 유연성, 호환성, 오픈소스 계열의 전폭 지원/ 딥러닝 프래임워크(텐서플로, 케라스, 파이토치 등) 파이썬 우선 지원
  2. 파이썬 머신러닝 생태계 구성 주요 패키지: ML 패키지(sklearn 등), 행렬/선형대수/통계패키지(Numpy, SciPy), 데이터 핸들링(Pandas), 시각화(Matplotlib, Seaborn), Ipython(Interactive Python툴-Jupyter Notebook)

  3. 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() 

  4. 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 함수 호출 : 딕셔너리 형태 활용