본문 바로가기

머신러닝

01. 머신러닝 시작하기

[공부 자료 : Must Have 데싸노트의 실전에서 통하는 머신러닝]

# 10가지 대표 ML 알고리즘 정리

1. 선형회귀 (Liear regression)

2. 로지스틱회귀 (Logistic regression)

3. K-최근접 이웃 (KNN)

4. 나이브 베이즈 (Naive Bayes)

5. 결정 트리 (Decision Tree)

6. 랜덤 포레스트 (Random Forest)

7. XG 부스트 (XG Boost)

8. 라이트GBM (LightGBM)

9. K-평균 군집화 (K Means Clustering)

10. 주성분 분석 (PCA)

# Artificial Intelligence, Machine Learning, Deep Learning

인공지능

인공지능 : 인간의 뇌를 모방하는 모든 프로그램 (자율주행, 알파고, 쇼핑몰 추천, 챗봇 등)

      머신러닝 : 데이터를 기반으로 학습 → 예측 or 데이터의 특성을 찾아냄

            딥러닝 : 머신러닝 알고리즘 中 하나, 인공신경망에서 진화 (주로 이미지, 비디오, 자연어 분석에 사용)

머신러닝

전통적인 프로그램 : 사람이 모델을 만든다 → 프로그램은 모델에 데이터를 입력하여 출력을 얻는다

머신러닝 : 사람이 만든 알고리즘입력값정답값을 넣어준다 → 프로그램이 입력값과 정답값의 관계를 찾는다 

      머신러닝 알고리즘은 관계를 바탕으로 새로운 프로그램(모델)을 만든다

      새로운 모델에 새로운 입력값을 넣어 예측값을 얻는다

딥러닝 (심층 학습)

인공신경망을 기반으로 한 특수한 머신러닝 기법

입력층과 출력층 사이에 은닉층을 두어 인간의 신경망처럼 작동

# 머신러닝 기법 

지도(Supervised) 학습 : 입력값과 정답 사이의 관계를 분석하여 예측 모델을 만든다

      회귀 (Regression) : 예측 결과값이 연속성을 지닌다

      분류 (Classification) : 예측 결과값이 불연속성을 지닌다 (클래스)

비지도(Unsupervised) 학습 : 정답이 없는 데이터를 학습한다

      군집화 (clustering) : 비슷한 데이터끼리 묶어준다 

      변환 (Transformation) : 목적에 따라 데이터를 다른 형태로 변환한다 

      연관 (Association) : 장바구니 분석, 유사 구매 목록의 고객끼리 비교하여 서로의 장바구니에 없는 새로운 물건을 추천

강화(Reinforcement) 학습 : 행동에 대한 보상/처벌을 기반으로 학습한다

      보상을 받는 행동을 유도하고, 처벌을 받는 행동을 피하게끔 한다 (ex. 알파고)

# 머신러닝 특성

머신러닝 프로세스

MLOps (Machine Learning Operations)

      머신러닝 모델을 지속적으로 최신 데이터로 재학습하고, 전 과정을 안정적이고 효율적으로 배포 및 유지

1. 데이터 수집 

2. 데이터 전처리 (ex. 피처 엔지니어링)

3. 모델 학습

4. 모델 평가

5. 모델 배포

알고리즘 성능 비교

1. 범용성 : 다양한 케이스에 적용할 수 있는가

2. 속도 : 모델링 및 예측 속도

3. 예측력 : 예측 결과의 정확도

4. 하이퍼파라미터 튜닝 : 모델링에서 튜닝 가능한 옵션의 종류와 기능

5. 시각화 : 모델링 결과에 대한 시각화 가능 수준

6. 해석력 : 모델에 대한 해석의 용이성

머신러닝 핵심 라이브러리

1. Numpy : 다차원 배열에 대한 빠른 처리

2. Pandas : 인간 친화적 자료구조를 제공해 Numpy보다 데이터를 쉽게 읽고 변형

3. Scikit-learn (Sklearn) : 데이터 분석과 머신러닝 관련 기능 지원 (데이터 전처리, 모델링, 모델 평가 등) 

4. Matplotlib : 시각화

5. Seaborn : 시각화, Matplotlib보다 쉽고 깔끔

6. Scipy : 수학, 통계, 신호 처리, 이미지 처리, 함수 최적화에 사용되는 데이터 과학 라이브러리

7. Theano : 수학 표현식, 행렬 값을 조작하고 평가하는 라이브러리

피처 엔지니어링 기법

1. 결측치 처리 : 누락된 데이터를 채운다

2. 아웃라이어 처리 : 크게 벗어나는 값을 제거하거나 조정한다

3. 바이닝 (Binning) : 연속된 수치로 된 데이터를 특정 구간으로 묶는다 (ex. 10대, 20대, ...)

4. 로그 변환 : 데이터에 로그를 씌워 왜곡된 데이터를 정규화한다

5. 더미 변수 (One-hot encoding) : 문자로 된 범주형 데이터를 0과 1을 사용하는 숫자형 데이터로 변경

6. 그룹핑 (Grouping) : 고윳값이 너무 많은 범주형 데이터를 특정 그룹을 묶는다 (ex. 국가명 → 유럽, 아시아, ...)

7. 스케일링 : 각 변수의 데이터 범위(스케일)가 다를 때, 일정하게 맞춰준다

8. 날짜 추출 : 날짜 데이터에서 연/월/일, 요일 등을 추출해 필요한 정보만 사용한다

9. 텍스트 분할 : 텍스트로 된 변수에서 특정 부분의 단어를 빼오거나 특정 기호를 기준으로 나누어 추출한다 

10. 새로운 변수 창출 : 주어진 변수들을 사용하여 새로운 변수를 만들어낸다

# 변수

프로그래밍에서의 변수 vs. 통계에서의 변수

프로그래밍에서 변수 : 데이터나 정보를 저장하는 공간

통계에서 변수 : 대상의 특성

      인덱스 (행, row) : 학생

      변수 (열, col) : 키, 몸무게, 성적, ...

독립 변수와 종속 변수

독립(independent) 변수 : 예측에 사용된다 (feature, feature 변수)

종속(dependent) 변수 : 예측하려는 대상 (target, target 변수, 목표 변수)

ex_1) 학생의 신체 정보(키, 몸무게)를 바탕으로 성적 예측하기

      독립 변수 : 키, 몸무게

      종속 변수 : 성적

ex_2) 키, 몸무게, 성별을 이용하여 보험료를 예측하기

      독립 변수 : 키, 몸무게, 성별

      종속 변수 : 보험료

      매개 변수 (결과에 영향을 준다) : 사고 발생률

 


# 라이브러리 : Pands, Numpy

- Pandas vs. Numpy

Pandas : 사람이 읽기 쉬운 형태의 자료구조를 제공 

      종류 : Pandas series (col이 하나), Pandas DataFrame (col이 둘 이상)

      입출력 : SQL, 엑셀, CSV, 데이터베이스

      장점 : 하나 이상의 자료형을 원소로 가질 수 있다

                테이블 형식의 작업(SQL과 같은 쿼리나 조인)이 가능

      단점 : 2차원 이하 배열의 데이터까지 가능

                메모리가 상대적으로 많이 필요

                속도가 느림

Numpy : 컴퓨터가 계산하기 좋은 형태의 자료구조를 제공 (col 명이 없다) 

      입출력 : npv, npz, txt

      연산 : 행렬 및 벡터 연산 기반

      장점 : 3차원 이상의 배열도 가능

                메모리가 상대적으로 조금 필요

                속도가 빠름

      단점 : 같은 자료형만 원소로 가질 수 있음

- Pandas

read_csv( ) : Pandas로 csv 파일 불러오기

import pandas as pd

file_url = 'https://media.githubusercontent.com/media/musthave-ML10/data_source/main/sample.csv'
sample = pd.read_csv(file_url)

sample

head( ) : 상위 5개 인덱스만 출력

sample.head()

sample.head(3) # 상위 3개 인덱스 출력

tail( ) : 하위 5개 인덱스만 출력

sample.tail()

sample.tail(10) # 하위 10개 인덱스 출력

info( ) : 데이터 요약 정보

sample.info()

      RangeIndex : 데이터 행 수

      entries : 인덱스 번호

      Datacolums : 변수 개수

      Column : 변수명

      Non-Null Count : Null이 아닌 데이터 수

      Dtype : 자료형

Pandas 주요 자료형

      object : 문자열

      int64 : 소수점 없는 숫자

      float64 : 소수점 있는 숫자

      bool : 불리언

      datetime64 : 날짜/시간

describe( ) : col별 데이터 통계 정보

sample.describe()

      count  : 데이터 개수

      mean : 평균

      std : 표준편차

      min, max : 최솟값, 최댓값

      25%, 50%, 75% : 사분위수

DataFrame( ) : DataFrame 직접 만들기

# Dictionary -> DataFrame
sample_dic = {'name' : ['kim', 'lee', 'park'], 'age' : [23, 22, 21]}
pd.DataFrame(sample_dic)
# List -> DataFrame
sample_list = [[1, 2], [3, 4], [5, 6], [7, 8]]
pd.DataFrame(sample_list, columns = ['var_1', 'var_2'], index = ['a', 'b', 'c', 'd'])

DataFrame['col명 '] : DataFrame col 기준 인덱싱

file_url = 'https://media.githubusercontent.com/media/musthave-ML10/data_source/main/sample_df.csv'
sample_df = pd.read_csv(file_url, index_col = 0) # index_col = 0 : 0번째 col을 index로 지정
sample_df

# col 1개 인덱싱
sample_df['var_1'] # 한 줄 데이터 = Pandas Series

# col 2개 인덱싱
sample_df[['var_1', 'var_2']]

DataFrame.loc['index 명'] : DataFrame row 기준 인덱싱

# row 1개 인덱싱
sample_df.loc['a']

# row 3개 인덱싱
sample_df.loc[['a', 'b', 'c']]

# row 3개 인덱싱
sample_df.loc['a':'c'] # 'a' row 이상, 'c' row 이하

DataFrame.iloc[index 번호] : DataFrame row 기준 인덱싱

sample_df.iloc[[0, 1, 2]]

sample_df.iloc[0:2] # 0번 row 이상, 2번 row 미만

DataFrame.iloc[index 번호, col 번호] : Dataframe row & col 인덱싱

sample_df.iloc[0:3, 2:4] # [0번 row 이상, 3번 row 미만] & [2번 col 이상, 4번 col 미만]

DataFrame.drop('index 명') : row 삭제

# 'a' row 삭제
sample_df.drop('a')

# 'a', 'b' row 삭제
sample_df.drop(['a', 'b'])

sample_df # 원본은 변화가 없다

DataFrame.drop('col 명', axis = 1) : col 삭제

# 'var_1' col 삭제
sample_df.drop('var_1', axis = 1)

# 'var_1', 'var_2 col' 삭제
sample_df.drop(['var_1', 'var_2'], axis = 1)

sample_df # 원본은 변화가 없다

DataFrame.reset_index( ) : 현재 index를 변수(col)로 빼내기

      새로운 index에는 0부터 번호를 부여

sample_df.reset_index()

sample_df # 원본은 변화가 없다

DataFrame.reset_index(drop = True) : 현재 index를 삭제하기

sample_df.reset_index(drop = True)

sample_df # 원본은 변화가 없다

 DataFrame.set_index('col 명') : 기존 변수(col)을 index로 설정하기

sample_df.set_index('var_1')

sample_df # 원본은 변화가 없다

DataFrame.count( ) : 변수(col)별 데이터 개수

DataFrame.sum( ) : 변수(col)별 합

DataFrame.mean( ) : 변수(col)별 평균

DataFrame.media( ) : 변수(col)별 중위값

DataFrame.var( ) : 변수(col)별 분산

DataFrame.std( ) : 변수(col)별 표준편차

sample_df.count()
sample_df.sum()
sample_df.mean()
sample_df.median()
sample_df.var()
sample_df.std()

DataFrame.aggregate( ) : 변수(col)별 통계값을 모아서 보기

sample_df.aggregate(['sum', 'mean'])

sample_df.aggregate(['var', 'std'])

DataFrame.groupby('col 명') : 해당 변수(col)에 대하여 그룹화 시키고 통계를 구한다

file_url = 'https://media.githubusercontent.com/media/musthave-ML10/data_source/main/iris.csv'
iris = pd.read_csv(file_url)

iris.head()
# iris의 class 변수에는 'versicolor', 'virginica', 'setosa'가 있다 -> 그룹화

iris.groupby('class').mean()
# 모든 setosa의 sepal length 평균, sepal width 평균, petal length 평균, petal width 평균
# ...

iris.groupby('class').agg(['count', 'mean']) # 여러 개의 통계 분석을 한 번에 진행

DataFrame['col 명'].unique() : 변수(col)에 중복되지 않는 고유값

DataFrame['col 명'].nunique() : 변수(col)에 중복되지 않는 고유값의 종류 개수

DataFrame['col 명'].value_counts() : 변수(col)에 중복되지 않는 고유값이 총 몇 개씩 있는가

iris['class'].unique()
# array(['versicolor', 'virginica', 'setosa'], dtype=object)

iris['class'].nunique() 
# 3

iris['class'].value_counts()
# versicolor    50
# virginica     50
# setosa        50
# Name: class, dtype: int64