카테고리 없음

내일배움캠프_[머신러닝]2회차 수업

iron-min 2025. 10. 24. 20:56

1. 오늘 배운 것

1) 인코딩 : 머신러닝을 할때 범주 또는 이름으로 분류되는 데이터를 숫자로 바꿔줘야 합니다.

 

방법 .1 OneHotEncoding : 순서가 없는 범주형 변수를 다룰 때 가장 안전하고 효과적인 방법입니다.

- 성별, 혈액형처럼 순서가 없는 범주형 변수에 사용

- 범주의 개수가 너무 많지 않을 때 사용 ex) A~Z

- 각 범주를 새로운 열로 만들어 0과 1로 표시   예) 혈액형(A, B, O) → A열(1,0,0), B열(0,1,0), O열(0,0,1)

 

예제)

# 1. 샘플 데이터프레임 생성
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'blood_type': ['A', 'B', 'O', 'AB']
})

print("원본 데이터:")
print(df)

원본 데이터

 

# 2. One-Hot Encoding 적용
df_encoded = pd.get_dummies(df, columns=['blood_type'])
print("\nOne-Hot Encoding 결과:")
print(df_encoded)

get_dumies(데이터, 분류할 컬럼) 이런식으로 써주면 됩니다.

One-Hot Encoding 적용

 

방법.2 Label Encoder : 문자형 데이터를 정수로 변환하는 방법.(주로 순서가 있는 범주형 변수를 처리)

- low,medium,high 또는 초급,중급,고급 처럼 순서가 있는 범주형 변수에 사용

- 범주가 있지만 One-hot을 쓰기엔 너무 많은 경우

 

예시) 

import pandas as pd

# 예시 데이터
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'satisfaction': ['만족', '보통', '불만', '만족']
})

print("원본 데이터:")
print(df)

 

원본 데이터

 

from sklearn.preprocessing import LabelEncoder
# Label Encoding
le = LabelEncoder()
df['satisfaction_encoded'] = le.fit_transform(df['satisfaction'])

print("\nLabel Encoding 결과:")
print(df)

le = LabelEncoder()로 따로 선언해줘야 합니다.

이후 fit_transform으로 'satisfaction_encoded'로 컬럼을 새로 만들어줍니다.

 

encoding 결과

 

2) 데이터 스케일링 : 머신러닝에서 수치형 데이터의 단위를 맞추는 전처리 과정

- 머신러닝 모델은 입력 변수들의 크기 차이에 민감함

- 스케일이 크거나 단위가 다른변수는 모델이 편향되게 학습할 수 있음.

 

ex)

  • 키(cm): 160~190 ⇒ 최대값과 최소값의 차이는 30
  • 연봉(만원): 1,000~10,000 ⇒ 최대값과 최소값의 차이는 : 9000

→ 연봉이 압도적이므로 모델이 연봉만 보고 학습할 수 있음

 

 

방법.1 StandardScaler(표준화)

  • x: 원본 값 5
  • μ(뮤): 전체 데이터의 평균 2
  • σ: 전체 데이터의 표준편차 1
  • z: 변환된 값 (표준화된 값) 3

※ 사용시기

1. 데이터가 정규분포에 가깝거나 대칭적일 때
2. 값의 분포 자체를 보존하고 싶을때 -> 데이터의 모양은 유지하면서, 중심만 0으로 옮기고 크기만 1로 맞춘다는 의미

주의) 이상치가 있으면 평균과 표준편차가 흔들릴 수 있음.

 

 

 

방법.2 MinMaxScaler(정규화) : 각 값을 0~1 사이로 변환

 

 사용 시기

1. 값의 범위를 일정한 크기로 맞춰야 할때
2. 데이터 분포가 비정규형일때

 

 

3) 다중공선성 제거

 

다중공선성: 독립변수들 간에 강한 상관관계가 있는 경우

→ 선형모델에서 다중공선성이 있으면 모델이 예측하는데 불안정해지고, 해석이 어려워짐.

 

과접합: 모신러닝 모델이 학습 데이터에 지나치게 최적화 되어, 새로운 데이터에 대한 예측 성능이 저하되는 형상

 

※ 과접합을 방지하는 방법

1. 모델의 복잡도 줄이기 : 너무 많은 파라미터를 가진 모델 대신, 간단한 모델 사용
2. 더많은 훈련 데이터 확보 : 데이터가 많을 수록 모델이 훈련 데이터에 과도하게 맞추는 것을 방지할 수 있음.
3. 정규화 : L1, L2 정규화 같은 기법을 사용해 모델의 복잡도를 제어할 수 있음.
4. 교차검 : 모델을 여러 번 테스트하여 과적합 여부를 확인하고, 모델을 개선합니다.

 

 

★ VIF 기반 변수제거

- VIF(Variance Inflation Factor) 값이 높으면 해당 변수는 다른 변수들과 높은 상관관계를 가짐

- 일반적으로 VIF 값이 10 이상이면 다중공선성이 높다고 판단하고 제거 고려

 

코드 예시 

# VIF 계산 함수
def calculate_vif(X):
    vif_data = pd.DataFrame()
    vif_data["Variable"] = X.columns
    vif_data["VIF"] = [variance_inflation_factor(X.values, i)
                       for i in range(X.shape[1])]
    return vif_data.sort_values('VIF', ascending=False)

# 예시 데이터 생성
np.random.seed(42)
size = 100

# 독립변수 3개
X1 = np.random.normal(10, 5, size)
X2 = 2*X1 + np.random.normal(0, 1, size)  # X1과 강한 상관관계
X3 = np.random.normal(5, 2, size)

# 데이터프레임 구성
df = pd.DataFrame({
    "X1": X1,
    "X2": X2,
    "X3": X3
})

# VIF 계산 실행
vif_result = calculate_vif(df)
print(vif_result)

 

결과

 

 

 

★ 높은 상관계수를 계산하여 상관계수 0.9 이상인 변수 쌍 중 하나를 제거

1. 피어슨 상관행렬을 계산

2. 상관계수가 0.9 이상인 변수 쌍을 찾음

3. 도메인 지식이나 모델 성능을 고려하여 제거할 변수를 결정

 

★PCA 분석

1. 다중공선성이 높은 변수를 직접제거하지 않고, 새로운 축으로 변환하여 차원을 줄이는 방법

2. PCA를 사용하여 주요 정보를 유지하면서 변수를 축소

 

 

4) 데이터 분할: 모델을 훈련하고 평가하기 위해 데이터를 훈련 데이터와 테스트 데이터로 나누는것.

- 훈련데이터 : 모델 학습에 사용

- 테스트 데이터 : 모델이 본적없는 데이터로, 일반화 성능 평가

 

코드 예제)

import pandas as pd
from sklearn.model_selection import train_test_split

# 예시 데이터 생성
data = {
    'feature1': range(100),
    'feature2': range(100, 200),
    'label': [0]*80 + [1]*20  # 불균형 데이터
}
df = pd.DataFrame(data)

# X(입력), y(출력) 분리
X = df[['feature1', 'feature2']]
y = df['label']

# 데이터 분할 (stratify로 클래스 비율 유지)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)

# 결과 확인
print("훈련 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)

결과

2. 오늘 해본 것

 

오늘은 베이직반 퀴즈를 해봤습니다.

 

 

 

 

 

 

 

3. 학습 후 느낀점

이제 오늘 해본 간단한 것들은 머리에서 쉽게 뽑아낼 수 있는 것같습니다.

대충 무슨 코드를 써야할지 감이 잡히고 있어서 간단한 전처리와 시각화는 자신있게 할 수 있을것같습니다.

 

그리고 머신러닝 부분 같은경우 기존 통계에 대한 지식이 있어서 어렵지 않게 따라가고 있습니다.

다만 코드사용에 대한 부분은 전처리, 시각화 처럼 충분한 경험이 있어야 가능할 것 같습니다.