AI 부트캠프/챕터2(10.14~11.08)

TIL 15 실무에 바로 쓰는 바닥부터 시작하는 머신러닝

musukie 2024. 10. 17. 12:26

Kaggle

경진에 참여해 좋은 성취를 얻는 것만으로도 좋은 스펙이 될 수 있다. 캐글에 참여하는 것 자체가 하나의 포트폴리오가 될 수 있다.

 

데이터프레임
데이터프레임의 기본 정보를 확인하는 메서드들을 함수가 아니기 때문에 변수를 호출하듯이 적어주면 된다.

df.shape # 데이터프레임의 크기 확인(행, 열)
df.coumns # 데이터프레임의 컬럼명 확인
df.dtypes # 데이터프레임의 데이터 타입 확인

df.describe() # 데이터프레임의 요약 통계량 확인
df.info() # 데이터프레임의 기본 정보 확인(null값, 데이터 타입 등)

데이터 전처리

불러온 데이터를 머신러닝에 사용하려면 전처리를 해야 한다. 이를 통해 잘못된 데이터를 처리하고 데이터를 머신러닝이 이해하기 쉬운 형태로 바꿔줌으로써 머신러닝의 성능을 올려줄 수 있다.

데이터 전처리 과정을 살펴보면 아래와 같다.

  • 결측값 처리 : 데이터셋에서 누락된 값을 처리하는 작업.
    • 행이나 열을 기준으로 삭제하거나, 평균·중앙값·최빈값 등으로 대체하거나, 다른 특성을 사용해 예측할 수 있음.
  • 이상값 처리 : 데이터셋에서 비정상적으로 큰 값이나 작은 값을 처리하는 작업.
    • 데이터셋에서 제거하거나, 상한선이나 하한선으로 대체하는 등 다른 값으로 변환하거나, IQR 방법으로 이상치를 탐지할 수 있음.
  • 중복 데이터 제거 : 동일한 데이터가 여러 번 나타나는 경우 이를 제거.
  • 데이터 타입 변환 : 데이터의 타입을 적절하게 변환하는 작업.
  • 인코딩 : (4와 5는 데이터 전처리에서 유사하게 사용됨). 비정형 데이터를 모델이 이해할 수 있는 형태로 변환함.
    • 레이블 인코딩 : 범주형 데이터를 수치형 데이터로 변환.
    • 원-핫 인코딩 : 범주형 데이터를 이진 벡터로 변환. 우리는 주로 이 방법을 사용함.
  • 데이터 정규화 : 데이터의 범위를 일정하게 맞추는 작업.
    • 데이터를 일정한 범위로 스케일링하는 과정. 일반적으로 [0, 1] 범위로 변환함.(Min-Max 정규화)
  • 샘플링 : 데이터셋의 크기를 줄이거나 늘리는 작업.
  • 특징 선택 및 추출 : 모델의 성능을 높이기 위해 중요한 특징을 선택하거나 새로운 특징을 추출.
  • 데이터 표준화 : 데이터를 평균 0, 분산 1로 변환하는 과정.
    • 데이터가 일정한 분포를 따르게 해서 머신러닝의 학습이 잘 되게 하는 효과.
      데이터가 안정되고 믿을 수 있는 범위에 있어서 머신러닝 모델의 학습이 잘 되는 것.
  • 특성 공학 : 데이터로부터 새로운 유용한 특성을 생성하는 과정.
    • 특성 생성을 통해 기존 데이터를 기반으로 새로운 특성을 생성하고, 특성 선택을 통해 모델 성능에 중요한 특성을 선택하고 중요하지 않은 특성을 제거함.
  • 데이터 분할 : 데이터를 학습용, 검증용, 테스트용으로 분할함. 이를 통해 모델의 일반화 성능을 평가할 수 있음.
    • 학습 데이터 : 모델 학습에 사용되는 데이터.
    • 검증 데이터 : 모델 튜닝 및 성능 검증에 사용되는 데이터.
    • 테스트 데이터 : - 최종 모델 평가에 사용되는 데이터.

결측값을 제거해보자.

  • 결측값이 포함된 을 제거하는 방법
    df_dropped_rows = df.dropna()
  • 결측값이 포함된 을 제거하는 방법
    df_dropped_rows = df.dropna(axis=1)

그러나 데이터를 제거하면 데이터 로스가 많이 발생하기 때문에 주로 대체예측을 많이 사용한다. 데이터를 대체할 때는 데이터의 형태에 맞춰서 적절한 값으로 대체해야 한다.

 

이상치를 확인할 때는 안정적으로 이상치를 계산할 수 있다고 하여 IQR방법을 주로 사용한다.

 

샘플링의 예는 아래외 같다.

# 데이터셋에서 50% 샘플 추출
df_sampled = df.sample(frac=0.5)

# 데이터셋에서 100개의 샘플 추출
df_sampled_n = df.sample(n=100)

샘플링할 비율을 frac으로 전달해줄 수도 있고, 개수를 n으로 전달해줄 수 도 있다.

 

특징을 추출할 때는 두 열의 곱이나 두 곱의 합을 새로운 특징으로 추가하는 등의 방법이 있다.


지도학습

정답이 있고, 데이터를 통해 정답을 예측하는 학습 방법. 정답의 종류에 따라 회귀모델분류모델이 있다.

     1. 회귀모델

회귀모델은 연속적인 값을 예측하는 문제다. 회귀모델에는 선형회귀, 다항회귀, 리지회귀, 라쏘회귀가 있다.

 

1) 선형회귀

종속 변수와 하나 이상의 독립 변수 간의 선형 관계를 모델링하는 방법이다. 실제로는 선형회귀의 성능은 그렇게 좋지 않다고 한다.

 

2) 다항회귀

선형회귀와의 차이점은, 선형회귀는 선형 관계를, 다항회귀는 비선형 관계를 모델링한다는 것이다. 즉, 선형성이 아니라 비선형 관계를 예측할 수 있어서 훨씬 추론 능력이 높게 되는 것이다.

 

     2. 분류모델

1) 로지스틱 회귀

로지스틱 회귀인데 왜 회귀모델이 아니라 분류모델일까? 0과 1사이의 값을 가지니까 확률로 표현할 수 있고, 이 확률은 특정 분류에 해당 데이터가 속할 가능성을 나타낸다. 따라서 이름은 회귀이지만 분류 작업에 사용되는 것이다.

 

* 머신러닝을 너무 어렵게 생각하지 말고, 기존 모델이 있고 약간씩 다르다고 생각하도록 하자. *

 

2) SVM (Support Vector Machine) 모델

분류와 회귀 분석에 사용되는 강력한 지도학습 모델로, 데이터를 분류하기 위해 결정 경계(결정 초평면, hyperplane)를 찾아 분류한다.

위의 수식은 일반적으로 선형대수의 표시다. w는 가중치 벡터, x는 입력 벡터, b는 절편이다. 우리의 목표는 가중치 벡터인 w를 학습하는 것이다. 이 수식은 데이터가 있을 때 차원에 따라 이를 가장 잘 나누는 선 혹은 면을 찾는다는 것을 의미한다고만 이해하면 된다.

 

3) KNN (K-Nearest Neighbors) 

머신러닝 모델들도 알고리즘의 일종이지만, 그 중에서도 KNN은 동작 방식이 일반적인 알고리즘과 매우 유사하다. 따라서 KNN은 복잡한 머신러닝 모델이라고 이해하기보다 알고리즘 모델의 일부라고 이해하는 게 쉬울 수 있다. 

KNN은 사용과 구현이 간단해서, 생각보다 많은 곳에서 사용된다. 즉, 범용적으로 쓸 수 있어서 활용 분야가 매우 넓다.

 

4) 나이브베이즈 모델 (Naive Bayes) 

이 모델은 처음부터 끝까지 통계다. 나이브베이즈 분류기는 베이즈 정리를 기반으로 하는 통계적 분류 기법이다.

나이브베이즈는 효율적으로 사용할 수 있다. 연산 자체가 많지 않고, 텍스트 분류 문제에서 좋은 성능을 발휘하기 때문에 많이 사용되는 머신러닝 모델 중 하나이다.

 

가우시안 나이브베이즈는 정규분포를 따를 때 사용하는 나이브베이즈고, 베르누이 나이브베이즈는 특징들이 이진수로 표현되는 경우 사용되고, 멀티노미얼은 다항분포를 따르는 경우 사용된다. 

 

5) 의사결정나무(Decision Tree) 

디시젼 트리는 트리(Tree) 구조로, 노드(Node)가 있고 자식 노드가 계속 연결되어 뻗어나가는데, 어느 순간 끝이 난다.


   강의 외부에서 추가로 알게 된 내용

  • 결과를 보여주는 vs 보여주지 않는 함수

1. 바로 결과를 보여주는 함수

- 이 함수들은 값을 한 번에 계산하고 결과를 바로 반환함. 예) 리스트, 숫자, 문자열 등을 즉시 반환.
- 바로 결과를 보여주는 함수의 예

  • list.append(): 리스트에 값을 추가한 후 즉시 업데이트된 리스트를 보여줌.
  • sum(): 리스트나 다른 시퀀스의 합을 계산해 즉시 결과를 돌려줌.
  • sorted(): 데이터를 정렬한 후 바로 정렬된 리스트를 반환함.

2. 결과를 바로 보여주지 않는 함수 (지연 평가)
- 이 함수들은 필터 객체나 제너레이터처럼 값을 바로 계산하지 않고, 필요할 때마다 값을 하나씩 생성하거나 가져오는 방식(지연 평가)을 사용함. 이런 함수들은 즉시 결과를 리스트처럼 보여주지 않고, 특정 객체를 반환함. 이 객체들은 값을 직접 사용할 수 없고, 리스트, 튜플 등으로 변환해야 값을 볼 수 있음.
- 결과를 바로 보여주지 않는 함수의 예:

  • filter(): 조건에 맞는 값들을 "필터 객체"로 반환해요. 이 객체는 리스트처럼 바로 보이지 않아요.
  • map(): 각 요소에 함수를 적용한 결과를 "맵 객체"로 반환해요.
  • range(): 주어진 범위의 숫자를 생성하는 "range 객체"를 반환해요.
  • zip(): 여러 리스트나 튜플의 요소들을 묶어주는 "zip 객체"를 반환해요.

  • lambda와 apply

1. lambda
- 파이썬에서 "작고 빠르게 함수 하나를 만들고 싶을 때" 사용하는 방법. 주로 한번만 쓰일 간단한 함수가 필요할 때 사용.
- 예를 들어, lambda x: x + 10은 "숫자 하나를 입력하면 10을 더한 값을 돌려주는 함수"를 만드는 것.

2. apply
- 파이썬에서 데이터프레임에 있는 열(또는 행)에 대해 함수를 적용할 때 사용하는 함수.
- 쉽게 말하면, 표의 한 줄이나 한 열에 있는 모든 값을 차례차례 가져와서, 그 값에 함수를 적용해줌. 한 번에 한 값씩 함수를 적용해서 새로운 결과를 만들어내는 역할.

 

apply가 데이터프레임의 열이나 행에 있는 값들에 하나씩 함수 적용하는 기능을 하는데, 여기에 짧은 함수가 필요할 때 lambda를 사용하면 코드가 더 간결해짐.