Scikit-learn은 머신러닝의 다양한 분야에서 널리 사용되는 라이브러리입니다.
Scikit-learn을 사용하면 지도학습(Supervised Learning)과 비지도학습(Unsupervised Learning)을 비롯하여, 다양한 머신러닝 모델을 쉽게 구현하고 테스트할 수 있습니다.
이번 포스팅에서는 Scikit-learn을 사용하여 분류(Classification)와 회귀 예측(Regression)을 수행하는 방법에 대해 다룰 예정입니다.
분류(Classification)
분류는 머신러닝에서 가장 기본적인 문제 중 하나입니다. 분류 문제는 미리 정의된 카테고리(또는 클래스) 중 하나에 데이터 포인트를 할당하는 문제입니다.
예를 들어, 이메일이 스팸 메일인지 아닌지를 판단하는 문제나, 고객이 제품을 구매할지 말지 예측하는 문제 등이 이에 해당됩니다.
분류 예제
아래는 Scikit-learn의 load_iris 데이터셋을 사용한 붓꽃(Iris) 분류 문제 예제입니다. 이 문제에서는 붓꽃의 꽃잎과 꽃받침의 크기를 기반으로 붓꽃의 종류를 분류합니다.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 모델 학습
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# 모델 예측
y_pred = model.predict(X_test)
# 모델 평가
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
분류 알고리즘
Scikit-learn에서 제공하는 분류 알고리즘으로는 Decision Tree, Random Forest, K-Nearest Neighbor(KNN), Support Vector Machine(SVM), Neural Network 등이 있습니다.
이 중에서 Decision Tree 알고리즘을 사용한 분류 모델을 위 예제에서 구현했습니다.
분류 알고리즘은 지도 학습(Supervised Learning) 방법 중 하나로, 입력 데이터와 출력 데이터 사이의 관계를 학습하여 새로운 입력 데이터에 대한 출력 값을 예측하는 모델을 만드는 방법입니다.
Scikit-learn은 분류 알고리즘을 구현한 다양한 모듈과 함수를 제공합니다.
이번 포스팅에서는 Scikit-learn의 분류 알고리즘 중에서 대표적인 몇 가지를 살펴보고, 간단한 샘플 코드와 함께 설명하겠습니다.
K-최근접 이웃 알고리즘 (K-Nearest Neighbors, KNN)
KNN 알고리즘은 가장 간단하고 직관적인 분류 알고리즘 중 하나입니다.
KNN은 새로운 데이터가 들어왔을 때 가장 가까운 거리에 있는 K개의 데이터를 찾아 이들의 클래스 중 가장 많은 것으로 새로운 데이터의 클래스를 결정하는 방법입니다.
이때 거리 측정 방법으로는 유클리드 거리(Euclidean Distance)가 일반적으로 사용됩니다.
from sklearn.neighbors import KNeighborsClassifier
# KNN 모델 객체 생성
knn = KNeighborsClassifier(n_neighbors=5)
# 모델 학습
knn.fit(X_train, y_train)
# 모델 예측
y_pred = knn.predict(X_test)
의사결정나무 알고리즘 (Decision Tree)
의사결정나무는 분류 및 회귀 분석에 사용되는 모델로, 스무고개 게임과 비슷한 방식으로 동작합니다.
의사결정나무는 주어진 데이터를 가장 잘 구분할 수 있는 변수를 찾아 이를 기준으로 하위 분기를 생성하며, 이 과정을 반복하여 최종적으로 데이터를 분류합니다.
from sklearn.tree import DecisionTreeClassifier
# 의사결정나무 모델 객체 생성
dt = DecisionTreeClassifier()
# 모델 학습
dt.fit(X_train, y_train)
# 모델 예측
y_pred = dt.predict(X_test)
로지스틱 회귀 알고리즘
로지스틱 회귀는 이진 분류(binary classification) 모델로, 주어진 입력 변수에 대해 이진 결과를 출력하는 모델입니다.
먼저 필요한 라이브러리와 데이터셋을 불러옵니다.
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=42)
데이터셋은 iris 데이터셋을 사용합니다. 데이터셋을 로드하고, train_test_split 함수를 사용하여 데이터를 train set과 test set으로 나눕니다.
이제 로지스틱 회귀 모델을 학습시켜보겠습니다.
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
로지스틱 회귀 모델은 선형 회귀 모델과 비슷하게 동작하지만, 예측 결과를 0과 1 사이의 값으로 제한합니다. 따라서 이진 분류 문제에 적합합니다.
학습된 모델을 사용하여 예측을 수행해보겠습니다.
y_pred = logreg.predict(X_test)
마지막으로, 예측 결과를 평가해보겠습니다.
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
Accuracy를 출력해보면, 이 모델의 정확도가 97% 정도라는 것을 알 수 있습니다.
이처럼 scikit-learn 모듈을 사용하여 간단하게 머신 러닝 모델을 구현할 수 있습니다.
이외에도 다양한 알고리즘과 기능들이 제공되므로, 적절한 알고리즘과 하이퍼파라미터를 선택하여 모델을 구현하면 됩니다.
랜덤 포레스트(Random Forest)
의사결정나무(Decision Tree) 모델을 여러 개 결합한 앙상블(Ensemble) 모델로, 대표적인 분류 모델 중 하나입니다.
Scikit-learn에서 제공하는 RandomForestClassifier를 사용하여 랜덤 포레스트 모델을 구현할 수 있습니다.
이전의 분류 모델과 마찬가지로, 먼저 데이터를 로드하고 전처리합니다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 데이터 로드
iris = load_iris()
# 특징 변수와 클래스 변수 지정
X = iris.data
y = iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
다음으로, RandomForestClassifier를 정의하고 모델을 학습합니다.
# 랜덤 포레스트 모델 정의
rfc = RandomForestClassifier(n_estimators=100, random_state=42)
# 모델 학습
rfc.fit(X_train, y_train)
RandomForestClassifier의 가장 중요한 하이퍼파라미터는 n_estimators로, 앙상블에 사용할 의사결정나무의 개수를 지정합니다.
random_state는 의사결정나무에서와 마찬가지로 모델의 랜덤 시드를 지정하는 파라미터입니다.
모델을 학습한 후, 예측을 수행하고 정확도를 계산할 수 있습니다.
# 모델 예측
y_pred = rfc.predict(X_test)
# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
랜덤 포레스트 모델은 다양한 하이퍼파라미터를 조정하여 성능을 개선할 수 있습니다.
대표적으로, max_depth는 각 의사결정나무의 최대 깊이를 지정하는 파라미터이며, max_features는 각 노드에서 분할에 사용될 특징 변수의 개수를 지정하는 파라미터입니다.
이 외에도 다양한 하이퍼파라미터를 조정할 수 있습니다.
'데이터 분석 > 머신러닝' 카테고리의 다른 글
Chat GPT는 어떻게 만들어졌을까? (0) | 2023.04.10 |
---|---|
Transformer 모델이란? (0) | 2023.04.10 |
머신러닝 알고리즘과 특성 소개 (0) | 2023.03.15 |
PyTorch RNN 모델 경로 예측/완성 (샘플 코드) (0) | 2023.02.23 |
RNN LSTM 모델 문장 완성 / 각 아이템의 확률 예측 (샘플 코드) (0) | 2023.02.23 |