Programming/AI & ML

[OUTTA Alpha팀 Medical AI& 3D Vision 스터디] 기초 및 심화 머신러닝 1

YeonJuJeon 2024. 12. 29. 18:35

4. Iris 데이터셋

from sklearn.model_selection import train_test_split

# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

 

  • train_test_split:
    • 데이터를 훈련(train)과 테스트(test)로 분리.
    • test_size: 테스트 데이터 비율(0.2 = 20%).
    • stratify=y: 클래스 비율을 고르게 유지(필수!).
    • random_state=42: 실행마다 동일한 결과를 보장.
  • 암기 포인트:
    • train_test_split의 매개변수.
    • stratify는 반드시 사용하여 데이터 분포가 유지되도록 설정.

5. 타이타닉 데이터

결측치 처리:

from sklearn.impute import SimpleImputer

# imputer 객체 생성 (최빈값 사용)
imputer = SimpleImputer(strategy='most_frequent')

# fit: 결측치 처리 기준 학습, transform: 실제 처리
X_imputed = imputer.fit_transform(X)
  • SimpleImputer의 strategy 옵션:
    • mean: 평균값 대체.
    • median: 중앙값 대체.
    • most_frequent: 최빈값 대체.
  • fit_transform: 학습과 적용을 한 번에 실행.

Null 값 직접 처리:

# 결측치를 0으로 대체
df['column_name'].fillna(0, inplace=True)
  • fillna(값): 결측치 대체.
  • inplace=True: 원본 데이터 직접 수정.

6. 정규화(Normalization):

from sklearn.preprocessing import MinMaxScaler

# 정규화 객체 생성
scaler = MinMaxScaler()

# 데이터를 0~1로 변환
normalized_data = scaler.fit_transform(data)
  • 정규화는 데이터 범위를 0~1로 스케일링.
  • MinMaxScaler:
    • 데이터를 최소값 0, 최대값 1로 변환.
    • 예제:
movie = {'naver': [2, 4, 6, 8, 10], 'netflix': [1, 2, 3, 4, 5]}

 

cf. 정규화와 규제의 차이:

  • 정규화(Normalization):
    • 데이터 스케일을 조정.
  • 규제(Regularization):
    • 모델 학습 시 가중치(weight)에 제약을 추가해 과적합 방지.
    • L1 규제: LASSO(마름모 모양).
    • L2 규제: Ridge(원 모양).
특성 Ridge Lasso
정규화 유형 L2(제곱합) L1(절댓값 합)
가중치 작게 만듦. 일부 가중치를 0으로 설정.
특성 선택 상관관계 높은 특성 유지 상관 관계 높은 특성 중 일부 선택
사용 사례 모든 특성 사용 중요한 특성만 사용
수식 $Penalty(w) = \|w\|_2^2 = \sum_{i=1}^n w_i^2$  $Penalty(w) = \|w\|_1 = \sum_{i=1}^n |w_i|$

 


7. 표준편차(Standard Deviation)

1. 표준편차의 정의

    • : 표준편차.
    • $x_i$: 각 데이터 값.
    • $\bar{x}$: 데이터의 평균.
    • : 데이터의 개수.
      • 설명:
        • 표준편차는 분산의 제곱근으로 정의되며, 분산은 데이터가 평균으로부터 떨어진 정도를 제곱해 평균을 구한 값.
        • 표준편차가 작을수록 데이터가 평균값 주변에 모여 있음.
        • 표준편차가 클수록 데이터의 흩어짐이 큼.

2. 표준편차 계산 예제

      • 데이터: [50, 80, 100, 40, 70]

1) 평균 계산:

$$\bar{x} = \frac{\sum_{i=1}^{N} x_i}{N} = \frac{50 + 80 + 100 + 40 + 70}{5} = 68$$

2) 분산 계산:

분산=$$\text{분산} = \frac{\sum_{i=1}^{N} (x_i - \bar{x})^2}{N} = \frac{(50-68)^2 + (80-68)^2 + (100-68)^2 + (40-68)^2 + (70-68)^2}{5}$$

$$\text{분산} = \frac{324 + 144 + 1024 + 784 + 4}{5} = 456$$

3) 표준편차 계산:

$$\sigma = \sqrt{\text{분산}} = \sqrt{456} \approx 21.37$$

3. 코드 상세 설명

1. 데이터 입력 및 정렬:

score.sort()
print(f"최솟값: {score[0]}, 최댓값: {score[-1]}")
  • 사용자로부터 데이터를 입력받아 리스트에 저장.
  • 입력된 데이터를 오름차순으로 정렬하여 최솟값과 최댓값 확인.

2. 최댓값/최솟값 제외 평균 계산:

 

슬라이싱으로 최솟값과 최댓값 제거:

filtered_score = score[1:-1]

 

평균 계산:

mean = sum(filtered_score) / len(filtered_score)

 

3. 분산 계산:

variance = sum((x - mean) ** 2 for x in filtered_score) / len(filtered_score)

 

4. 표준편차 계산:

분산의 제곱근으로 표준편차 계산:

std_dev = math.sqrt(variance)

 

4. 주의할 점

  • 입력 데이터가 너무 적으면 최댓값/최솟값 제외 시 계산이 어려울 수 있음 → 최소 3개 이상의 데이터 필요.
  • 데이터 타입이 정수인지 확인 → 입력값이 숫자인지 체크 필요.

5. 확장 개념

  • 평균과 표준편차를 활용한 이상치 탐지:
    • 이상치 기준: $\bar{x} \pm 2\sigma$ 범위를 벗어나는 데이터.
lower_bound = mean - 2 * std_dev
upper_bound = mean + 2 * std_dev
outliers = [x for x in score if x < lower_bound or x > upper_bound]
print(f"이상치: {outliers}")

8. 가상쇼핑몰 데이터

데이터 전처리:

  • Null 값 제거: pd.notnull().
  • 조건 필터링: df[df['column'] > 0].
# Null 제거
retail = retail[pd.notnull(retail['CustomerID'])]

# 수량과 가격이 0보다 큰 데이터만 사용
retail = retail[retail['Quantity'] > 0]
retail = retail[retail['UnitPrice'] > 0]

# 새로운 컬럼 추가
retail['CheckoutPrice'] = retail['Quantity'] * retail['UnitPrice']

 

매출 분석:

  • groupby로 특정 컬럼 기준으로 데이터를 집계.
# 전체 매출
total_revenue = retail['CheckoutPrice'].sum()

# 국가별 매출
rev_by_countries = retail.groupby('Country')['CheckoutPrice'].sum()

9. 텐서플로우와 케라스

import tensorflow as tf
from tensorflow import keras

# 버전 확인
print(tf.__version__, keras.__version__)
  • 텐서플로우와 케라스는 딥러닝 개발의 핵심 라이브러리.

Tensor 생성:

# Tensor 생성
x = tf.constant([[1.0, 2.0], [3.0, 4.0]])
print(x)
  • tf.constant: 상수 텐서 생성.
  • 텐서는 다차원 배열로 표현됨.

속성 변경:

tensor = tf.random.normal((3, 4))
tensor = tf.reshape(tensor, (4, 3))  # 차원 재구성
tensor = tf.cast(tensor, tf.int32)  # 데이터 타입 변경

 

  • Tensor 생성/변환:
    • tf.constant(), tf.convert_to_tensor() 사용.
    • 텐서를 Numpy 배열로 변환 시 .numpy().
  • 속성 확인 및 변경:
    • tensor.shape, tensor.dtype 확인.
    • tf.reshape(), tf.cast()로 변경.
  • Variable:
    • tf.Variable() 생성.
    • 값 변경: assign(), assign_add(), assign_sub().
  • 연산:
  •  
    • 기본: tf.add(), tf.multiply(), tf.matmul().
    • 축별 합계: tf.reduce_sum(tensor, axis=0).
      • 0축 (axis=0): 행(Row) 방향.
        • 데이터가 세로로 쌓이는 방향.
        • axis=0은 열(Column)끼리 연산을 수행.
      • 1축 (axis=1): 열(Column) 방향.
        • 데이터가 가로로 쌓이는 방향.
        • axis=1은 행(Row)끼리 연산을 수행.
      • 2축 이상 (axis=2, axis=3):
        • 3차원 이상의 배열에서 축의 순서에 따라 연산 방향이 결정됨.
      • (axis=-1):
        • 마지막 축 기준 연산.

  • 생성 함수:
    • 1/0 채우기: tf.ones(), tf.zeros().
    • 랜덤 값: tf.random.uniform(), tf.random.normal().