classification models

분류모형

분류(classification)는 독립 변수 값이 주어졌을 때 그 독립 변수 값과 가장 연관성이 큰 종속변수 카테고리(클래스)를 계산하는 문제이다.

분류 모형의 종류

  • 판별함수(discriminant function) 모형

    : 주어진 데이터를 서로 다른 영역으로 나누는 경계면을 찾는다.

  • 확률적 모형

    • 확률적 판별(discriminative) 모형

      : 주어진 데이터가 특정 카테고리일 조건부확률을 직접 계산한다.

    • 확률적 생성(generative) 모형

      : 주어진 데이터가 특정 카테고리일 조건부확률을 베이즈정리를 통해 계산한다.

모형 방법론
Linear/Quadratic Discriminant Analysis 확률적 생성 모형
나이브 베이지안 (Naive Bayes) 확률적 생성 모형
로지스틱 회귀 (Logistic Regression) 확률적 판별 모형
의사결정나무 (Decision Tree) 확률적 판별 모형
퍼셉트론 (Perceptron) 판별함수 모형
서포트 벡터 머신 (Support Vector Machine) 판별함수 모형
신경망 (Neural Network) 판별함수 모형

1. 확률적 모형

1) 확률적 생성모형

조건부확률 기반 생성모형의 장점 중 하나는 클래스가 3개 이상인 경우에도 바로 적용할 수 있다는 점이다.

생성모형은 더 구하기 쉬운 클래스별 특징 데이터의 확률분포 $ P(x | y = k) $, 즉 가능도를 먼저 추정한 다음 베이즈 정리를 사용하여 $ P(y = k | x) $ 를 계산한다.

또한 전체확률의 법칙을 이용하여 $ P(x) $ 를 구할 수 있다. 이 값을 알면 x라는 데이터만 입력되어도 그 데이터 자체가 정상적인 데이터인지 아닌지 판단할 수 있다.

확률적 생성모형의 예로 QDA와 Naive Bayesian model이 있다.

  • QDA

    QDA(Quadratic Discriminant Analysis)에서는 다음과 같은 코드로 분류문제를 푼다.

1
2
3
4
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
model = QuadraticDiscriminantAnalysis().fit(X, y)
test_data = [[0.2, 0.2]]
p = model.predict_proba(test_data)

  • 나이브 베이지안 모형**

    TfidfVectorizer 전처리기는 텍스트 데이터를 BoW에 따라 실수 벡터로 변환한다.

    MultinomialNB 모형은 나이브 베이즈 방법으로 분류 문제를 예측한다.

    Pipeline을 사용하여 이 두 클래스 객체를 하나의 모형으로 합친다.

1
2
3
4
5
6
7
8
9
10
11
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

news = fetch_20newsgroups(subset="all")
model = Pipeline([
('vect', TfidfVectorizer(stop_words="english")),
('nb', MultinomialNB()),
])
model.fit(news.data, news.target)

​ 20개의 클래스 중 3번 클래스에 가장 높은 조건부확률을 갖기 때문에 3번째 클래스에 해당한다고 판별한다.

2) 확률적 판별 모형

확률적 생성 모형과 달리 확률적 판별 모형에서는 조건부확률 $ p(y = 1 | x) $ 가 x값에 따라 0에서 1 사이에서 달라지는 값을 갖는 함수라고 가정하고, 그 함수를 직접 찾아낸다.

​ 확률적 판별 모형에는 로지스틱 회귀모형과 의사결정나무가 있다.


- **로지스틱** **회귀모형**

1
2
3
4
5
6
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression

X0, y = make_classification(n_features=1, n_redundant=0,
n_informative=1, n_clusters_per_class=1, random_state=4)
model = LogisticRegression().fit(X0, y)





​ ### 2. 판별함수 기반 모형

​ 판별함수 기반 모형은 클래스의 영역을 나누는 경계면 혹은 경계선 함수 $ f(x) $ 를 정의하고, 이 판별함수 값의 부호에 따라 클래스가 나뉘어진다.


​ scikit-learn에서는 decision_function메서드를 통해 판별함수 값을 출력할 수 있다.

​ 판별함수기반 모형으로는 퍼셉트론과 커널 SVM이 있다.



​ - 퍼셉트론

​ 가장 단순한 판별함수 모형으로, 두 개의 클래스만 구분해낼 수 있으며 직선으로 구분되는 경계선만을 찾아낸다.

1
2
3
4
5
6
7
8
9
from sklearn.linear_model import Perceptron
from sklearn.datasets import load_iris
​ iris = load_iris()
​ idx = np.in1d(iris.target, [0, 2])
​ X = iris.data[idx, 0:2]
​ y = iris.target[idx]

​ model = Perceptron(max_iter=100, eta0=0.1, random_state=1).fit(X, y)






​ 만약 데이터가 3차원이라면 경계선이 아닌 경계면(boundary surface)를 갖게 된다. 경계면 혹은 경계선을 decision hyperplane 이라고 한다.





​ - 커널 SVM

​ 직선인 경계면밖에 구분하지 못하는 퍼셉트론과 달리 곡선인 경계면을 찾아낼수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn import svm

​ xx, yy = np.meshgrid(np.linspace(-3, 3, 500),
​ np.linspace(-3, 3, 500))
​ np.random.seed(0)
​ X = np.random.randn(300, 2)
​ Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)

​ model = svm.NuSVC().fit(X, Y)
​ Z = model.decision_function(np.c_[xx.ravel(), yy.ravel()])
​ Z = Z.reshape(xx.shape)





Share