앞으로 우리가 살펴볼 부분은 머신러닝 알고리즘 중에서 가장 유명한 알고리즘을 배워보고 데이터로부터 어떻게 학습하는지, 어떻게 예측하는지를 살펴볼 것이다. 또한 우리는 이러한 모델들의 모델 복잡도의 개념과 각각의 알고리즘이 어떻게 하나의 모델을 구축하는지를 공부할 것이다.
<Some Sample Datasets>
우리는 서로 다른 알고리즘을 표현하기 위해서 몇개의 데이터 셋을 사용할 것이다.
# generate dataset
!pip install mglearn # !를 사용하면 cmd 창에서 입력한 것과 똑같다.
import mglearn
X, y = mglearn.datasets.make_forge() # 인위적으로 만든 이진 분류 데이터셋
# plot dataset
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
데이터는 총 26개이고, 특징은 총 2개인 것을 확인할 수 있다.
X, y = mglearn.datasets.make_wave(n_samples=40)
plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel("Feature")
plt.ylabel("Target")
우리는 시각화를 쉽게 하기 위해서 간단하고 낮은 차원의 데이터를 사용한다. 첫번째 예시의 경우 두개의 결과 값이 있는데, 이는 보여주기 상대적으로 어렵다. 이렇게 다양하게 데이터를 만들어서 시각화 할 수 있을 뿐만아닐 sklearn에서 제공하는 기본적인 데이터도 많기 때문에 다양한 데이터를 사용해서 여러 머신러닝 알고리즘을 공부해 보자.
<Algorithms 1. K-Nearest Neighbors>
K-Nearest Neighbors 알고리즘은 KNN 알고리즘이라고 불리기도 하는데 최근접 알고리즘이다. 머신러닝에서 가장 간단한 알고리즘이기도 하다. 머신러닝 모델을 만들기 위해서 훈련시킬 데이터만 있으면 되기 때문이다. 세로운 데이터에 대한 예측을 하기 위해서는 이 알고리즘이 해당 데이터에 가장 가까운 데이터를 찾아서 결과값으로 제시할 것이다.
이 간단한 버전은 오직 가장 가까운 이웃 하나만을 고려하는데, 우리가 예측하고자 하는 값에 가장 가까운 데이터의 클래스 값을 결과 값으로 표시한다.
예시) 키와 몸무게에 따라 L인지 S인지 구분하는 프로그램을 구현한다고 가정하자.
data = pd.read_csv('/kaggle/input/dataset-for-knn-classification/TShirt_size.csv') # 데이터 불러오기
height = data['Height (in cms)'].to_numpy() # 키
weight = data['Weight (in kgs)'].to_numpy() # 몸무게
target = data['T Shirt Size'].to_numpy() # 타깃 데이터
large_height = height[0:7] # 타깃중 L인 사람의 분류
large_weight = weight[0:7]
large_target = target[0:7]
small_height = height[7:18] # 타깃중 S인 사람의 분류
small_weight = weight[7:18]
small_target = target[7:18]
plt.scatter(height, weight)
small_data = np.column_stack((small_height, small_weight)) # 작은 사람들의 데이터를 합친다.
large_data = np.column_stack((large_height, large_weight)) # 큰 사람들의 데이터를 합친다.
plt.scatter(small_data[:, 0], small_data[:, 1], marker='^')
plt.scatter(large_data[:, 0], large_data[:, 1], marker='D')
plt.xlabel('Height')
plt.ylabel('Weight')
plt.show()
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
np.concatenate((small_data, large_data)),
np.concatenate((small_target, large_target)),
stratify=np.concatenate((small_target, large_target)),
test_size=0.2)
테스트 사이즈는 0.2정도로 하고, 훈련데이터와 테스트 데이터를 분류한다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
knn 알고리즘을 불러와서 훈련 데이터 셋을 훈련시킨다.
kn.score(test_input, test_target) # 값 1.0
kn.score(train_input, train_target) # 값 0.9285714285714286
훈련 데이터와 테스트 데이터에 대한 정확도를 보면 알 수 있듯이 테스트 데이터의 값은 정확하게 분류해 내지만, 훈련 데이터의 값은 비교적 정확히 판별하지 못하는데 여기서 알 수 있는 것은 해당 모델이 underfitting 되었다고 표현할 수 있다. 데이터가 부족해서, 해당 모델을 잘 훈련시키지 못했다.
하지만 knn 알고리즘의 경우 다음과 같은 과정으로 훈련시키는 것이 대부분이기 때문에 해당 맥락을 알아놓으면 좋을 것이다.
'Artificial Intelligence > Machine Learning' 카테고리의 다른 글
[Machine Learning] Linear Models_Part 1 (0) | 2023.09.06 |
---|---|
[Machine Learning] K-NN Algorithms_Part 2 (0) | 2023.09.05 |
[Machine Learning] K-NN Algorithms_Example (0) | 2023.09.04 |
[Machine Learning] K-NN Algorithms (0) | 2023.09.03 |
[Machine Learning] Supervised Learning_Part 1 (0) | 2023.08.30 |