본문 바로가기

TIL/Machine learning

24.06.11 Review (Sampling/Preparation/K-NN/Model Evaluation)

Data Sampling 

  • 단순 무작위 sampling
    import numpy as np
    import 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 pd
    import 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 등의 시각화 라이브러리를 사용하여 데이터를 시각화하고 분석 결과를 쉽게 이해할 수 있게 함
  • 순서
    1. 데이터를 로드
    2. 데이터 파악(Data discovery and profiling)
      • head(), tail(), info(), describe()를 이용해 데이터를 이해하기
    3. 다양하게 시각화(Data discovery and profiling)
      • 막대형 차트
      • 히스토그램
      • scatter plot
      • 원형차트
      • 지도 - Folum 등
    4. 결측 치를 처리(Data cleasing)
      • 결측 확인 : isnull, isna
      • 결측 처리 : dropna, fillna
    5. 이상치를 처리(Data cleasing)
      • df.value_count(), sort_index 이용
      • 제거 or 대체 
    6. 정규화(Normalization, Scaling)
    7. 인코딩(Data structuring)
      • 범주형 데이터 처리를 위한 전처리 기법 중 하나
      • 범주형 변수의 각 범주(카테고리)를 새로운 dummy 변수로 변환하여,각 범주를 0과 1의 이진 값으로 표현
      • 카테고리 면에서 유용한 모델: 선형 모델, SVM, 신경망, 군집화 알고리즘 
    8. 데이터 변형 및 다양화(Data transformation and enrichment)
      • 데이터의 통합, 분할, 정렬, 그룹화, 샘플링, 파생 변수를 이용

Mining Algorism 

(Data mining > machine learning mining 중 model 학습이기에 machine learning이라 해도 무방) 

  • Machine learning models
  • Neural Networks models

  • 개념
    1. 머신러닝 모델(Machine Learning Model)
      • 데이터로부터 학습할 수 있는 능력을 가진 머신러닝 모델의 한 종류
      • 지도 학습, 비지도 학습, 강화 학습 등 다양한 학습 방식 지원
    2. 딥러닝 아키텍처(Deep Learning Architecture)
      • 다층 퍼셉트론(Multilayer Perceptrons, MLP)이나 심층 신경망(Deep Neural Networks, DNN)과 같이
        여러 층으로 구성된 신경망
    3. 인공지능(AI) 기술
      • 인공지능 연구와 응용의 핵심 요소 중 하나로, 인공지능을 구현하는 기술
    4. 계산 모델(Computational Model)
      • 입력에서 출력으로의 매핑을 학습하는 계산 모델
      • 데이터의 복잡한 관계의 모델링 및 예측에 사용
  • K-fold cross validation(K겹 교차검증)
    • k개의 fold를 만들어서 데이터를 교차롤 분할해 검증하는 방법
      1. Training data를 K개로 분할한다.
      2. K-1개는 Training data로 1개는 validation data로 지정한다.
      3. 모델을 학습 -> predict -> loss 측정
      4. 다음 fold에서 validation set를 바꿔서 정한다.
      5. K번 반복한다.
  • Unsupervised learning의 Clustering
    • k 의미: clustering의 개수
    • Clustering으로 끝나는 것이 아니라 clustering 후에 어떻게 활용할 것인지가 중요
    • 데이터의 유사성을 기반으로 2차원에 군집화하여 나타낸 것 
      1. 이미지 데이터
        : 각 이미지는 보통 고차원의 벡터로 표현됩니다. 예를 들어, 픽셀 값이나 신경망을 사용해 추출한 특징 등이 포함될 수 있습니다.
      2. 유사성 측정
        : 이미지 간의 유사성은 고차원 공간에서 어떤 거리 척도(예: 유클리드 거리, 코사인 유사도 등)를 사용하여 측정합니다.
      3. 차원 축소
        : t-SNE, PCA, UMAP 같은 차원 축소 기법을 사용해 고차원의 데이터를 2차원으로 줄입니다. 이 과정에서 데이터 포인트 간의 상대적 거리를 최대한 보존하려고 합니다.
      4. 군집화
        : 축소된 2차원 공간에서 유사한 특징을 가진 이미지들은 서로 가깝게 위치하게 되어 자연스럽게 군집을 형성합니다.
      5. 시각화
        : 최종적으로 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_iris
      from sklearn.model_selection import train_test_split
      from sklearn.neighbors import KNeighborsClassifier
      from 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. 환자로 예측한 전체 사례 중 실제 환자의 비율 

  • Sensitivity(Recall, 재현율)
    • Positive를 얼마나 잘 예측했는지를 나타내는 지표(실제 긍정 사례 전체 중 모델에 의해 올바르게 맞춘 비율)

  • Specificity
    • Negative를 얼마나 잘 예측했는지를 나타내는 지표

  • F1 score
    • 불균형 데이터의 분류문제에서의 평가척도로 사용 (f1 score가 1에 가깝다 = 정밀도, 재현율 모두 높다)
    • 정밀도와 민감도의 조화 평균. 낮은 값에 더 많은 가중치를 부여
    • 데이터가 불균형한 상태에서 accuracy로 성능을 평가하기엔 데이터 편향성이 나타나 성능 척도로 사용하기에는 부적합
    • 거짓양성과 거짓음성의 중요성 사이의 균형을 유지해야 하는 경우 사용

  • Model Evaluation 기록
    • 실패 data는 없다. 매 결과에 대한 hyper parameter, 변수 등을 모두 기록하며 분석하기