[Machine Learning] 03-1. 데이터 결측치 처리

Jihyeon Park·2024년 9월 16일

Machine Learning

목록 보기
4/5

Tensor

Tensor는 주로 딥러닝과 수치 연산을 위해 사용되는 다차원 배열(또는 매트릭스) 데이터 구조를 말한다. torch.Tensor는 PyTorch에서 제공하는 데이터 구조로 수학적 연산을 효율적으로 수행할 수 있게 한다.

Tensor의 특징

  1. 다차원 배열
  2. GPU 가속 가능
  3. 자동 미분 가능

Tensor vs Numpy Array

텐서는 NumPy 배열과 매우 유사하지만 GPU를 사용한 연산 가속과 자동 미분과 같은 추가 기능을 제공한다. NumPy는 CPU 기반 연산에 주로 사용되지만 파이토치의 텐서는 CPU 및 GPU 모두에서 효율적으로 작동한다.

import torch
import numpy as np

# 1
data = np.array([[1, 2], [3, 4]]) # 2차원 데이터
x = torch.tensor(data)
x
type(x)

data1 = torch.ones_like(x) # x의 속성을 유지하면서 1로 값 대입
data1

data2 = torch.zeros_like(x)
data2

# 0 ~ 1사이의 수를 무작위로 출력하되 float 타입
data3 = torch.rand_like(x, dtype=torch.float)
data3
x
x.sum(dim=0) # 열(column) 기준으로 합 구하기
# 2
t = torch.FloatTensor([1, 2, 3])
t
t.dim() # 차원
t.size() # 사이즈

t2 = torch.FloatTensor([[1., 2.],
                        [3., 4.],
                        [5., 6.]])

t2
t2.dim()
t2.size() # 3행 2열
# 3
t3 = torch.FloatTensor([[1.], [2.]])
t4 = torch.FloatTensor([[3.]]) # 브로드 캐스팅

t3 + t4
t3.mean() # 전체 평균
t3.mean(dim=0) # 열별 평균
t5 = torch.FloatTensor([[1., 2.], [3., 4.]])
t6 = torch.FloatTensor([[1.], [2.]])
t5.matmul(t6) # 행렬 곱
# 4
x = torch.FloatTensor([[1, 2], [3, 4]])
x.mul(2.) # 곱하기 2를 수행한 결과 출력
x # 기존 값 출력

x.mul_(2.) # 곱하기 2를 수행한 결과를 변수 x에 값을 저장하면서 결과 출력
x # 기존 값 출력
# 5
t1 = torch.FloatTensor([[1., 2.],
                        [3., 4.],
                        [5., 6.]])
t2 = torch.FloatTensor([[7., 8.],
                        [9.,10.],
                        [11., 12.]])

torch.cat([t1, t2], dim=0)
torch.cat([t1, t2], dim=1)
# 6
x = torch.FloatTensor([1, 4])
y = torch.FloatTensor([2, 5])
z = torch.FloatTensor([3, 6])
x.dim() # 차원
x.shape # 값 2개라는 뜻

x = x.unsqueeze(1) # 첫 번째에 1 대입, 차원 확장
x # 2행 1열
x.dim() # 2행 1열
x.shape

x = x.unsqueeze(2) # 두 번째에 1 대입, 차원 확장
x
x.dim()
x.shape

# squeeze는 차원 축소
# 7
t1 = torch.FloatTensor([[1., 2.],
                        [3., 4.],
                        [5., 6.]]) # 3행 2열 
t1.view(-1, 3) # 열을 3으로 고치기, 2행 3열

파이썬 결측치 종류

  • NaN : 수치 데이터의 결측치 표현 방법. na, null을 NaN으로 표현함
  • in R:
    1) na : 잘못된 값
    2) Numll : 아직 정해지지 않은 값
  • in Python: na, Null 둘 다 정해지지 않은 값
  • None : 비수치 데이터의 결측치 표현 방법
  • Inf(infinity) : 무한반복

파이썬 결측치 표현 방법

  • 수치 : numpy.nan # 넘파이 import 후 사용
  • 수치 이외 : None
a = pd.DataFrame({'name' : ['kim', 'lee', None, None],
                  'score' : [100, np.nan, np.nan, 99] })
a

  • 결측치 발생
    1) Nan, Null, Inf 등의 데이터가 데이터 수집 시 발생 가능
    2) 외부 데이터의 경우 결측치 발생 확인 및 처리가 더욱 중요함

  • 결측치 방치
    : 예측 결과에 큰 영향을 미쳐 잘못된 예측결과가 나올 수 있음

결측치 확인 함수

  • 데이터셋.isna()

  • 데이터셋.isnull()
    1) 데이터셋.isnull.sum() : numll의 개수
    2) 데이터셋.isnull.all() : 데이터가 모두 null인지 확인
    3) 데이터셋.isnull.any() : 데이터 중 하나라도 null이 있는지 확인

  • NaN값 포함 여부 확인 : Boolean 타입으로 반환되므로, 해당 결과로 확인

  • 판다스(pandas) : na, null 두 데이터를 NaN으로 통일하여 사용 가능

  • isin()
    1) 이상치(불필요한 데이터) 검색 시 사용
    2) 찾고자 하는 데이터의 존재 유무 확인 가능

결측치 처리하기

NaN 치환

  • .fillna(value) : NaN을 특정 value로 치환
  • .fillna({'col1':val, 'col2':val2...}) : NaN을 열(column)별로 지정된 데이터로 치환
  • .fillna(method = 'ffill') : 앞의 행 값으로 치환
  • .fillna(method = 'bfill') : 뒤의 행 값으로 치환

NaN 포함 행 삭제

  • .dropna() : NaN이 하나라도 있으면 해당 행 삭제
  • .dropna(how = 'all') : 행 전체가 NaN인 행만 삭제
  • dropna(thresh = n) : NaN이 아닌 값이 n개인 행 출력

결측치 포함된 데이터셋 연산

  • 데이터셋.sum() : 가능

  • 데이터셋.mean() : 가능

  • numpy의 array구조에서 NaN이 있는 경우 연산 무조건 불가능. 해당 데이터의 경우 pandas로 변환 후 연산 가능

profile
Studying data analysis and data science!

0개의 댓글