9/28 머신러닝 · SVM

레롤롤레로·5일 전

랭체인AI

목록 보기
13/17

오늘은 머신러닝이 다루는 작업과 학습 방식의 큰 흐름을 정리하고, scikit-learn으로 Iris 데이터를 분류하는 SVM 실습을 진행했다.

머신러닝에서 다루는 문제

규칙을 직접 작성하는 방식과 달리, 머신러닝은 데이터의 특징과 정답을 바탕으로 패턴을 학습해 새로운 입력을 예측한다. 수업에서는 분류, 회귀, 클러스터링, 추천, 이상 탐지처럼 문제의 출력 형태에 따라 작업을 나누어 봤다.

학습 데이터에 레이블이 있으면 지도 학습, 없으면 비지도 학습으로 구분한다. 이외에도 보상을 기준으로 행동을 학습하는 강화 학습, 일부 레이블만 사용하는 반지도 학습, 사전 학습 모델을 활용하는 전이 학습의 개념을 함께 정리했다.

Iris 데이터 준비

실습에는 scikit-learn의 load_iris() 데이터를 사용했다. 꽃받침과 꽃잎의 길이·너비, 네 개의 특성으로 세 품종을 구분하는 150개 샘플 데이터다. 품종별 샘플 수가 50개씩으로 동일하다.

iris = load_iris()

iris_df = pd.DataFrame(
    iris["data"],
    columns=iris["feature_names"]
)
iris_df["target"] = iris["target"]

sns.pairplot(iris_df, hue="target")

pairplot으로 특성 조합에 따라 세 품종이 어떻게 분포하는지 먼저 확인했다. 이후 target을 제외한 네 개 컬럼은 입력값 X, 품종 번호는 정답 y로 나눴다.

층화 추출로 학습·테스트 데이터 분리

train_test_split()에 stratify=y를 지정해 원본의 품종 비율을 유지한 채 데이터를 나눴다. 학습 데이터에는 품종별 40개씩, 총 120개가 들어갔고 테스트 데이터는 30개가 됐다.

X = iris_df.drop("target", axis=1)
y = iris_df["target"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    random_state=2026,
    stratify=y
)

수업 자료에는 학습·검증·테스트 세트를 각각 나누는 흐름도 소개됐지만, 이번 코드에서는 검증 세트를 별도로 만들지 않고 학습·테스트 세트만 사용했다.

SVM으로 품종 분류

SVM은 클래스 사이를 구분하는 결정 경계를 찾는 분류 모델이다. 경계와 가장 가까운 데이터인 서포트 벡터를 기준으로, 클래스 사이의 여유 공간인 마진을 크게 만드는 방향을 사용한다.

from sklearn.svm import SVC

svc = SVC()
svc.fit(X_train, y_train)

y_pred = svc.predict(X_test)

print(svc.score(X_train, y_train))  # 0.95
print(svc.score(X_test, y_test))    # 0.966666...

학습 정확도는 0.95, 테스트 정확도는 약 0.967로 나왔다. 테스트 데이터 30개 중 29개를 맞춘 결과다.

정확도로만 끝내지 않기

accuracy_score()와 svc.score()는 이번 분류 문제에서 같은 정확도를 반환했다. 다만 정확도만으로는 어떤 클래스를 틀렸는지 알기 어렵기 때문에, 다음에는 혼동 행렬과 정밀도·재현율도 함께 확인해 봐야겠다.

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred)

이번 실습에서는 데이터를 나누는 방식과 모델 학습·예측의 기본 흐름을 직접 연결해 봤다. 다음 모델을 비교할 때도 같은 데이터 분할 기준과 평가 지표를 유지하는 것이 중요하겠다.

0개의 댓글