Python to AI

Scikit-Learn과 Estimator

최 수빈 2025. 1. 21. 19:17

 

Estimator

데이터 모델링을 위한 기본 인터페이스를 제공하는 객체

머신러닝 워크플로우의 중심이 되는 객체

머신러닝 알고리즘을 캡슐화한 

→ 데이터를 학습하여 모델을 생성, 학습된 모델을 사용해 새로운 데이터에 대해 예측을 수행할 수 있음

 

 

알고리즘 : 데이터를 학습하고 처리하는 방법

Estimator : 알고리즘을 사용가능하게 만든 도구(객체), 데이터를 학습해서 예측을 수행할 수 있도록 도와주는 도구

메서드(fit, predict, score) : Estimator가 제공하는 기능

 

 

 

dir()함수로 Estimator가 제공하는 기능(메서드와 속성)목록 확인

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
print(dir(model))  # model 객체의 속성과 메서드 출력

"""
['_BaseDecisionTree__metadata_request__predict', '_DecisionTreeClassifier__metadata_request__fit', '_DecisionTreeClassifier__metadata_request__predict_proba', '__abstractmethods__', '__annotations__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__sklearn_clone__', '__sklearn_tags__', '__slotnames__', '__str__', '__subclasshook__', '__weakref__', '_abc_impl', '_build_request_for_signature', '_check_feature_names', '_check_n_features', '_compute_missing_values_in_feature_mask', '_doc_link_module', '_doc_link_template', '_doc_link_url_param_generator', '_estimator_type', '_fit', '_get_default_requests', '_get_doc_link', '_get_metadata_request', '_get_param_names', '_get_tags', '_more_tags', '_parameter_constraints', '_prune_tree', '_repr_html_', '_repr_html_inner', '_repr_mimebundle_', '_support_missing_values', '_validate_X_predict', '_validate_data', '_validate_params', 'apply', 'ccp_alpha', 'class_weight', 'cost_complexity_pruning_path', 'criterion', 'decision_path', 'feature_importances_', 'fit', 'get_depth', 'get_metadata_routing', 'get_n_leaves', 'get_params', 'max_depth', 'max_features', 'max_leaf_nodes', 'min_impurity_decrease', 'min_samples_leaf', 'min_samples_split', 'min_weight_fraction_leaf', 'monotonic_cst', 'predict', 'predict_log_proba', 'predict_proba', 'random_state', 'score', 'set_fit_request', 'set_params', 'set_score_request', 'splitter']

"""

 

1. DecisionTreeClassifier 객체 생성

  • DecisionTreeClassifier는 머신러닝의 결정 트리 알고리즘을 구현한 Estimator
  • medel은 Estimator 객체

2. dir(model)로 목록 확인

  • dir() 함수는 model 객체가 제공하는 모든 메서드와 속성을 반환
  • 위 코드 반환 목록은 Scikit-Learn에서 Estimator가 어떤 작업을 지원하는지 보여줌

 

 

모든 머신러닝 알고리즘이 Estimator를 통해 동일한 방식으로 작동:

 

1. 데이터를 학습하려면 fit 사용 

fit() : 데이터를 학습하여 모델 생성

 

2. 예측하려면 predict 사용

predict() : 학습된 모델을 사용하여 예측

 

3. 평가하려면 score 사용

score() : 모델 성능 평가

 

 

 

Estimator의 구조

 

모든 Estimator는 크게 두 가지로 나뉨

 

 

1. 지도 학습 모델 (Supervised Learning)

데이터를 보고 “입력” → “출력” 관계를 학습

예: 분류(Classification), 회귀(Regression)

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X, y)  # 학습
predictions = model.predict(new_X)  # 예측

 

 

2. 비지도 학습 모델 (Unsupervised Learning)

데이터의 숨겨진 구조나 패턴을 학습

예: 클러스터링(Clustering), 차원 축소(Dimensionality Reduction)

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(X)  # 학습
labels = model.predict(X)  # 클러스터 할당

 

 


 

짧은 예제 코드

 

 

결정 트리 모델 사용 예

from sklearn.tree import DecisionTreeClassifier

# 모델 생성
model = DecisionTreeClassifier()

# 학습 (입력 데이터 X와 출력 데이터 y)
model.fit(X, y)

# 새로운 데이터로 예측
new_data = [[30, 600, 700]]
prediction = model.predict(new_data)
print(prediction)

 


 

데이터 준비 및 분리
- 데이터를 준비하고 예측에 필요한 입력 변수(X)와 출력 변수(y)를 분리

import pandas as pd

loan_data = pd.DataFrame({
    'age': [25, 45, 35, 50, 23, 40, 60, 30, 55, 20],
    'all_assets': [500, 800, 600, 1200, 200, 700, 1500, 400, 1000, 150],
    'credit_score': [650, 700, 620, 720, 550, 680, 750, 600, 710, 500],
    'approved': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0]
})

X = loan_data.drop(columns=['approved'])
y = loan_data['approved']



모델 선택 및 학습
- 적합한 알고리즘을 선택하고 데이터를 학습시켜 모델을 생성

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X, y)


예측
- 학습된 모델을 사용하여 새로운 데이터를 입력하고 결과를 예측

new_students = pd.DataFrame([[29, 350, 580], [58, 950, 710]],
                            columns=['age', 'all_assets', 'credit_score'])

predictions = model.predict(new_students)
print(predictions)

"""
array([0, 1])

([거절, 승인])
"""

 

 

Estimator 유사 개념

라이브러리/프레임워크 Estimator에 해당하는 개념 설명
Scikit-Learn Estimator 데이터를 학습(fit), 예측(predict), 평가(score)하는 객체
TensorFlow/Keras 모델(tf.keras.Model) 신경망 구조를 정의하고 학습, 예측, 평가하는 역할
PyTorch 모델(torch.nn.Module) 신경망을 구성하고 학습 및 추론을 담당
XGPoost, LightGBM 모델 객체(e.g., XBGClassifier, LGBMClassifier) 학습(fit)과 예측(predict)을 제공하며, Scikit-Learn의 Estimator와 유사
Statsmodels 모델(OLS, GLM 등) 통계적 모델링을 제공하며, 학습 및 예측 기능 포함
Spark MLlib Estimator와 Transformer Scikit-Learn의 Estimator와 유사한 객체로, ML파이프라인을 구성



 

Scikit-Learn 워크플로우


데이터 로드 및 확인

- 데이터셋을 로드하여 입력 변수(X)와 출력 변수(y)를 준비

 

 

load_iris()(Brunch 객체 반환)

from sklearn.datasets import load_iris

data = load_iris() #데이터셋 전체를 객체 형태로 로드
X, y = data.data, data.target #입력 데이터와 타겟 데이터 분리
  1. load_iris()는 Brunch객체 반환 (Brunch 객체는 딕셔너리처럼 동작하며, data와 target 외에도 여러 메타데이터를 포함)
  2. data.data : 입력 데이터 (특성 데이터) -꽃받침 길이, 너비 등 4개의 특성을 가진 입력 데이터
  3. data.target : 타겟 데이터 (클래스 레이블) -데이터의 클래스(0, 1, 2로 구분)
import pandas as pd

df = pd.DataFrame(X, columns=data.feature_names)
df['target'] = y
print(df.head())

 

 

load_iris(return_X_y=True) (튜플 반환)

from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True) #입력 데이터와 타겟 데이터만 반환
  1. return_X_y=Ture 옵션을 사용 : 입력 데이터 X와 타겟 데이터 y만 튜플 형태로 반환 

-X : 입력 데이터 (꽃받침 길이, 너비 등 4개의 특성)

-y : 클래스 레이블(0, 1, 2)

import pandas as pd

df = pd.DataFrame(X, columns=["sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"])  # 직접 열 이름 지정
df['target'] = y  # 타겟 데이터 추가

print(df.head())

 

 

  첫 번째 코드 두 번째 코드
반환 형태 Brunch 객체 입력 데이터(X), 타겟 데이터(y)만 튜플로 반환
메타데이터 포함 여부 포함(feature_names, DESCR, target_names) 미포함
코드 간결성 상대적으로 더 길고 메타데이터를 명시적으로 가져와야 함 더 간결
사용 사례 데이터셋 설명과 메타데이터가 필요한 경우 입력 데이터와 타겟 데이터만 필요한 경우

 


모델 생성 및 학습

- 모델을 생성한 후 데이터를 학습

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X, y)



예측 및 평가

- 학습된 모델로 예측을 수행하고, 결과를 시각화 및 평가

predictions = model.predict(X)
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error

plt.scatter(predictions, y) #산점도 그래프(예측값, 실제값)
plt.plot([y.min(), y.max()], [y.min(), y.max()], color='red', linestyle='--')
plt.show()

#평균제곱의 계산 - 예측 정확도를 수치로 평가
mse = mean_squared_error(y, predictions)
print(f'mean_squared_error >>> {mse:.2f}')

 

[<matplotlib.lines.Line2D at 0x125c1fa70>]

 

 

mean_squared_error >>> 0.05

 

 

데이터 전처리


결측치 처리 전략

- 누락된 값을 확인하고 적절한 방법으로 처리

 

from sklearn.datasets import fetch_openml

df = fetch_openml('titanic', version=1, as_frame=True)['data']
missing_percentage = (df.isnull().sum() / len(df)) * 100
print(missing_percentage) #결측치 비율

"""
pclass        0.000000
name          0.000000
sex           0.000000
age          20.091673
sibsp         0.000000
parch         0.000000
ticket        0.000000
fare          0.076394
cabin        77.463713
embarked      0.152788
boat         62.872422
body         90.756303
home.dest    43.086325
dtype: float64
"""

 

결측치 삭제

df.drop(['body'], axis=1, inplace=True)

 

결측치 대체(Imputation)

 

Pandas

#Pandas의 fillna
df['age'].fillna(df['age'].mean(), inplace=True)

 

Scikit-Learn

# Scikit-Learn의 SimpleImputer
from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')
df['age'] = imputer.fit_transform(df[['age']])

 

 

Pandas vs. SimpleImputer

  Pandas fillna Sciket-Learn SimpleImputer
결과 동일한 열의 결측치가 평균값으로 대체됨 동일한 열의 결측치가 평균값으로 대체됨
목적 단일 DataFrame 처리 여러 데이터셋 간 일관된 처리(학습/테스트 데이터 분리 시 유용)
사용 대상 Pandas DataFrame에 국한 Scikit-Learn 모델 파이프라인과 통합 가능
적용 범위 한 번 계산하고 바로 적용 => 데이터 간 일관성을 유지하기 어려움 fit()으로 계산 후 다른 데이터셋 (transform())에 동일 적용
다양한 전략 지원 평균값, 상수 대체 정도만 가능 중앙값, 최빈값, 상수 등 다양한 전략 지원
머신러닝 워크플로우 별도로 설계 필요 파이프라인으로 설계 가능

 

 

 

*Scikit-Learn의 파이프라인에서 SimpleImputer를 자동 적용 -> 여러 전처리 단계를 자동으로 연결해 모델 학습 관리 용이

from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.impute import SimpleImputer

pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='mean')),
    ('classifier', DecisionTreeClassifier())
])

pipeline.fit(X_train, y_train)  # 결측치 처리 + 학습
predictions = pipeline.predict(X_test)  # 결측치 처리 + 예측




특성 엔지니어링

- 기존 데이터를 활용하여 새로운 특성을 생성

 

 

벡터 연산 사용

df['family'] = df['sibsp'] + df['parch'] #가족 수
df['travelled_alone'] = (df['family'] == 0).astype(int)
  1. df['sibsp'] + df['parch'] : 가족 수(family) 계산
  2. df['family'] == 0 : 가족 수가 0인 경우 True, 아닌 경우 False로 표시
  3. .astype(int) : True(1)와 False(0)로 변환하여 travelled_alone 열에 저장

 

조건부 업데이트 사용

df['family'] = df['sibsp'] + df['parch']  # 가족 수
df['travelled_alone'] = 0
df.loc[df['family'] == 0, 'travelled_alone'] = 1
  1. df['sibsp'] + df['parch'] : 가족 수(family) 계산
  2. df['travelled_alone'] = 0: travelled_alone 열을 초기화(모든 값이 0)
  3. df.loc[df['family'] == 0, 'travelled_alone'] = 1 : 가족수가 0인 행의 travelled_alone 값을 1로 업데이트

 

  첫 번째 코드 두 번째 코드
코드 간결성 한 줄로 작성 가능 여러 단계로 나뉨
효율성 벡터 연산으로 빠름 초기화 + 조건부 업데이트로 느림
가독성 간결하지만 복잡한 논리를 한 줄로 작성 직관적으로 단계별 작업을 이해하기 쉬움
사용 목적 데이터가 크거나 빠른 연산이 필요할 때 적합 데이터가 작고, 디버깅이나 코드 설명이 필요할 때 적합

 

Feature Engineering

 


데이터 인코딩 및 스케일링

 

인코딩

- 범주형 데이터를 수치형 데이터로 변환

from sklearn.preprocessing import OneHotEncoder

df = pd.DataFrame({'sex': ['male', 'female', 'female', 'male', 'female']})
encoder = OneHotEncoder() #OneHotEncoder 객체 생성
one_hot_encoded = encoder.fit_transform(df[['sex']]).toarray()
print(one_hot_encoded) #male == 1, female == 0

"""
array([[0., 1.],
       [1., 0.],
       [1., 0.],
       [0., 1.],
       [1., 0.]])
"""


스케일링
- 입력 데이터의 크기를 일정한 범위로 조정

 

MinMaxScaler
- 데이터가 특정 범위 내에서 고르게 분포하도록 조정

from sklearn.preprocessing import MinMaxScaler

data = [[-1, 2], [-5, 6], [0, 10], [1, 10]]
scaler = MinMaxScaler()
scaler_data = scaler.fit_transform(data)
print(scaler_data)

"""
array([[0.66666667, 0.        ],
       [0.        , 0.5       ],
       [0.83333333, 1.        ],
       [1.        , 1.        ]])
"""

 


StandardScaler
- 데이터를 평균 0, 표준편차 1로 변환

반환 후 데이터 평균 값이 0을 중심으로 대칭적으로 분포

=> 데이터에 이상치가 많거나 정규 분포를 가정할 때 유용

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
standard_data = scaler.fit_transform(data)
print(standard_data)

"""
array([[ 0.10976426, -1.50755672],
       [-1.6464639 , -0.30151134],
       [ 0.5488213 ,  0.90453403],
       [ 0.98787834,  0.90453403]])
"""

 


 

Estimator는 데이터를 학습하고 예측할 수 있는 "모델 생성기"