Data Sampling
- 단순 무작위 sampling
import numpy as npimport pandas as pd
# 임의의 데이터 생성data = pd.DataFrame({'id': range(1, 101), # 1부터 100까지의 id'value': np.random.rand(100) # 임의의 값})
# 단순 무작위 샘플링으로 10개의 샘플 선택sample_random = data.sample(n=10)print(sample_random) - 계통 sampling
# 계통 샘플링을 위한 간격(k) 계산k = len(data) // 10 # 예를 들어, 전체 데이터에서 10개의 샘플을 선택하고자 할 때의 간격
# 시작점을 무작위로 선택start = np.random.randint(0, k)
# 계통 샘플링 실행sample_systematic = data.iloc[start::k]print(sample_systematic) - 층화 sampling
from sklearn.model_selection import StratifiedShuffleSplit
# 층 변수 생성# 데이터 프레임 data에 새로운 열 strata를 추가# 'value' 컬럼의 값에 따라 데이터를 두 개의 층으로 나누는 것으로 가정# 수행의 단순화를 위해 'value'가 중앙값 이상이면 1, 미만이면 0으로 층을 나눔data['strata'] = np.where(data['value'] >= data['value'].median(), 1, 0)
# StratifiedShuffleSplit 객체를 생성# n_splits=1은 한 번만 데이터를 분할하고,# test_size=10은 테스트 세트의 크기를 10으로 설정.# random_state=0은 결과를 재현 가능하게 합니다.sss = StratifiedShuffleSplit(n_splits=1, test_size=10, random_state=0)
# sss.split(data, data['strata']) 메서드를 사용하여 data를 층화 샘플링# data.iloc[test_index]를 사용하여 테스트 세트의 샘플을 sample_stratified에 저장
for train_index, test_index in sss.split(data, data['strata']):sample_stratified = data.iloc[test_index]
print(sample_stratified) - 군집 sampling
import pandas as pdimport numpy as np
# 가상의 데이터 생성np.random.seed(0) # 재현 가능한 결과를 위한 시드 설정data = pd.DataFrame({'id': range(1, 101),'value': np.random.rand(100),'cluster': np.random.choice(['A', 'B', 'C', 'D', 'E'], 100) # 군집 A, B, C, D, E 중 하나를 무작위로 할당})
# 군집별로 데이터 확인print(data['cluster'].value_counts())
# 군집 선택: ex 무작위로 2개의 군집을 선택selected_clusters = np.random.choice(['A', 'B', 'C', 'D', 'E'], 2, replace=False)print("Selected Clusters:", selected_clusters)
# 선택된 군집의 데이터만 추출sampled_data = data[data['cluster'].isin(selected_clusters)]print(sampled_data) - Sampling에서 가장 중요한 것: 무작위성 (의도가 담기지 않은 sorting)
Data Preparation
- EDA가 이 step에 속함
- raw data (엉망)을 modeling에 적합한 형태로 만드는 과정
- 아무리 좋은 modeling을 해서 분석을 해도 애초에 data가 안좋으면 좋은 결과가 나오기 어려움
- 데이터 분석에서 가장 오래걸리고 중요한 과정
- modeling해서 결과가 좋지않을 때 실패가 아니라, 어떤 요소들이 결과에 큰 의미가 없다는 것을 도출하는 것에도 의미가 있음.
- 전처리의 최대 목적: x, y 변수 setting이 잘 되야함
- 전처리의 다양한 기법 정리
- 결측치 처리: 데이터에서 빠진 값이 있을 경우, 해당 값을 대체/삭체하여 데이터의 일관성 유지
- 이상치 처리: 데이터에서 이상한 값이 있을 경우, 해당 값을 대체하거나 삭제하여 분석 결과에 영향을 미치는 오류를 방지
- 데이터 정규화(Scaling): 서로 다른 스케일의 데이터를 비교 분석하기 위해 데이터 값을 일정한 범위로 조정
- 데이터 인코딩: 텍스트 데이터를 컴퓨터가 이해할 수 있는 형태로 변환 (e.g. 원-핫 인코딩)
- 데이터 통합: 여러 개의 데이터를 하나의 데이터로 통합하여 분석에 용이하게 함
- 데이터 분할: 분석에 필요한 부분 데이터를 추출하여, 불필요한 데이터를 제거
- 데이터 정렬: 분석에 필요한 순서대로 데이터를 정렬
- 데이터 그룹화: 데이터를 그룹별로 분류하고, 각 그룹에 대한 통계 정보를 추출
- 데이터 변환 함수: apply, map, applymap 등의 함수를 사용하여 데이터 값을 변환
- 데이터 피벗: pivot_table 함수를 사용하여 행과 열을 바꾸거나 그룹별 집계 정보를 표현
- 데이터 병합: merge 함수를 사용하여, 여러 개의 데이터를 하나로 병합
- 데이터 분할: split 함수를 사용하여 데이터를 분할하고 분할된 데이터를 분석
- 데이터 샘플링: sample 함수를 사용하여 샘플 데이터를 추출하고 추출된 데이터를 분석
- 데이터 집계: 집계 함수를 사용하여 그룹별 집계 정보를 추출
- 데이터 시각화: matplotlib, seaborn 등의 시각화 라이브러리를 사용하여 데이터를 시각화하고 분석 결과를 쉽게 이해할 수 있게 함
- 순서
- 데이터를 로드
- 데이터 파악(Data discovery and profiling)
- head(), tail(), info(), describe()를 이용해 데이터를 이해하기
- 다양하게 시각화(Data discovery and profiling)
- 막대형 차트
- 히스토그램
- scatter plot
- 원형차트
- 지도 - Folum 등
- 결측 치를 처리(Data cleasing)
- 결측 확인 : isnull, isna
- 결측 처리 : dropna, fillna
- 이상치를 처리(Data cleasing)
- df.value_count(), sort_index 이용
- 제거 or 대체
- 정규화(Normalization, Scaling)
- 인코딩(Data structuring)
- 범주형 데이터 처리를 위한 전처리 기법 중 하나
- 범주형 변수의 각 범주(카테고리)를 새로운 dummy 변수로 변환하여,각 범주를 0과 1의 이진 값으로 표현
- 카테고리 면에서 유용한 모델: 선형 모델, SVM, 신경망, 군집화 알고리즘
- 데이터 변형 및 다양화(Data transformation and enrichment)
- 데이터의 통합, 분할, 정렬, 그룹화, 샘플링, 파생 변수를 이용
Mining Algorism
(Data mining > machine learning mining 중 model 학습이기에 machine learning이라 해도 무방)
- Machine learning models
- Neural Networks models
- 개념
- 머신러닝 모델(Machine Learning Model)
- 데이터로부터 학습할 수 있는 능력을 가진 머신러닝 모델의 한 종류
- 지도 학습, 비지도 학습, 강화 학습 등 다양한 학습 방식 지원
- 딥러닝 아키텍처(Deep Learning Architecture)
- 다층 퍼셉트론(Multilayer Perceptrons, MLP)이나 심층 신경망(Deep Neural Networks, DNN)과 같이
여러 층으로 구성된 신경망
- 다층 퍼셉트론(Multilayer Perceptrons, MLP)이나 심층 신경망(Deep Neural Networks, DNN)과 같이
- 인공지능(AI) 기술
- 인공지능 연구와 응용의 핵심 요소 중 하나로, 인공지능을 구현하는 기술
- 계산 모델(Computational Model)
- 입력에서 출력으로의 매핑을 학습하는 계산 모델
- 데이터의 복잡한 관계의 모델링 및 예측에 사용
- 머신러닝 모델(Machine Learning Model)
- K-fold cross validation(K겹 교차검증)
- k개의 fold를 만들어서 데이터를 교차롤 분할해 검증하는 방법
- Training data를 K개로 분할한다.
- K-1개는 Training data로 1개는 validation data로 지정한다.
- 모델을 학습 -> predict -> loss 측정
- 다음 fold에서 validation set를 바꿔서 정한다.
- K번 반복한다.
- k개의 fold를 만들어서 데이터를 교차롤 분할해 검증하는 방법
- Unsupervised learning의 Clustering
- k 의미: clustering의 개수
- Clustering으로 끝나는 것이 아니라 clustering 후에 어떻게 활용할 것인지가 중요
- 데이터의 유사성을 기반으로 2차원에 군집화하여 나타낸 것
- 이미지 데이터
: 각 이미지는 보통 고차원의 벡터로 표현됩니다. 예를 들어, 픽셀 값이나 신경망을 사용해 추출한 특징 등이 포함될 수 있습니다. - 유사성 측정
: 이미지 간의 유사성은 고차원 공간에서 어떤 거리 척도(예: 유클리드 거리, 코사인 유사도 등)를 사용하여 측정합니다. - 차원 축소
: t-SNE, PCA, UMAP 같은 차원 축소 기법을 사용해 고차원의 데이터를 2차원으로 줄입니다. 이 과정에서 데이터 포인트 간의 상대적 거리를 최대한 보존하려고 합니다. - 군집화
: 축소된 2차원 공간에서 유사한 특징을 가진 이미지들은 서로 가깝게 위치하게 되어 자연스럽게 군집을 형성합니다. - 시각화
: 최종적으로 2차원으로 변환된 데이터를 플롯으로 나타냅니다. 이 플롯에서 각 점은 하나의 이미지를 나타내며, 비슷한 이미지들끼리 모여 있는 군집을 통해 데이터의 패턴과 관계를 쉽게 파악할 수 있습니다
- 이미지 데이터
- K-Nearest Neighbor Classifier(KNN)
- 주변(이웃)에서 더 많은 데이터가 포함되어있는 범주로 분류하는 방식
- k 의미: 주변 데이터 개수
- Distance 계산 방법(유사도의 기준)
- Manhattan distance - Euclidean distance - e.g. 녹색만 Eucliden disatance, 나머지 모두 Manhattan distance - vector화 -> 무엇을 또 vector화할 수 있을 것인가?
- 이미지, 숫자 data는 이미 수치화되어있어서 그대로 사용
- Text는 embedding vector화 해야함
e.g. 음성, text, image 외.. - Coding (Iris data)
# 패키지 임폴트from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import classification_report, accuracy_score# 데이터 로드iris = load_iris()X = iris.data # 특성 데이터y = iris.target # 타겟 레이블
# 훈련 데이터와 테스트 데이터 분할# random_state를 지정해줘서 고정값을 주고 재현성 확보를 함, test 20%를 뽑을 때 무작위성에 기준을 주기위함 (숫자는 임의의 값을 넣으면 됨)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# k-NN 분류기 생성# k의 개수를 3으로 지정(거리 기준으로 가장 가까운 3개의 data point를 확보하여 clustering을 만들겠다)knn = KNeighborsClassifier(n_neighbors=3)
# 모델 훈련knn.fit(X_train, y_train)# 테스트 데이터에 대한 예측predictions = knn.predict(X_test)
# 성능 평가print("Accuracy:", accuracy_score(y_test, predictions))print("\nClassification Report:\n", classification_report(y_test, predictions)
- Quiz
k의 개수에 따라 accuracy를 보여주는 coding
Model Evaluation
- Accuracy
- 전체 예측한 것 중 올바른 예측의 비율
- Precision
- Positive로 예측한 것 중 실제로 맞춘 비율
e.g. 환자로 예측한 전체 사례 중 실제 환자의 비율
- Positive로 예측한 것 중 실제로 맞춘 비율
- Sensitivity(Recall, 재현율)
- Positive를 얼마나 잘 예측했는지를 나타내는 지표(실제 긍정 사례 전체 중 모델에 의해 올바르게 맞춘 비율)
- Specificity
- Negative를 얼마나 잘 예측했는지를 나타내는 지표
- F1 score
- 불균형 데이터의 분류문제에서의 평가척도로 사용 (f1 score가 1에 가깝다 = 정밀도, 재현율 모두 높다)
- 정밀도와 민감도의 조화 평균. 낮은 값에 더 많은 가중치를 부여
- 데이터가 불균형한 상태에서 accuracy로 성능을 평가하기엔 데이터 편향성이 나타나 성능 척도로 사용하기에는 부적합
- 거짓양성과 거짓음성의 중요성 사이의 균형을 유지해야 하는 경우 사용
- Model Evaluation 기록
- 실패 data는 없다. 매 결과에 대한 hyper parameter, 변수 등을 모두 기록하며 분석하기
'TIL(2024y) > Machine learning' 카테고리의 다른 글
24.06.10 Review (Summary/ Linear Regression with Pytorch) (0) | 2024.06.11 |
---|---|
24.05.28 Ensemble model (Bagging/ Random tree) (0) | 2024.05.28 |
24.05.27 알고리즘 개념(Decision Tree) (0) | 2024.05.28 |
24.05.24 통계 / scaling / data split (0) | 2024.05.26 |
24.05.23 데이터 시각화 (0) | 2024.05.23 |