본문 바로가기
머신러닝

파이썬 라이브러리, KNN, 의사 결정 트리를 활용한 머신러닝 기초 실습

by Master_BJ 2024. 11. 15.
반응형

머신러닝 개념과 파이썬 라이브러리(Numpy, Pandas, Scikit-learn 등)를 사용하여 아이리스 데이터셋으로 로지스틱 회귀, KNN, 결정 트리 모델을 학습하고 평가하는 과정을 설명합니다.


 

서론

머신러닝을 처음 접할 때는 단순한 개념을 이해하는 것만으로도 매우 어렵게 느껴질 수 있습니다.

 

그러나 머신러닝의 기본적인 개념과 원리를 제대로 이해하면 실제 데이터를 처리하는 과정이 훨씬 수월해지며, 이 과정에서 다양한 실습과 연습을 통해 학습한 이론을 실제로 적용할 수 있습니다.

 

파이썬(Python)은 이론적 배경을 실습으로 연결하는 데 매우 유용한 프로그래밍 언어입니다. 이는 파이썬이 다양한 데이터 처리, 분석, 시각화 그리고 머신러닝 라이브러리를 폭넓게 제공하고 있기 때문입니다.

 

본 글에서는 이러한 라이브러리들을 활용하여 파이썬으로 머신러닝을 처음 접하는 사람들을 위한 기초적인 실습 예제를 소개하려고 합니다.

 

각 단계마다 상세한 설명을 포함하여, 실습을 통해 머신러닝의 흐름을 이해하고, 단계별로 어떤 과정을 거치는지 체험할 수 있도록 구성하였습니다.

 

머신러닝 기본 개념

머신러닝이란 간단히 말해, 데이터를 통해 패턴을 학습하고, 이를 바탕으로 새로운 데이터를 예측하거나 분류하는 기술입니다.

 

머신러닝의 기본 원리는 사람이 데이터를 분석해 패턴을 찾는 것과 유사하지만, 머신러닝 모델은 그 과정에서 훨씬 더 많은 데이터를 빠르게 처리하고 복잡한 패턴을 자동으로 발견할 수 있습니다.

 

머신러닝의 학습 방식은 크게 세 가지로 나뉩니다.

 

첫 번째는 지도 학습(Supervised Learning)입니다. 이는 입력 데이터와 그에 대한 출력 값을 알고 있는 상태에서 모델을 학습시키는 방법으로, 일반적으로 분류(Classification)와 회귀(Regression) 문제에 사용됩니다.

 

두 번째는 비지도 학습(Unsupervised Learning)입니다. 이 방식은 출력 데이터 없이 입력 데이터의 구조를 파악하거나 군집화(Clustering)를 수행하는 데 사용됩니다.

 

세 번째는 강화 학습(Reinforcement Learning)으로, 환경과 상호작용하며 보상을 최대화하는 방향으로 학습하는 방식입니다.

 

이 세 가지 중에서도 이번 실습에서는 가장 기본적이고 널리 사용되는 지도 학습을 사용하여 분류 모델을 만들어보겠습니다.

 

본론

 

파이썬 환경 설정 및 주요 라이브러리 설치

머신러닝 모델을 개발하고 실습하려면 먼저 파이썬 환경을 설정하고 필요한 라이브러리를 설치해야 합니다.

 

파이썬에는 머신러닝과 데이터 분석을 위한 강력한 라이브러리들이 많이 존재합니다. 이 라이브러리들은 데이터를 처리하는 과정을 단순화하고, 다양한 머신러닝 알고리즘을 빠르게 적용할 수 있도록 도와줍니다.

 

이번 실습에서 사용될 주요 라이브러리는 다음과 같습니다.

 

pip install numpy pandas scikit-learn matplotlib seaborn

 

각 라이브러리 설명

  • NumPy: 파이썬에서 고성능 다차원 배열을 다루기 위한 핵심 라이브러리입니다. 이를 통해 배열 연산을 효율적으로 처리할 수 있으며, 과학 계산에 자주 사용됩니다.

 

  • Pandas: 데이터 분석을 위한 고급 도구를 제공하는 라이브러리로, 특히 데이터프레임(DataFrame)을 사용하여 데이터를 효율적으로 처리하고 분석할 수 있습니다.

 

  • Scikit-learn: 다양한 머신러닝 알고리즘을 제공하는 파이썬 라이브러리입니다. 분류(Classification), 회귀(Regression), 군집화(Clustering), 모델 선택 등 폭넓은 기능을 지원합니다.

 

  • MatplotlibSeaborn: 데이터 시각화를 위한 라이브러리로, 데이터를 그래프로 표현하여 쉽게 분석할 수 있도록 도와줍니다.

 

데이터셋 로드 및 준비

머신러닝 실습을 위해 이번에는 아이리스(Iris) 데이터셋을 사용하겠습니다. 이 데이터셋은 150개의 샘플로 구성되어 있으며, 각 샘플은 꽃잎의 길이와 너비 등의 4가지 특성(feature)을 가지고 있습니다.

 

아이리스 데이터셋은 머신러닝 초보자에게 매우 적합한 데이터셋으로, 이를 통해 꽃의 종류를 3가지로 분류하는 문제를 해결해볼 것입니다.

 

1. 데이터셋 로드

먼저, Scikit-learn에서 제공하는 아이리스 데이터를 로드하고 이를 데이터프레임으로 변환하여 데이터를 확인해 보겠습니다.

 

from sklearn.datasets import load_iris
import pandas as pd

# 데이터셋 불러오기
iris = load_iris()

# 데이터프레임으로 변환
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target

# 데이터 확인
print(df.head())

 

이 코드에서는 Scikit-learn 라이브러리의 load_iris 함수를 통해 데이터를 불러오고, Pandas의 데이터프레임으로 변환합니다.

 

데이터프레임을 사용하면 데이터를 시각적으로 확인하고, 각 특성과 타겟 변수를 쉽게 다룰 수 있습니다.

 

아이리스 데이터셋은 총 150개의 샘플과 4개의 특성으로 구성되어 있으며, target 열은 0, 1, 2로 각기 다른 꽃의 종류를 나타냅니다.

 

2. 데이터 전처리

머신러닝 모델을 만들기 전에 데이터를 적절히 전처리해야 합니다.

 

전처리 과정에서는 주로 결측값 처리, 데이터 정규화 및 특성 공학(Feature Engineering) 등을 수행합니다. 이 예제에서는 별다른 결측값 처리가 필요 없으므로, 데이터 정규화만 수행합니다.

 

데이터 정규화는 모델이 특정 특성에 지나치게 의존하지 않도록 각 특성의 값을 일정한 범위로 맞추는 작업입니다.

 

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 입력 변수(X)와 출력 변수(y) 분리
X = df.drop('target', axis=1)
y = df['target']

# 데이터셋을 훈련/테스트로 나누기 (80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 정규화 (표준화)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

 

이 코드는 데이터를 훈련 세트와 테스트 세트로 나누고, 표준화를 통해 특성의 값 범위를 조정하는 과정을 보여줍니다.

 

먼저, train_test_split 함수로 데이터를 훈련용(80%)과 테스트용(20%)으로 나누고, StandardScaler를 사용해 정규화합니다.

 

정규화된 데이터는 모델이 학습할 때 더 나은 성능을 발휘할 수 있도록 도와줍니다.

 

3. 분류 모델 훈련

데이터가 준비되었으니, 이제 실제로 머신러닝 모델을 만들어 훈련시킬 차례입니다.

 

이번에는 가장 기본적인 분류 알고리즘인 로지스틱 회귀(Logistic Regression)를 사용하여 모델을 훈련시켜 보겠습니다.

 

로지스틱 회귀는 특히 이진 분류 문제에서 널리 사용되지만, 다중 클래스 분류 문제에도 적합하게 사용할 수 있습니다.

 

from sklearn.linear_model import LogisticRegression

# 모델 생성
model = LogisticRegression()

# 모델 훈련
model.fit(X_train_scaled, y_train)

# 훈련 결과 확인
print(f"훈련 정확도: {model.score(X_train_scaled, y_train):.2f}")
print(f"테스트 정확도: {model.score(X_test_scaled, y_test):.2f}")

 

로지스틱 회귀 모델을 사용하여 데이터를 학습시킨 후, 훈련 세트와 테스트 세트에서의 정확도를 출력합니다.

 

이 과정을 통해 모델이 얼마나 정확하게 데이터를 분류하는지 알 수 있습니다.

 

일반적으로 테스트 세트의 정확도가 높을수록 모델이 새로운 데이터에 대해 잘 예측할 수 있음을 의미합니다.

반응형

4. 모델 평가

훈련된 모델의 성능을 더 자세히 평가하기 위해, 혼동 행렬(Confusion Matrix)을 사용하여 결과를 시각화하고 정밀도(Precision), 재현율(Recall), F1 점수와 같은 성능 지표를 계산해 봅니다.

 

from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
import matplotlib.pyplot as plt

# 예측 수행
y_pred = model.predict(X_test_scaled)

# 혼동 행렬 생성
conf_matrix = confusion_matrix(y_test, y_pred)

# 시각화
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

# 분류 리포트 출력
print(classification_report(y_test, y_pred))

 

위 코드는 모델이 예측한 결과를 기반으로 혼동 행렬을 시각화하는 방법을 보여줍니다. 혼동 행렬은 모델이 실제 클래스와 예측 클래스 간의 차이를 보여주며, 이를 통해 모델이 어떤 클래스를 잘못 예측했는지 파악할 수 있습니다.

 

또한, classification_report 함수를 사용하면 각 클래스에 대한 정밀도, 재현율, F1 점수를 출력하여 모델의 전반적인 성능을 더 깊이 이해할 수 있습니다.

 

K-최근접 이웃(KNN) 알고리즘 실습

이번에는 다른 기본 분류 알고리즘인 K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘을 사용하여 실습을 진행해 보겠습니다.

 

KNN 알고리즘은 새로운 데이터 포인트를 분류할 때, 가장 가까운 K개의 데이터 포인트를 기준으로 다수결을 통해 분류를 수행합니다.

 

이 알고리즘은 매우 직관적이며, 간단한 데이터셋에서는 강력한 성능을 발휘할 수 있습니다.

 

1. KNN 모델 훈련

먼저, KNN 모델을 생성하고 훈련시켜 보겠습니다.

 

from sklearn.neighbors import KNeighborsClassifier

# KNN 모델 생성 (k=3)
knn_model = KNeighborsClassifier(n_neighbors=3)

# 모델 훈련
knn_model.fit(X_train_scaled, y_train)

# 정확도 확인
print(f"KNN 훈련 정확도: {knn_model.score(X_train_scaled, y_train):.2f}")
print(f"KNN 테스트 정확도: {knn_model.score(X_test_scaled, y_test):.2f}")

 

여기서 n_neighbors=3는 새로운 데이터를 분류할 때 가장 가까운 3개의 데이터 포인트를 참고한다는 의미입니다.

 

KNN 모델을 훈련시키고 훈련 세트와 테스트 세트에서의 정확도를 확인하면, 로지스틱 회귀 모델과 비교해 KNN 모델이 얼마나 잘 작동하는지 알 수 있습니다.

 

2. KNN 모델 평가

훈련된 KNN 모델의 성능을 평가하기 위해, 로지스틱 회귀 모델과 동일한 방법으로 혼동 행렬을 생성하고 성능 지표를 출력해 봅시다.

 

# KNN 예측 수행
y_pred_knn = knn_model.predict(X_test_scaled)

# KNN 혼동 행렬 생성 및 시각화
conf_matrix_knn = confusion_matrix(y_test, y_pred_knn)
sns.heatmap(conf_matrix_knn, annot=True, fmt='d', cmap='Greens')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

# KNN 분류 리포트 출력
print(classification_report(y_test, y_pred_knn))

 

이 코드는 KNN 모델이 예측한 결과를 기반으로 혼동 행렬을 시각화하고, 각 클래스에 대한 성능 지표를 계산합니다.

 

KNN 모델의 성능은 데이터셋의 특성과 K 값에 따라 크게 달라질 수 있으므로, 다양한 K 값을 실험해 보면서 최적의 성능을 찾는 것이 중요합니다.

 

결정 트리(Decision Tree) 모델 실습

이번에는 결정 트리(Decision Tree) 알고리즘을 사용하여 데이터를 분류해 보겠습니다. 결정 트리는 매우 직관적이고 해석하기 쉬운 알고리즘으로, 트리 구조를 통해 데이터를 분류하거나 회귀 분석을 수행할 수 있습니다.

 

각 노드는 특정 특성에 대한 조건을 기반으로 데이터를 분할하며, 최종적으로 각 잎(leaf) 노드에서 데이터를 분류하게 됩니다.

 

1. 결정 트리 모델 훈련

결정 트리 모델을 생성하고 훈련시키는 과정은 매우 간단합니다.

 

from sklearn.tree import DecisionTreeClassifier

# 결정 트리 모델 생성
tree_model = DecisionTreeClassifier(random_state=42)

# 모델 훈련
tree_model.fit(X_train_scaled, y_train)

# 결정 트리 정확도 확인
print(f"결정 트리 훈련 정확도: {tree_model.score(X_train_scaled, y_train):.2f}")
print(f"결정 트리 테스트 정확도: {tree_model.score(X_test_scaled, y_test):.2f}")

 

이 코드는 결정 트리 모델을 생성하고, 이를 훈련 데이터에 맞춰 학습시킵니다. random_state=42는 모델의 결과를 재현할 수 있도록 고정된 시드(seed)를 사용한 것입니다.

 

결정 트리는 복잡한 데이터셋에서도 매우 강력한 성능을 발휘할 수 있으며, 과적합(overfitting)을 방지하기 위한 다양한 방법(예: 가지치기(pruning))을 지원합니다.

 

2. 결정 트리 평가 및 시각화

마지막으로, 결정 트리 모델의 성능을 평가하고, 혼동 행렬과 분류 리포트를 출력해 봅시다.

 

# 결정 트리 예측 수행
y_pred_tree = tree_model.predict(X_test_scaled)

# 결정 트리 혼동 행렬 시각화
conf_matrix_tree = confusion_matrix(y_test, y_pred_tree)
sns.heatmap(conf_matrix_tree, annot=True, fmt='d', cmap='Oranges')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

# 결정 트리 분류 리포트 출력
print(classification_report(y_test, y_pred_tree))

 

이 코드에서는 결정 트리 모델의 예측 결과를 시각화하고, 각 클래스에 대한 정밀도, 재현율, F1 점수를 확인할 수 있습니다.

 

결정 트리는 매우 직관적이고 해석하기 쉬운 알고리즘이므로, 모델의 예측 과정을 트리 구조로 시각화하면 데이터를 어떻게 분류하는지 쉽게 이해할 수 있습니다.

 

결론

이번 글에서는 파이썬을 사용하여 머신러닝의 기초 개념과 실습을 진행해 보았습니다.

 

로지스틱 회귀, KNN, 결정 트리와 같은 대표적인 분류 알고리즘을 사용하여 데이터를 학습시키고, 그 성능을 평가하는 방법을 배웠습니다.

 

각 알고리즘은 장단점이 있으며, 데이터의 특성에 따라 성능이 달라질 수 있습니다. 따라서 다양한 알고리즘을 실험해보고, 더 복잡한 데이터셋을 사용하여 성능을 최적화하는 과정이 필요합니다.

 

머신러닝에 대한 더 깊은 이해를 위해, 앞으로 더 많은 데이터셋과 다양한 알고리즘을 다루어 보는 것을 추천드립니다.

 

이를 통해 자신만의 프로젝트를 개발하고, 실제 문제를 해결하는 데 머신러닝을 어떻게 적용할 수 있을지 고민해 볼 수 있을 것입니다.

 

 

 

 

 

<함께 읽으면 좋은 글>

머신러닝 데이터 전처리, 효과적인 모델을 위한 필수 단계

 

머신러닝 데이터 전처리, 효과적인 모델을 위한 필수 단계

머신러닝의 성능은 대부분 데이터의 질에 의해 좌우됩니다. 아무리 복잡하고 뛰어난 알고리즘이라도, 데이터가 부정확하거나 잘못된 형식으로 주어지면 좋은 성능을 기대하기 어렵습니다. 이

cocoro11.tistory.com

머신러닝 입문자를 위한 기본 개념 튜토리얼

 

머신러닝 입문자를 위한 기본 개념 튜토리얼

머신러닝(Machine Learning)은 현대 기술에서 필수적인 역할을 하는 분야로, 컴퓨터가 데이터를 통해 패턴을 학습하고 예측을 수행할 수 있도록 하는 기술입니다. 이 기술은 의료, 금융, 마케팅, 자

cocoro11.tistory.com

반응형