Table of Contents
Classification(분류) #
말 그대로 분류를 뜻하는 Classification은 Supervised learning 지도학습의 일종으로 기존에 존재하는 데이터의 category 관계를 파악하고, 새롭게 관측된 데이터의 category를 스스로 판별하는 과정이다. 예를 들어 문자를 판별하여, 스팸 보관함으로 분류하는 것, 수능 점수가 몇 등급에 해당하는지 판별하는 것이 등이 있다. 이처럼 분류는 "스팸" 또는 "스팸 아님"처럼 하나 이상의 관측 데이터를 통해 하나 이상의 분류 값을 예측한다.
분류 방법 #
일련의 데이터가 포함되는 기존 카테고리들을 학습하고 이것을 기반으로 컴퓨터는 데이터의 범주를 구분하여 경계를 나누는 것을 학습한다. 따라서 모델에 입력된 새로운 데이터는 해당 점이 어느 곳에 위치하느냐에 따라 가까운 카테고리 혹은 학습된 알고리즘에 의해 분류하게 된다.
특징 #
선형성 #
많은 기계 학습 알고리즘에서 선형성을 활용하듯이 분류에도 선형판별분석(Linear Discriminant Analysis : LDA)이 존재한다. LDA는 데이터의 분포를 학습해 선형 경계를 만들고 데이터들을 분류하는 모델로 데이터를 직선에 있다고 가정하게 되는데 이는 복잡한 모델을 가지고 분류하는 과정에서 정확성이 떨어질 수 있다.
분류 알고리즘 #
Decision Tree(의사결정 트리) #
가장 단순한 classifier 중 하나로, decision tree와 같은 도구를 활용하여 모델을 그래프로 그리는 매우 단순한 구조로 되어 있다. 이 방식은 root에서부터 적절한 node를 선택하면서 진행하다가 최종 결정을 내리게 되는 model이다. 이 트리의 장점은 누구나 쉽게 이해할 수 있고, 그러므로 누구나 쉽게 사용할 수 있다. 예를 들어 yes를 선택했던 것을 no로 바꾸기만 하면 간단하게 로직을 바꿀 수 있다.
k-nearest neighbor #
k-nearest neighbor는 데이터를 분류하고 새로운 데이터 포인트의 카테고리를 결정할 때 K 개의 가장 가까운 포인트를 선점하고 그중 가장 많이 선택된 포인트의 카테고리로 이 새로운 데이터를 분류하는 방법이다. k-nearest neighbor에서 고려해야 할 사항은 알고리즘의 핵심 부분이 대상 포인트와의 거리에 대한 측정이고, 이를 계산하는 방법으로 무조건 유클리드 거리 측정 방식을 사용하는 것을 자제해야 한다. 모든 데이터 열을 이처럼 같은 방식으로 처리하면 생각하지 못한 변수에 의해 오류가 생길 수 있으므로 거리의 제곱을 합산하기 전 각 카테고리에 대한 평균 거리를 빼고 계산하는 방식과 같은 다양한 거리 계산 알고리즘에 대한 논의가 필요하다. 예를 들어 실수 데이터의 경우 유클리드 거리 측정 방식을 사용하고, 범주형 혹은 이진 데이터와 같은 유형의 데이터는 해밍 거리 측정 방식을 사용한다.
Clustering #
Clustering은 주어진 데이터들의 특성을 고려해 같은 그룹(클러스터)을 정의하고, 다른 클러스터의 개체보다 서로 더 유사한 개체가 되도록 그룹화하여 그룹의 대표성을 찾아내는 방법이다. 즉 클러스터란 비슷한 특성을 가진 데이터들의 집단이다.
Classification VS Clustering #
Classification은 Supervised learning의 형태이며 레이블을 통해 알고리즘을 훈련한다. 이는 이미 구성된 데이터로 얻고자 하는 답을 유도한다. 반면 clustering은 unSupervised learning이며, 레이블이 없는 데이터에서 어떤 관계를 스스로 찾아내는 방법으로 크게 사람의 개입 여부에 차이가 있다.
example #
-
classification을 사용해볼 데이터를 불러온다. from sklearn import datasets iris = datasets.load_iris()
-
iris 데이터는 data와 target의 결과를 array 형태로 반환한다. data은 붓꽃의 각 개체에 대한 정보를 가지고 있다. 0 : sepal length in cm. 1 : sepal width in cm, 2 : petal length in cm 3 : petal width in cm에 해당한다. target은 붓꽃의 유형에 대한 정보를 가지고 있다. 0 : Iris-Setosa, 1 : Iris-Versicolour, 2 : Iris-Virginicad 에 해당하며 아래와 같은 형태를 확인할 수 있다.
`data`: array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2],....]) `target`: array([0, 0,...,1, 1,...,2, 2,...])
-
데이터를 pandas.dataframe에 저장한다.
data = iris.data # we only take the first two features. target = iris.target iris_pd = pd.DataFrame(data,columns=[`sepal length`,`sepal width`,`petal length`,`petal width`]) iris_tr = pd.DataFrame(y,columns=[`target`]) iris_pd[`target`]=iris_tr
num sepal length sepal width petal length petal width target 0 5.1 3.5 1.2 0.8 0 1 5.0 3.6 1.1 0.9 0 ... 60 4.9 3.3 1.0 0.7 1 61 5.0 3.2 1.1 0.8 1 ... 120 6.9 3.2 5.7 2.3 2 121 6.8 3.2 5.1 2.8 2 ... <표1. 데이터 예시>
-
붓꽃의 유형별 컬럼 데이터 평균을 알아보자 import seaborn as sns # 평균측정
sns.boxplot(x=`target`, y=`petal length`, data=iris_pd)
sns.boxplot(x=`target`, y=`sepal length`, data=iris_pd)
sns.boxplot(x=`target`, y=`petal width`, data=iris_pd)
sns.boxplot(x=`target`, y=`sepal width`, data=iris_pd)
-
petal의 값이 종의 구분과 상당히 관련이 있음을 알 수 있다. 조금 더 확실하게 하기 위해 개체마다 관련도를 확인하여 명확한 경계가 나타나는지 확인해 보자
import matplotlib.pyplot as plt sns.FacetGrid(iris_pd, hue=`target`, size=4).\ map(plt.scatter, `petal length`, `petal length`).add_legend()
sns.FacetGrid(iris_pd, hue=`target`, size=4).\ map(plt.scatter, `sepal length`, `sepal length`).add_legend()
sns.FacetGrid(iris_pd, hue=`target`, size=4).\ map(plt.scatter, `petal width`, `petal width`).add_legend()
sns.FacetGrid(iris_pd, hue=`target`, size=4).\ map(plt.scatter, `sepal width`, `sepal width`).add_legend()
-
petal의 width와 length가 상당히 붓꽃 종과 관련 있음을 알 수 있다 이 두 개의 파라미터로 분포를 확인해 보자
sns.FacetGrid(data, hue=`target`, size=6).\ map(plt.scatter, `petallengthcm`, `petalwidthcm`).add_legend()
-
가장 종과 관련된 두 파라미터를 확인하였으니, 이것으로 정확성을 확인해 보자. train_test_split으로 학습데이터와 테스트 데이터를 나누고 knn에 학습을 시켜 테스트 데이터로 정확성을 판단한다.
X_train, X_test, Y_train, Y_test = train_test_split( iris_pd.loc[:, [`petal length`, `petal width`]], iris_pd.loc[:, `target`]) knn = KNeighborsClassifier(n_neighbors=2, p=2, metric=`minkowski`) knn.fit(X_train, Y_train) #훈련데이터, 정답 (학습) print ("Training Accuracy {}".format(knn.score(X_train, Y_train))) print ("Testing Accuracy {}".format(knn.score(X_test, Y_test)))
출력데이터
Training Accuracy 0.9821428571428571 Testing Accuracy 0.9736842105263158
참고문헌 #
- Regression and Classification | Supervised Machine Learning.1
- Difference Between Classification and Clustering.2
- Machine Learning 스터디 (8) Classification Introduction (Decision Tree, Naïve Bayes, KNN).3
- Microsoft Azure Machine Learning을 위한 알고리즘 선택 방법.4
- K-Nearest Neighbors - the Laziest Machine Learning Technique.5
- Iris Classification.6