[Machine Learning] 사이킷런 객체

1 minute read

사이킷런 API

이번 포스팅에서는 사이킷런의 객체들을 어떻게 생성하고 다루는 지에 대해 간단히 살펴봅니다.

사이킷런의 객체들은 다음 메서드를 갖습니다.

  • fit(): estimators
  • transform(): transformers
  • fit_transform(): fit() + transform()
  • predict(): prediction


평균과 표준편차

import numpy as np
# 평균과 표준편차를 구하는 함수
def _mean_and_std(X, axis=0): # axis=0: 열 단위
   
    X = np.asarray(X)
    mean_ = X.mean(axis)
    std_ = X.std(axis)

    return mean_, std_
data = np.array([[1,2,3],[4,5,6]])

data
array([[1, 2, 3],
       [4, 5, 6]])
print(_mean_and_std(data, 0)) # 열방향
print(_mean_and_std(data, 1)) # 행방향
(array([2.5, 3.5, 4.5]), array([1.5, 1.5, 1.5]))
(array([2., 5.]), array([0.81649658, 0.81649658]))



fit과 transform

# 스탠다드 스케일러 클래스에서 불필요한 부분들을 제외한 코드
class my_StandardScaler():

    def __init__(self):
        self.mean_, self.std_ = 0., 0.
    
    '''전달된 객체의 평균과 표준편차를 계산'''
    def fit(self, X, y=None):
        X = X.astype(np.float32)
        self.mean_, self.std_ = _mean_and_std(X, axis=0)
        return self
    '''self.mean_, self.std_를 이용하여 스케일링 수행'''
    def transform(self, X, y=None):
        X = X.astype(np.float32)
        X -= self.mean_
        X /= self.std_
        return X
    '''fit+transform'''
    def fit_transform(self, X, y=None):
        X = X.astype(np.float32)
        self.mean_, self.std_ = _mean_and_std(X, axis=0)
        X -= self.mean_
        X /= self.std_
        return X
    '''역변환'''
    def inverse_transform(self, X):
        X = X.astype(np.float32)
        X *= self.std_
        X += self.mean_
        return X
X = np.array([1,2,3,4,5,6,7,8,9,10])
sc = my_StandardScaler()
dir(sc)
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'fit',
 'fit_transform',
 'inverse_transform',
 'mean_',
 'std_',
 'transform']
# 전달한 인스턴스의 평균과 표준편차 계산
sc.fit(X)
<__main__.my_StandardScaler at 0x2b63775c160>
# 계산된 평균과 표준편차
sc.mean_, sc.std_
(5.5, 2.8722813)
# 스케일링 수행
X_sc = sc.transform(X)

X_sc
array([-1.5666989 , -1.2185436 , -0.87038827, -0.52223295, -0.17407766,
        0.17407766,  0.52223295,  0.87038827,  1.2185436 ,  1.5666989 ],
      dtype=float32)
# 역변환 수행
sc.inverse_transform(X_sc)
array([ 1.       ,  1.9999998,  3.       ,  4.       ,  5.       ,
        6.       ,  7.       ,  8.       ,  9.       , 10.       ],
      dtype=float32)
sc.fit_transform(X) == X_sc
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True])

Leave a comment