[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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)
- 실행 결과
📙 내일 일정
- 분류, 회귀 학습
'TIL _Today I Learned > 2024.08' 카테고리의 다른 글
[DAY 28] 회귀 / 차원축소 / 클러스터링 (0) | 2024.08.21 |
---|---|
[DAY 27] 분류 / 회귀 모델 (0) | 2024.08.20 |
[DAY 25] Django 웹 애플리케이션 개발, 웹 크롤링 (0) | 2024.08.14 |
[DAY 24] Django 웹 애플리케이션 개발 (0) | 2024.08.13 |
[DAY 23] Django 웹 애플리케이션 개발 (0) | 2024.08.12 |