본문 바로가기
TIL _Today I Learned/2024.08

[DAY 26] Machine Learning 개론

by gamdong2 2024. 8. 19.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.19

📕 학습 목록

  • 인공지능 / 머신러닝 / 딥러닝
  • 사이킷런 (RandomForestClassifier)
  • 데이터 전처리

 

📗 기억할 내용

1) 인공지능 / 머신러닝 / 딥러닝

  • 인공지능 (Artificial Intelligence, AI) : 사고방식이나 학습 등 인간이 가지는 지적능력을 컴퓨터를 통해 구현하는 기술
  • 머신러닝 (Machine Learning, ML) : 컴퓨터가 스스로 학습하여 인공지능의 성능을 향상시키는 기술
  • 딥러닝 (Deep Learning) : 인간의 뉴런과 비슷한 인공신경망 방식으로 정보를 처리

 
2) 머신러닝

① 기계학습 (Machin Learning)

  • 인공지능 프로그래밍의 일종
  • 주어진 데이터를 기반으로 최적해를 계산하는 작업
  • 학습 방법
- 지도학습 : 학습 데이터에 답(레이블)을 표기 → 레이블을 맞추도록 유도하는 학습
- 비지도학습 : 레이블일 없는 학습데이터를 이용 → 데이터의 상관관계 • 패턴을 찾아내게 함
- 강화학습 : 학습시스템(에이전트)에 따라 취한 행동 → 보상 • 벌점 ⇒ 최선의 전략
  • 그 외
- 준지도학습 : 레이블이 있는 데이터(少) & 레이블이 없는 데이터(多)를 모두 학습
- 자기지도학습 : 레이블이 없는 데이터셋으로부터 → 레이블이 있는 데이터셋을 생성하여 학습

 
 
② 머신러닝의 개념 

  • 무엇(X)으로 무엇(Y)을 예측하고 싶음
[머신러닝 예시]
X : 고객들의 개인정보 및 금융정보 → Y : 대출 연체 여부
X : 고객의 상품 구매 내역 → Y : 고객의 취향
X : 학생의 인강 수강기록 → Y : 중간고사 시험 점수

 
③ 머신러닝의 과정

머신러닝 과정

 
머신러닝의 종류

  • 분류 (Classification)

    - 대상이 속하는 범주를 식별 "분류기"
    - Yes or No
    - 지도학습
 

  • 군집화 (Clustering)

    - 대상 사이의 유사도를 기준으로 분류 "클러스터(군집화)"
    - 비슷한 X끼리 묶기 
    - 비지도학습
 

  • 회귀 (Regression)

    - 연속적인 값을 예측(키, 점수 등) "예측기"
    - 두 변수 사이의 인과관계를 추론
    - 지도학습
 
 머신러닝의 입력값

  • 학습 데이터 (Training Set) : 학습 과정에서 사용되는 데이터. 매개변수 설정에 이용됨
  • 검증 데이터 (Validation Set; 선택사항) : 모델 학습 중간에 하이퍼파라미터 조정에 사용
  • 테스트 데이터 (Test Set) : 학습이 완료된 모델의 최종 성능을 평가하기 위해 사용됨; 제대로 학습했는지 평가 → 부족할 시 다시 추가 학습

"학습 과정 중간중간 밸리데이션 수행 → 본시험(테스트) 수행"
 

* 테스트 수행시, 학습 데이터와 테스트 데이터의 비율 보다, 몇개를(n) 학습시켰는지가 더 중요
    ex : 데이터가 총 10개 뿐일때, 학습 : 테스트 = 8 : 2 보다, 학습에 6개의 데이터를 쓰고 테스트에 4개의 데이터를 쓰는 등, 테스트 신뢰도를 높이기 위해 n 수를 적절히 조정

 
⑥ 머신러닝에서 일어나는 문제

  • 과(대)적합 (Overfitting) : 기계학습 모델이 너무 복잡; 모델이 학습 데이터에 너무 과하게 맞춰져서 학습 데이터에서는 잘 작동하지만, 새로운 데이터에서는 성능이 떨어짐
  • 과소적합 (Underfitting) : 기계학습 모델이 너무 단순; 모델이 데이터의 패턴을 충분히 학습하지 못하여 학습 데이터와 테스트 데이터 모두에서 성능이 떨어짐

과소적합, 적정, 과적합

 
⑦ 머신러닝 모델의 평가

  • 주어진 문제를 얼마나 잘 맞췄는가를 기준으로 평가
[대표적인 기계학습 평가항목]  * 맞춤여부(T/F) + 예측값(P/N) *참=양성, 거짓=음성

- TP(True Positive, 진양성) : 실제 참인 값을 참이라고 예측 
- TN(True Negative, 진음성) : 실제 거짓인 값을 거짓이라고 예측
- FP(False Positive, 위양성) : 실제 거짓인 값을 참이라고 예측
- FN(False Negative, 위음성) : 실제 참인 값을 거짓이라고 예측

- 정확도(Accuracy) : (TP+TN) / (TP+TN+FP+FN)  "전체 예측에서 맞춘 비율"
- 정밀도(Precision) : TP / (TP+FP)  "양성으로 예측한 것 중 실제 양성의 비율"
- 특이도(Specificity) : TN / (TN+FP)  "실제 음성 중에서 음성으로 정확히 예측한 비율"
- 민감도(Sensitivity, = 재현율 Recall) : TP / (TP+FN)  "실제 양성 중에서 양성으로 정확히 예측한 비율"

 
 

3) 사이킷런 (Scikit-learn)

  • 파이썬의 대표적인 머신러닝(학습, 밸리데이션, 테스트) 패키지
  • 주요 모델을 클래스로 구현해 놓음; 동일한 코드 입력 → 여러 모델 사용 가능
TIP> Class 란?
: 기능(method) & 속성(attribute)을 아우르는 집합체
용어 서열 특징
라이브러리 1 (최상위) 관련된 모듈과 패키지의 집합. 특정 목적을 가진 코드의 모음 NumPy, Pandas
패키지 2 여러 모듈을 포함하는 디렉토리. 모듈들을 그룹화하는 방법. 디렉토리 내에 __init__.py 파일이 필요 scipy, requests
모듈 3 Python 파일(.py)로서, 기능을 제공하는 코드 블록. 함수, 클래스, 변수 등이 포함됨 math, json
클래스
(camel case)
4 객체 지향 프로그래밍에서 사용되는 청사진. 객체를 생성하기 위한 틀을 제공 list, dict
메서드
(small case)
5 클래스 내에서 정의된 함수. 클래스의 인스턴스와 관련된 작업을 수행
list.append()
어트리뷰트 6 클래스나 객체의 데이터 속성. 객체가 가진 데이터 값 object.attribute
- Random Forest
- survival analysis
- 이미지 데이터를 이용한 ML
  • Random Forest 모델을 사용하여 지도학습 수행

 

4) RandomForestClassifier

  • Scikit-learn에서 제공하는 클래스
  • Random Forest 알고리즘을 사용하여 분류 문제를 해결하는 모델
  • Random Forest : 여러 개의 결정 트리(Decision Tree)를 결합하여 예측 성능을 높이는 앙상블 학습 방법 중 하나
  • Random Forest 작동 원리 : 결정트리를 컴퓨터가 랜덤하게 여러개 만듦 -> 각 tree의 예측 결과를 평균냄 → 최종 예측값 도출 (회귀 or 분류)
- 회귀 : 각 결정 트리의 예측 결과를 평균내어 최종 예측값을 도출
- 분류 : 각 결정 트리의 예측 결과를 다수결 방식으로 집계하여 최종 클래스를 결정

 
5) 데이터 전처리

  • 데이터 전처리 : 데이터를 분석 & 처리에 적합한 형태로 만드는 과정을 총칭
  • 클리닝 → 피처 엔지니어링 → 인코딩 → 스케일링
  • 개발자는 데이터 전처리에 약 80%의 시간 투자
  • 데이터 핸들링을 위한 라이브러리 : NumPy, pandas, sklearn
순서 데이터 전처리 단계 설명
1 클리닝 (Cleaning) 결측치, 이상치, 중복 데이터 제거, 불필요한 데이터 제거 등 데이터의 질을 높이는 단계
2 피처 엔지니어링 (Feature Engineering) 새로운 피처 생성, 기존 피처 변환 등으로 데이터의 정보를 강화하여 모델 성능을 향상시키는 단계
3 인코딩 (Encoding) 범주형 데이터를 수치형 데이터로 변환하는 단계 (예: One-Hot Encoding, Label Encoding)
4 스케일링 (Scaling) 피처들의 값을 일정한 범위로 변환하는 단계 (예: Standardization, Normalization)

 

① Data Cleaning (데이터 정제)

  • 데이터를 학습 모델에 입력할 수 있는 형태로 변환
- 결측치 처리: 데이터셋에서 누락된 값을 채우거나 제거
- 이상치 처리: 데이터셋에서 통계적으로 유의하지 않은 값이나 오류 데이터를 수정하거나 제거
- 중복 데이터 제거: 동일한 데이터가 여러 번 포함된 경우 이를 제거
- 불필요한 피처 제거: 분석에 불필요한 피처를 제거하여 모델의 성능 향상을 도모

 

② Feature Engineering (특징 공학)

  • 새로운 피처 생성 or 기존 피처를 변환
  • 모델이 데이터에서 더 유의미한 패턴을 학습할 수 있게함
  • 모델 정확도 ↑
- 새로운 feature 생성 : feature split, 파생변수 생성
- 유의미한 feature 선택 : 분석에 도움을 주는 feature 선택
- 데이터 분포 변환 : 로그/지수 변환

 

③ Encoding (인코딩)

  • 사람이 인지할 수 있는 언어/문자(범주형 데이터) → 컴퓨터가 이해할 수 있는 언어(수치형 데이터)
- Label Encoding : 범주형 데이터 → 고유한 정수 값 할당
    ex: "빨강", "초록", "파랑" 세 가지 범주 → "빨강" = 0, "초록" = 1, "파랑" = 2로 변환
- One-Hot Encoding : 범주형 데이터 → 이진 벡터(0 or 1)로 변환 "해당 카테고리에 속하는 경우 1, 아닌 경우 0"
    ex : "빨강", "초록", "파랑" 세 가지 범주 → "빨강" = [1, 0, 0], "초록" = [0, 1, 0], "파랑" = [0, 0, 1]로 변환

 

④ Scaling (스케일링)

  • 데이터의 범위/분포를 조정
- Standard Scaling : 데이터가 평균 0, 분산 1 인 정규분포를 나타내도록 스케일링
- Minmax Scaling : 데이터를 0 ~ 1 사이의 값으로 축소 (최솟값 0, 최댓값 1)

 

6) 교차검증 (Cross Validation)

  • 학습중인 모델의 성능을 교차 평가; 고정된 Validation 데이터셋에만 과적합 되지 않게함

① K-fold Cross Validation

  • 학습 데이터셋을 K개의 부분집합(fold)으로 무작위 분할 → 학습 K번 반복
  • 매 학습시 하나의 fold를 선택해 검증 데이터셋으로 사용. 매번 다른 fold가 사용됨
  • 최종평가는 K번 평가 결과의 평균값을 활용

② Scattered K-fold Cross Protection

  • K-fold가 원본 데이터셋's 레이블 분포를 학습 데이터셋에 제대로 분배하지 못하는 문제를 해결
  • 각 fold의 학습 데이터셋/검증 데이터셋의 레이블 분포가 유사하도록 할당

7) 모델 하이퍼파라미터 탐색

  • 하이퍼파라미터(Hyperparameter) : 최적의 학습 모델을 구현하기 위해 모델에 설정하는 변수 (학습률, 배치사이즈, 학습반복횟수(Epoch수), ...)
  • 하이퍼파라미터 탐색 방법
- 격자 탐색 : 모델 하이퍼파라미터에 넣을 수 있는 값들을 순차적으로 모두 입력 → 가장 높은 성능을 보이는 하이퍼파라미터 조합을 찾음
- 랜덤 탐색 : 임의의 하이퍼파라미터를 선정하는 과정(랜덤)을 통해 최적해를 찾아가는 방법

 

8) 데이터 샘플링

  • Imbalanced Data(불균형 데이터) : 편향된 클래스(label)비율이 포함된 분류 데이터 

① Under Sampling

  • 다수 클래스의 샘플 수를 랜덤하게 제거 → 클래스 간 불균형 해결
  • [단점] 중요한 정보나 패턴이 손실될 수 있음

② Over Sampling Better!

  • 소수 클래스의 샘플 수를 증가(복제 or 생성) → 클래스 간 불균형 해결
  • [장점] 데이터의 원본 정보 보존/모델 성능 향상(소수 클래스의 데이터가 증가 → 모델이 소수 클래스의 특성을 더 잘 학습할 수 있음)
  • [단점] 소수 클래스의 샘플을 단순히 복제하면, 모델이 소수 클래스의 샘플에 과적합할 수 있음
* SMOTE(Synthetic Minority Over-sampling Technique)
- 오버샘플링 기법 중 하나; 소수 클래스에 새로운 샘플을 생성(복제X)
- k-NN (k-Nearest Neighbors) 알고리즘을 기반으로 함

 

 

 

📘 실습

  • 머신러닝 맛보기
RandomForestClassifier 머신러닝 모델로 유전자 발현 분류
import pandas as pd

# 패키지(sklearn)의 모듈(ensemble)의 클래스(RandomForestClassifier)를 호출
# ensemble 모듈 : 앙상블(ensemble) 학습 방법을 구현한 모듈. 앙상블 학습은 여러 개의 결정 트리를 결합하여 하나의 강력한 예측 모델을 만드는 기법
# RandomForestClassifier : 앙상블 학습 알고리즘 중 하나로, 분류(대상이 속하는 범주를 식별) 작업에 사용
from sklearn.ensemble import RandomForestClassifier

import random
import numpy as np
import seaborn as sns

# sep='\t' : 열(column)을 구분하는 구분자(seperator)를 지정 (데이터 파일이 탭(tab)으로 구분되어 있다는 것을 의미. 즉, 열과 열 사이의 구분이 탭 문자로 이루어져 있을 때 사용)
# .json : 구분x. 구조화된 데이터(키-값 쌍으로 이루어진 딕셔너리 형태) / .csv : 쉼표로 구분 / .tsv : 탭으로 구분
# comment='#' : 주석(comment)으로 처리할 문자열을 지정 (파일에서 #로 시작하는 모든 줄을 주석으로 처리하고, 이를 무시하여 데이터를 읽지 않도록 함)
# index_col=1 : 데이터프레임에서 사용할 인덱스(index)로 사용할 열(column)을 지정(두 번째 열 'column 1 = GENE NAME'을 데이터프레임의 인덱스로 사용하겠다)
ara = pd.read_csv(
    "Data/E-GEOD-38612-query-results.tpms.tsv", sep="\t", comment="#", index_col=1
)
# Gene ID 라는 열(axis=1)을 삭제; 이미 앞에서 행으로 지정했기 때문
ara.drop("Gene ID", axis=1, inplace=True)

# ara 데이터의 NaN 값을 zero-fill 하기
print(ara.isnull().sum())  # 컬럼별로 결측치가 얼마나 있는지
ara.fillna(0, inplace=True)
print(ara.isnull().sum())  # 결측치 처리 결과 확인

# ara 데이터의 value를 x변수로 설정. 이때, X는 numpy array 자료형으로 하기. 데이터는 transform(열:양방향_화살표:행) 하기
# X : training data ('RNA')
# transform 수행 → ara 데이터에서 value만 추출하여 X 변수로 설정; numpy array 데이터
X = ara.T.values
print(type(X))  # 이미 numpy 배열임
print(ara)

# y : label data (기관 'leaf, flower, fruit, root' 을 라벨링 함)
y = [1, 2, 3, 4]

# RandomForestClassifier 사용법 : 1) 클래스 초기화 2) fit 3) predict (transform)
# 1) 클래스 초기화 : 객체가 생성될 때 그 객체가 가져야 할 초기 상태를 지정. __init__ 메서드를 사용. 객체가 생성될 때 __init__ 메서드가 자동으로 호출되어 객체의 속성을 설정
# 초기화 : 클래스를 내가 만들때 그 클래스 에 포함시키고 싶은 함수를 지정해줄 때 해줘야 함. 따라서 이미 있는 RandomForestClassfier 는 따로 초기화해줄 필요 x
"""
class RandomForestClassifier:
    def __init__(self, n_estimators, random_state):
        self.n_estimators = n_estimators
        self.random_state = random_state
"""

# 1~6까지의 랜덤값을 출력해보기
# random.seed() : 랜덤 생성기의 초기값을 설정하여 랜덤 생성의 일관성을 보장. 괄호 안에 3을 넣든 뭐를 넣든 라벨링 처럼 그 값에 해당하는 랜덤값이 항상 일정하게 나옴
# random.randint(1, 6) : 1부터 6까지의 정수 중 하나를 무작위로 반환하는 함수. seed 값을 미리 설정하면 같은 seed 값을 사용할 때마다 동일한 랜덤 값을 생성할 수 있음(재현성)
random.seed(12345)
random.randint(1, 6)

# 객체 rfc 생성
# n_estimators : 랜덤 포레스트 모델에서 생성할 결정 트리의 수
# random_state : 랜덤 생성기의 시드를 설정하여 결과의 재현성을 보장 (random.seed 와 같은 기능)
rfc = RandomForestClassifier(n_estimators=2000, random_state=12345)

# 객체 rfc는 클래스 RandomForestClassifier의 메서드 fit()을 상속받아 사용할 수 있게 됨
# fit() : 입력 데이터(X)와 정답 레이블(y)을 사용해 모델을 학습시킴
"""
fit() : 2차원 배열이나 데이터프레임을 입력으로 받음
    X: 입력 데이터(features). 보통 2차원 배열 형태로 제공되며, 각 행은 하나의 샘플을 나타내고, 각 열은 샘플의 특징(피처)을 나타냄
    y: 타겟 값(labels). 보통 1차원 배열로 제공되며, 각 값은 해당 샘플의 정답 레이블을 나타냄
"""
rfc.fit(X, y)

arr = np.array([4, 11, 3, 39])
# 1D numpy array (arr) → 2D numpy array 로 바꾸기
"""
reshape() : Numpy 배열의 형태(차원)를 변경. 배열의 원소 수는 유지하면서 원하는 형태로 배열을 재구성
-1 : Numpy에게 자동으로 차원의 크기를 계산하도록 지시하는 특별한 값
    ex : 배열의 전체 원소 수가 6이라면, arr.reshape(-1, 2)는 배열을 2열로 구성된 배열로 바꾸되, 행의 수는 자동으로 계산(-1)하게 함
"""
arr.reshape(-1, 1)

# predict() : 머신러닝 모델에서 예측을 수행하는 데 사용하는 메서드. 훈련된 모델을 사용하여 새로운 데이터에 대해 예측을 생성
# predict() : 2D numpy array 로 바꾼 후 predict 해줘야 함
"""
1차원 배열: 리스트의 기본적인 형태로, 단일 차원에서 원소를 나열한 것. 예: [1, 2, 3]
2차원 배열: 리스트의 리스트 형태로, 각 원소가 또 다른 리스트. 이는 행과 열로 구성된 테이블 구조와 유사. 예: [[1, 2, 3], [4, 5, 6]]
"""
# X[1] : 배열에서 두번째 행
# [X[1]] : X[1]을 하나의 행을 가진 2차원 배열로 변환
print(X[1])
print([X[1]])
# predict([X[1]]) : X 데이터셋에서 두 번째 행에 대해 모델 rfc가 예측한 클래스 레이블을 반환. 이 예측 값은 모델이 학습한 결과에 따라 결정되며, 결과는 예측된 클래스(예: 0, 1, 2 등)를 나타냄
rfc.predict([X[1]])

# 0으로나온것 : 분류에 영향을 미친값이 아님
rfc.feature_importances_

# 분류에 영향을 미친 값들을 변수 m 에 저장
m = rfc.feature_importances_ > 0
fi = ara.index[m]

ara_fi = ara.index[m]
arabidopsis_fi = ara.loc[fi]

sns.clustermap(arabidopsis_fi, standard_scale=0)
  • 실행 결과

 

 

📙 내일 일정

  • 분류, 회귀 학습