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 #입력 데이터와 타겟 데이터 분리
- load_iris()는 Brunch객체 반환 (Brunch 객체는 딕셔너리처럼 동작하며, data와 target 외에도 여러 메타데이터를 포함)
- data.data : 입력 데이터 (특성 데이터) -꽃받침 길이, 너비 등 4개의 특성을 가진 입력 데이터
- 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) #입력 데이터와 타겟 데이터만 반환
- 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)
- df['sibsp'] + df['parch'] : 가족 수(family) 계산
- df['family'] == 0 : 가족 수가 0인 경우 True, 아닌 경우 False로 표시
- .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
- df['sibsp'] + df['parch'] : 가족 수(family) 계산
- df['travelled_alone'] = 0: travelled_alone 열을 초기화(모든 값이 0)
- df.loc[df['family'] == 0, 'travelled_alone'] = 1 : 가족수가 0인 행의 travelled_alone 값을 1로 업데이트
첫 번째 코드 | 두 번째 코드 | |
코드 간결성 | 한 줄로 작성 가능 | 여러 단계로 나뉨 |
효율성 | 벡터 연산으로 빠름 | 초기화 + 조건부 업데이트로 느림 |
가독성 | 간결하지만 복잡한 논리를 한 줄로 작성 | 직관적으로 단계별 작업을 이해하기 쉬움 |
사용 목적 | 데이터가 크거나 빠른 연산이 필요할 때 적합 | 데이터가 작고, 디버깅이나 코드 설명이 필요할 때 적합 |
데이터 인코딩 및 스케일링
인코딩
- 범주형 데이터를 수치형 데이터로 변환
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는 데이터를 학습하고 예측할 수 있는 "모델 생성기"
'Python to AI' 카테고리의 다른 글
titanic 데이터셋 분석 및 모델 학습 (0) | 2025.01.29 |
---|---|
Iris 데이터셋과 결정 트리(Decision Tree) 모델 : 평가 방법 비교 및 교차 검증 실습 (0) | 2025.01.24 |
Perceptron(퍼셉트론) (1) | 2025.01.14 |
Machine Learning Algorithms (0) | 2025.01.10 |
Python - Matplotlib (4) | 2024.12.30 |