Introduction


 

DecisionTree에는 Classification Tree 와 Regression Tree 문제가 있다.

 

Classification Tree 는 여자인지 남자인지 개인지 고양이인지를 예측한다.

Regression Tree은 사람의 급여나 외부 온도등을 예측한다.

 

이번에는 Classification Tree 를 공부할 것이다.

 

Decision Tree


 

만약 아래같은 데이터셋이있을때 녹색 카테고리와 빨간 카테고리를 분류하는 모델을 만들기 위해 여러 분할을 거치는 ㅓㄱㅅ이다.

여기서는 3번의 분할이 있었다.

 

첫번째 분할은 X2가 60 보다 이상인 수와 작은 수를 분할하였다.

다음 분할은 X1이 50보다 작은지 큰지를 분할하였다.

다음 분할3은 X1을 70보다 큰지 작은지를 분할하였다.

다음 분할4도 예측할 수 있을 것이다. 저기 녹색과 빨강을 분할할 만한 대략 20 지점에서 분할을 하면 된다.

 

 

우리가 겪은 분할 과정을 Decision Tree 로 나타내면 이렇다.

 

 

 

 

 

Decision Tree 는 아주 오래된 방법이다. 그래서 최근에는 잘 안쓰이다가 최근에 정교한 방법으로 업그레이드 되어 다시 자주 쓰이게 되었다.

이 업그레이드된 방법에는 

Random Forest , Gradient Boosting 등이 있다.

몇몇 알고리즘은 아이폰 페이스인식에도 사용된다. 

 

 

 

 

실습


 

STEP 1) 라이브러리 ,데이터셋 호출

언제나 그랬듯 라이브러리들을 임포트해준다.

numpy, matplotlib, pandas 를 임포트한다.

다음은 우리의 데이터셋을 불러온 후 X에는 독립변수, y 에는 종속변수를 담는다.

X = dataset.iloc[:, :-1].values

y = dataset.iloc[:, -1].values 

이다. 캡처 찍을때 실수해버렸다..

 

이번 데이터셋은 저번에 사용했던 것으로

 

나이와 봉급에 따른 SUV 구매여부를 나타낸 표이다.

 

STEP 2) 데이터 전처리

우선 sklearn의 model_selection 모듈에서 train_test_split 를 임포트한다. 이를 통해 훈련 데이터와 테스트 데이터를 분리한다.

아까 데이터에서 봤듯이 나이는 0-100사이인 반면, 봉급은 매우 높은 수치이다. 이럴때 필요한 데이터 전처리 과정으로 Feature Scaling 이 있다. sklearn에서 preprocessing 모듈에서 StandardScaler 클래스를 임포트한다. 그 후 트레인 데이터에 맞게 변형해준후 테스트 데이터도 변형한다.

 

 

STEP 3) 모델 학습

 

https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

 

sklearn.tree.DecisionTreeClassifier

Examples using sklearn.tree.DecisionTreeClassifier: Release Highlights for scikit-learn 1.3 Classifier comparison Plot the decision surface of decision trees trained on the iris dataset Post prunin...

scikit-learn.org

sklearn.tree 모듈에서 DecisionTreeClassifier 클래스를 임포트한다.

criterion 은 entropy 로 설정하고 random_state 는 0으로 설정하여 classifier 객체를 만든다.

그 후 X_train, y_train 을 fit하여 훈련시킨다.

 

criterion 은 우리가 최소화 또는 최대화 시키길 원하는 함수를 말한다. 비용함수 또는 오차함수라고도 말하며 최소화 하고자하는 목적함수를 특별히 칭하는 용어이다. 

 

여기서 entropy는 의사결정트리는 가지고 있는 데이터에서 어떤 기준으로 나눴을 때 나누기 전보다 엔트로피가 감소하는 지를 따진다. 만약 감소하면 모델 내부에서는 정보 이득을 얻었다고 본다.

우리는 criterion 을 entropy로 설정했는데 이는 엔트로피를 최소화하고자하는 것이다.

다음은 테스트 결과 예측을 위해 

classifier.predict(X_test) 를 통해 테스트 셋에 대해 예측을 한후 y_pred 에 담는다.

 

 

STEP 4) 평가하기

다음은 모델의 정확도를 평가하기 위해 혼잡 행렬을 그려볼 것이다.

sklearn.metrics 모듈에서 confusion_matrix와 accuracy_score 을 임포트한다. 그리고 y_test, y_pred 를 confusion_matrix 의 인자로 담고 출력한다. 다음과 같은 매트릭스를 얻을 수 있었다.

accuracy_score(y_test, y_pred) 를 통해 정확도도 출력해보자

 

 

그래프로 모델의 예측값과 실제 밸류를 그려보자

다음과 같은 결과를 얻을 수 있었다.

728x90

 

Nonlinear regression 


input과 output 의 관계가 꼭 선형이라고 할 수 없다. linear model 을 넘어서는 무언가가 필요해진다.

그러기 위한 가장 쉬운 방법은 선형 모델에서 다항식 모델로 넘어가는 것이다. 

 

 

만약 차수가 늘어나면 담을 수 있는 파라미터가 늘어나므로 모델의 capacity가 늘어난다고 할 수 있다. 이는  반대로 일반화된 새로운 결과에 대한 성능을 잃어버릴 수도 있다. 

만약 9차가 된다면 새로운 데이터가 들어왔을때 예측하기 어렵다.

 

그런데 이제 딱 맞는 차수를 찾는 건 어려운 문제이다. 그래서 충분할 정도로 차수를 높인 후 규제를 가하는 방법을 자주 쓴다.

 

 

Regularization 

 


 

 

이제 nonlinear Regression 메소드들을 한 가지씩 살펴보자

 

K-NN Regression


k-nearest neighbor 이라는 뜻으로 k개의 가까운 이웃을 보고 판단하는 것이다. 

만약 k 가 3이라면 가장 가까운 3개를 보고 값들의 평균값으로 y값을 예측한다. 

예측 규칙에는 평균을 내는 방법도 있고 가중치를 줄 수도 있다. 더 가까운 쪽에는 비중을 높이거나 하는 일 말이다. 

만약 k가 작다면 가장 가까운값만 보기 때문에 그 해당값이 조금 튀는 값이라면 새로운 값도 그 편차에 영향을 받을 수 있다. 새로운 값에 대한 성능도 떨어질 수 있다.

그렇다고 만약 k 를 키운다면 근처의 너무 많은 값을 보게 되어 오히려 일반적인 경향을 따라가지 못하는 문제가 생길 수 있다. 극단적인 예시로 데이터가 30개인데 k를 30으로 한다면 전체의 평균값으로 예측하게 된다. 

 

이 K-NN 알고리즘은 Classification 에서도 사용할 수 있다.

 

 

 

 

 

Decisoion tree regression


 

결정 트리라고 불리는 이 알고리즘은 몇 가지 분기를 생성하여 값을 분류하고 분류해서 데이터를 정한다. 

이 알고리즘 또한 Classification 에서도 사용할 수 있다.

 

 

 

 

 

 

Nueral network regression


 

여러 인자들에 적당한 가중치를 곱해가며 가장 예측을 잘하는 모델을 생성한다. 

hidden layer 가 많이 늘어난다면 deep neural network 이다.

 

 

 

Support vector regression


 

Support Vector Machine 은 분류(classification), 회귀(regression), 특이점 판별(outliers detection) 에 쓰이는 지도 학습 머신 러닝 방법 중 하나이다.

SVM 에는 

 1. SVR : Support Vector Regression

 2. SVC : Support Vector Classification 

 

두 개의 종류가 있다. 1번은 수치를 예측하는 Regression 이고 2번은 카테고리를 예측하는 Classification 이다.

 

SVC 은 아래 그림처럼

margin사이에 다른 데이터가 분포하고, 게다가 boundary를 넘어서 다른 집단의 데이터가 분포한다. 이러한 경우는 일반적인 데이터에 매우 많이 존재한다. 오히려 깔끔하게 boudary에 따라 분리되는 데이터를 찾는 경우가 더 힘들수도 있다.

 SVM은 이러한 데이터의 경우를 생각하여, 적당한 error를 허용하며, 이러한 error를 최소화하는 boundary를 결정하는 것이다. 그리고 error를 정할 경우 모든 점들을 고려하는 것이 아니라, 선택된 점들만을 선정하여 영향을 끼칠 점과 끼치지 않을 점을 구분한다.

 

 

 

이와 달리 SVR은 일정 Margin의 범위를 넘어선 점들에 대한 error를 기준으로 model cost를 계산한다. 아래 그림으로 본다면 margin 바깥에 위치한 점들과 차이를 계산하는 빨간선이 곧 한 점에 있어서 error로 계산되는 것이다.

 

 

 

 

 

728x90

 

 

 

Introduction


 

Bayes' Theorem 

스패너 예시로 이해해보자. 우리는  공장에 있다고 가정하자. 공장에는 두 대의 기계가 있다. 두 기계는 모두 스패너를 생산한다. 스패너에는 어느 기계에서 만들었는지 확인할 수 있게 되어있다. 스패너에는 고장이 있는 불량 스패너가 생산될 수도 있다. 우리는 여기서 머신1,2에서 각각 불량이 나올 확률을 구하고 싶다.

 

우리는 머신1이 시간에 30개의 스패너를 생산하고 머신2가 1시간에 20개의 스패너를 생산한다는 사실을 알고 있다.

그리고 전체 생산품중에 불량품은 1%라는 사실을 알고 있으며,

그리고 우리는 불량품의 50%는 머신1에서 왔고 나머지 50%는 머신2에서 왔다는 사실을 알고 있다. 

 

그렇다면 머신2에서 생산된 스패너가 불량품일 확률은 어떻게 될까?

 

여기에 베이즈 정리가 사용된다.

 

위에서 우리가 알고있는 정보를 우선 수학적으로 정리해보자.

P(mach1), P(mach2) : 전체 생산품에서 머신1(2) 일 확률

P(defect) : 전체 생산품에서 불량품일 확률 

P(Mach1 | Defect) : 불량품중에서 머신1일 확률

 

구하고 싶은 것은 머신2중에서 결함이 있을 확률로 P(defect|mach2) 로 나타낼 수 있다.

그러나 이에 대한 정보는 갖고 있지 않다 .

그러므로 베이즈 정리에 의해 다른 알고있는 정보들로 해당 정보를 알아내는 것이다.

아래 공식에 대입한다면

머신2중에 불량품일 확률은 전체 중 머신2일 확률, 전체중 불량일 확률, 불량품 중 머신2일 확률 로 알아낼 수 있다.

 

 

머신러닝 알고리즘에 적용하기 위해 다음과 같은 예시로 공부해보자

그래프에서 y축은 봉급, x축은 나이이고, 녹색은 운전하해서 출근하는 사람, 빨강은 걸어서 출근하는 사람이다.

 

만약 새로운 데이터가 들어왔을때 다음과 같은 위치에 위치한다고 하자

이 사람은 걸어갈지 운전을 할지 기존 데이터에 기반해서 예측하고 싶다.

 

 

아까 배운 베이즈 정리에 대입해보자

왼쪽 사진은 X의 특징을 가진 데이터 포인트가 걸어서 출근할 확률. / 오른쪽은 X를 가진 데이터 포인트가 운전할 확률이다.

 

 

 

이 두개의 확률을 비교하여 이 사람이 걸어다닐지 운전할지를 예측하는 것이다.

우리가 그래프에서 어떤 원을 잡을 때 이 원에 속하는 사람은 비슷한 데이터셋으로 분류됨을 가정한다. 원을 어떻게 잡느냐에 따라 결과가 다를 수 있음을 의미한다.

1. P(Walks) 는 전체 점 중 빨강일 확률로 여기 예시에선 10/30이다.

2. P(X) 라는게 이해가 잘 안갈 수 있다. P(X) 는 임의의 점이 해당 원에 속할 확률, 즉 데이터집합에 새로운 점을 추가할 확률로 잡을 수 있다. 

여기서는 전체 관측 점 30개 중 해당 원에 속하는 점들의 수 4개 이므로, 4/30 이다.

 

 

3. P(X|Walks) 는 걷는 사람중 X에 속할 확률로 여기서는 빨간점 중 X일 확률이다.

빨간점 10개중 원에 속하는건 3개이므로 3/10 이다.

 

이제 여기서 4번 Posterior Probability 을 구할 수 있다. P(Drivers|X) 도 비슷하게 구할 수 있다.

구해보면 특징 X를 가진 사람이 걸어올 확률은 0.75 운전해올 확률은 0.25이다.

 

이 사람은 걸어서 올 확률이 더 크므로 빨간점으로 예측될 것이다.

 

 

 

 

여기서 한 가지 궁금증이 생긴다.

 

이 정리는 왜 Naive 라고 불릴까?

베이즈 정리는 몇 가지 독립적인 가정을 필요로 하고, 거기에 의존하기 때문에 Naive 하다고 한다. 위 예시에서 우리는 Salary 와 Age 로 걸어서 출근하는 사람과 운전해서 출근하는 사람을 확률로 구별하는 방법을 구했다.

이때 베이즈 정리에서는 나이와 봉급이 우리가 작업하는 변수와 독립적이어야 할 것을 요구한다. 봉급은 독립적이어야하고, 나이도 독립적이어야 한다.

그러나 실제 상황에서는 일반적으로 나이가 들면 봉급이 증가한다. 아주 강한 상관관계는 아니겠지만 베이즈 정리의 가정에는 어긋나므로 실제로는 아니지만 적용하기 때문에 Naive Baysian 이라고 지칭한다. 순진한 가정이기에 순진하다고 하는것 !

 

 

 

 

Naive Baysian Classifier 실습


 

 

STEP 1 : 라이브러리 호출, 데이터셋 임포트하기

구글 코랩에 들어가서 numpy, matplotlib.pyplot, pandas 모듈을 호출한다.

 

데이터셋을 데이터변수에 담은 뒤 독립변수는 X 에 종속변수는 y 에 담는다.

내가 사용한 데이터셋은 이것으로, Age, Salary 와 구매 여부가 나와 있다.

 

 

STEP 2 : 데이터셋을 트레이닝셋과 테스트 셋으로 분리한 후 , Feature Scaling 진행하기

 

우선 sklearn의 model_selection 모듈에서 train_test_split 클래스를 호출한다.

그 후 , X_trian, X_test, y_train, y_test 에 각각 트레인 테스트를 분리하여 담는다. 테스트 사이즈는 0.25로 정한다.

 

우리의 데이터를 보면 나이는 0-100 사이 지만 봉급은 그보다 훨씬 높은 수치라는 것을 알 수 있다 이럴땐 feature scaing 이 필요하다. 나이가 5살 늘어난것과 봉급이 5원 늘어난 건 다르듯이..

 

sklearn의 preprocessing 모듈에서 StandardScaler 클래스를 임포트한다. 그 후 X_train 에 맞게 fit_transform 한 후 다시 변수에 담는다. X_test 도 잊지 않고 transform 해준다.

 

STEP3 : 모델을 훈련시키고 confusion matrix 을 생성한다.

sklearn 에서 naive_bayes 모듈에서 GaussianNB 를 호출한다.

model 에 GaussianNB 객체를 넣은 뒤 이 모델을 훈련시킨다. X_train 과 y_train 으로 모델을 훈련시킨다.

 

 

그 후 sklearn의 metrics 에서 confusion_matrix 와 accuracy_score 을 호출한다.

y_pred 에는 X_test 에 대한 예측 결과를 넣는다. (model.predict(X_test))

그 후 컨퓨전매트릭스 객체를 생성한다. 인자로는 예측값과 실제값을 넣으면 된다.

매트릭스를 출력한뒤, 정확도도 출력해본다.

정확도는 0.9 인것을 확인할 수 있다. 아래 컨퓨전 매트릭스를 참고하면 

실제로 1인데 1로 예측한것 65 / 실제론 1인데 0으로 예측함 3 / 실제로 0인데 1로 예측함 7 / 실제로 0인데 0으로 예측함 25 / 

로 정확도 = 65+25 / (65+25+3+7) = 90/100 으로 0.9가 맞게 나온 것을 확인할 수 있다.

728x90

 

 

 

분류 문제를 풀 수 있는 가장 간단한 방법인 Bayesian Classifier를 먼저 살펴보자

 

분류 문제에는 

0이냐 1이냐와 같은 간단한 문제 Binary Classification

와 0~9 중 어느것이냐 와 같은 Multiple Classification

0~9중 어느것이냐(답은 여러 개)와 같은 Multi layer Classification 

가 있는데 우선 Binary 부터 살펴볼 예정이다.

 

 

 

 

Introduction

 


Salman-Sea Bass Problem

: 우리는 물고기를 연어인지  농어인지 분류하고 싶다.

 - Option1 : 인간의 노력

 - Option2 : 자동 시스템

 

 

 

물고기를 컨베이너 벨트에 보내고 카메라로 찍어서 정보를 넣고  라벨링을 한다. 

사람이 분류된 모델이 맞으면 맞다 틀리면 틀리다. 판단을 해준다.

 

 

그 결과 무게와 너비 인자를 통해 두 개의 카테고리로 분류하는 모델을 만들 것이다.

 

 

물고기에 대한 정보를 무게와 너비 두개의 벡터로 나타낼 것이다.

 

 

 

우리가 알고싶은 것은 확률 정보를 알고자 하는 것이다

클래스 j 에 속할 확률을 P(wj|x)로 나타낼 수 있다.

 

만약 w1 일 확율이 w2 일 확률보다 크다면 데이터 x는 클래스 1에 속할 가능성이 높다.

 

 

여기서 Bayes' Formula 가 활용된다.

 

Bayes' Formula 는 B에서 A 가 일어날 확률로 두 확률 변수의 사전 확률과 사후 확률 사이의 관계를 나타내는 정리다.

 

 

Bayesian Classifier 에 적용한다면

 

주어진 x 에 대한 클래스 j에 속하게 될 확률이 된다.

 

 

Prior

P(wj) 전체 분포 확률을 의미한다.

구하고자 하는 대상 자체에 대한 확률로

사전에 알고 있다고 가정하는 확률이다.

예를 들어 P(Salmon)는 노르웨이 바다에서 연어가 있을 확률이 된다.

 

Likelihood

Likelihood는

관찰된 데이터에 대한 확률로 class- conditional 확률이라고 불린다.

구하고자 하는 대상이 정해졌다고 가정할 때, 주어진 대상이 나올 확률이다.

예를 들어 P(x=5|Salmon) 연어 전체 중에 x 값이 5일 확률이다.

이미 존재하는 데이터를 통해 얻을 수 있는 값이다.

 

 

Posterior

계산한 값이다. classificaiton의 확률이다. prior과 likelihood에 기반하여 결정되는 값이다.

Decision = Likelihood * Prior 

 

posterior에 기반한 결정은 이 두 가지를 고려하기 때문에 사람의 결정방식과 유사하다.

지금의 observation만 고려하는 것이 아닌 이전의 observation을 고려하는 것이다.

 

 

결정할 때 Posterior 가 더 큰 쪽으로 결정하고 나머지 한쪽은 에러가 된다.

 

 

 

Parameter Estimation


 

 

 

 

 

728x90

 

 

유데미 강의를 다시 듣기 시작했다.

 

지난 번에는 Regression 을 배웠고 이제 Classification 이다.

 

 

Classification

 

Classification 은 학습 데이터에 근거해서 새로운 관찰을 얻는 머신러닝 테크닉이다. 이 관찰은 카테고리이다. Regression 에서는 

실수 값을 얻는 머신러닝 테크닉이었다.

 

이 Classification 은 이미지 인식에 사용된다. 사진을 보고 개인지 고양이인지 판단하는 일 같은 것 말이다.

 

 

Logistic Regressinon 은 수많은 독립 변수에 근거해서 카테고리의 종속 변수를 예측한다.

예를들어 Age 에 따른 의료 보험 가입 여부를 예측하거나 할 때 사용된다.

 

Linear Regression 은 예측을 위해 데이터를 통한 선을 그렸었다. Logistic Regression 은 선을 그어서는 구하기 어렵다. 

 

 

아까 예시에서 독립 변수인 나이와 종속 변수인 보험 구매 여부에 대한 데이터를 통해 학습을 시켜 오른쪽과 같은 Logistic Regression 곡선이 나왔다고 하자. 구매하지 않는다는 0 구매한다는 1의 값이다. 

 

예를 들어 35세와 45세의 보험 구매 여부를 예측할때 35살은 왼쪽 방정식에 의하면 42%이고 45세는 81%로 35세는 구매하지 않을 것이고 45살은 구매할 것으로 예측할 수 있다.

 

Logistic Regression 은 여러 독립 변수를 가질 수 있다.

Age 뿐만 아니라 소득, 교육수준, 가족인지 싱글인지 와 같은 요소들 말이다.

독립 변수가 많아진다면 Logistic 방정식도 다음처럼 된다.

 

위 그래프가 데이터에 맞는 곡선인지 어떻게 알 수 있을까?

 

 

Maximum Likelihood

 

Likelihood는 어떤일이 발생할 가능성이다.

Maximum Likilihood 를 통해  모든 가능성 중에 우리의 모델에 가장 적합한 모델을 찾을 수 있다.

아까 예시에서 그래프에 있는 파란점은 보험에 가입한 사람과 연령을 나타내고 빨간점은 가입하지 않은 사람과 연령을 나타낸다.

각각의 확률을 구했을때 19세가 구입할 확률은 0.01이다. 해당 점은 구입하지 않았는데 구입하지 않을 확률은 0.99 가 된다.

이런식으로 모든 점에 대해 구하고

Likelihood 는 해당 점들에 대한 확률을 모두 곱한다.

Likelihood 로 최적의 value 를 얻을 수 있다. Likelihood 를 살펴보며 우리의 모델에 가장 맞는 모델을 찾는다.

 

Best Curve <= Maximum Likelihood 이다.

 

 

 

실습

 

Logistic Regression 에 대한 구글 코랩 실습 자료에 들어간다.

먼저 데이터를 살펴보면

Age와 Salary 데이터와  SUV 자동차 구매 여부에 관한 표이다.

우리의 목적은 나이와 추정봉급에 따른 SUV 구매 여부를 예측하는 것이다.

독립변수는 나이와 추정봉급이 되고, 종속 변수가 구매 여부가 된다. 0이 구매하지 않음을 1이 구매했음을 나타낸다.

데이터에 대한 observation이 되었다면 

구글 코랩으로 들어가자.

우선 필요한 라이브러리를 임포트해준다. numpy, matplotlib.pyplot , pandas 를 임포트 해주었다.

 

그 후 우리의 데이터셋을 dataset 변수에 담았다. 

pd.read_csv() 메소드를 활용한다.

 

x 에는 독립 변수들을 담고 y 에는 종속 변수를 담는다.

dataset.iloc[:,:-1].values 는 데이터셋에서 행은 모든 행을, 열은 마지막을 제외한 열을 담는 것을 의미한다. 이게 무엇이냐면 

마지막 열에는 종속 변수에 대한 value 들이 존재하므로 이것을 제외하고 다른 독립 변수들의 value 들을 담는 것을 의미한다.

y 에는 마지막 value 들만 담으므로 종속변수 밸류가 담긴 것을 알 수 있다.

 

 

다음은 데이터를 트레인 셋과 테스트 셋으로 분류한다. test_size를 0.2 로 하여 전체의 20퍼센트는 테스트셋으로 쓴다.

x_train, x_test, y_train, y_test 에는 해당 메소드를 통해  train , test 값들이 분류되어 들어간다.

 

 

다음은 Feature Scaling 을 해주었다. 이 과정은 데이터의 특징이나 독립 변수의 구간을 표준화해준다. 우리의 데이터들을 보면

Age는 0에서 100 사이지만 봉급은 만단위이다.

이렇게 10살에서 20살 차이와 돈이 10,000원에서 10,020원이 되는 것은 천지차이이다. 따라서 표준화 과정이 필요하다.

 

sklearn.preprocessing 에서 StandardScaler 를 임포트해준후 x_train 을 표준화 시킨 값으로 다시 넣어준다.

x_train 에는 독립 변수들만 들어가고 둘 다 표준화가 필요하므로 따로 인덱싱은 해주지 않는다.

print(x_train)을 통해 확인한 결과 값이 Featrue Scaling 이 잘 된것을 확인할 수 있다. 

 

다음은 Logistic Regression 모델로 훈련시켜야한다. 이때 사용하는게 scikit-learn 인데 다음 사이트에서 확인할 수 있다.

 

https://scikit-learn.org/stable/

 

scikit-learn: machine learning in Python — scikit-learn 1.3.0 documentation

Model selection Comparing, validating and choosing parameters and models. Applications: Improved accuracy via parameter tuning Algorithms: grid search, cross validation, metrics, and more...

scikit-learn.org

 

sklearn.linear_model 모듈에서 LogisticRegression 클래스를 임포트해서 객체를 생성한다.

그 후 모델에 데이터를 넣어서 훈련시킨다. ( classifier.fit(x_train, y_train) 사용 )

 

우리가 훈련시킨 모델로 훈련을 시키자

 

이제 예측을 해보자 다만 주의할 점으로는 데이터를 담을때 feature scaling 을 해줘야한다.

sc.transform을 통해 해줬다.

훈련한 모델을 예측값과 실제값을 비교해주자. 

그 후 confusion matrix 를 만들고 정확도를 계산하였다. 정확도는 0.925 가 나왔다. 시험세트의 약 92퍼센트가 정확했다는 의미이다.

비주얼라이징 하였다.

 

 

 

 

 

 

 

 

 

728x90

 

 

초기 AI (Early AI)  는 사람이하기 힘들지만 컴퓨터는 빨리할 수 있는, 예를 들어 계산이나 검색과 같은 것들을 AI 라고 했다.

 

지금 현대의 AI (Modern AI) 는 오히려 사람에겐 쉽지만 컴퓨터에게 논리적인 결정 방법들로 설명하기 힘든 것들을 컴퓨터가 할 수 있을 때 AI 라고 한다.

예를 들어 이미지 분류 문제에서 개와 고양이를 구별한다고 하자. 사람에겐 굉장히 쉬운 일이지만 컴퓨터에게 논리적 결정 방법들로 설명하기엔 힘들다. 이런 문제를 컴퓨터가 해결할 수 있다면 AI라고 부르게 되었다. 

 

 

 

 

그렇다면 이제 머신러닝이 무엇인지 정의를 내려보자

 

 

 

 

 

머신러닝은 (T, P, E) 이 세가지로 이야기할 수 있다.

T : task  / P:performance /  E: experience

어떤 컴퓨터프로그래밍이 Experience (경험), 컴퓨터로 치면 데이터로 부터 무엇을 배우는데 task T 와 performance P 를 배운다고 할 수 있다. task T를 측정할 때  performance P를 통해 측정할 수 있는데 이는 데이터 E 를 통해 향상될 수 있다.

 

Definition: A computer program is said to learn from experience E with respect to some class of tasks T and performance P, if its performance at tasks in T, as measured by P, improves with experience E. (Mitchell, 1997)

 

 

기존 규칙 기반 시스템에서는 데이터가 많다해서 성능이 좋아지고 데이터가 없다고해서 성능이 떨어지지는 않는다. 데이터에 따라 성능이 달라지지 않기 때문에  머신러닝이라고 하기엔 힘들다. 

rule-based system

  

 

Data-driven 머신러닝 시스템에서는 데이터가 많아질 수록 데이터와 아웃풋사이의 관계를 설명하기 쉽기때문에 머신러닝이라고 할 수 있다.

머신러닝

정리하면 머신러닝은 데이터를 통해 인풋과 아웃풋의 관계를 정의할 수 있다면 머신러닝이라고 할 수 있다.

 

 

Task T

 

머신러닝에서 

학습은 태스크를 수행하는 능력을 키우는 것이다. 각각의 데이터(Example: 하나하나의 예시들, 정량적으로 측정될 수 있는 feature 들의 모음 )를 처리하는 방법을 배우는 것이 학습이다. 

머신러닝 task들의 종류에는 Supervised learning, Unsupervised learning, Reinforcement learning 등이 있다. 

 

 

 

 

1. Supervised learning (지도 학습)

   - Classification, Regression 

지도학습은 인풋으로 데이터와 데이터에 해당하는 아웃풋을 넣어 기계를 학습시킨다. 

Classification 은 0인지 1인지 / 고양이인지 개인지 / True 인지 False 인지 / Male 인지 Female 인지 처럼 A 와 B 중 어떤 것인지를 분류하는 문제이며 그렇기에 불연속적인 값을 지니게 된다. (Categorical target values를 가짐 ) 

두 가지중 하나로 분류하는 문제도 있지만(binary) /  0~9 중에 하나가 무엇이냐(예를들어 아웃풋 3) 와 같은 multi-class 분류 문제도 있으며 / 0-9 중에 여러개가 무엇이냐(예를 들어 아웃풋 0,3,8) 와 같은 multi-label 분류 문제도 있다.

Classification 예시 f(x) 는 분기문이 등장하여 어떤 값이면 0 else 1 이런 식으로 분류하게 될 것이다.
Classification 내부에는 여러 알고리즘들이 있다. 이번 학기에 하나씩 배울 예정이다.

 

반면, Regression 은 예를 들어 "우리 아이 키가 언제 클까요" 예측하는 것에 가깝다. 그래프 상에서 현재 아이 키와 성장세를 고려해 미래의 키를 예측하는 문제이다. 그렇기에 연속적인 값을 지니게 된다.

함수로 연속적인 값이 나온다.
Regression 에도 여러 알고리즘이 있다.

 

 

 

2. Unsupervised learning ( 비지도 학습)

  - Clustering 

Clustering 은 주어진 데이터들의 특성을 고려해 데이터 집단을 정의하고 데이터 집단의 대표할 수 있는 대표점을 찾는 것으로 데이터 마이닝의 한 방법이다. 인풋으로는 데이터가 들어간다.

(target variable 따로 없음)

 

3. Reinforcement learning ( 강화 학습 ) 

리워드를 최대로 얻기 위해선 어떻게 해야 하는 지에 관한 태스크이다. 

 

 

 

 

performance P 

알고리즘의 performance 는 정량적으로 측정할 수 있어야 한다. 그리고 태스크 T에 따라서 정의되어야한다. 각 태스크에 걸맞는 퍼포먼스가 있다.  예를 들어 Regression 은 연속적인 값을 가지기 때문에 실제값과 예측값의 차이를 구해야한다. 가장 많이 쓰는 방식으로는 Regression 에서 Mean square error 가 있다. MSE 는 오차의 제곱의 평균이다. 

Classificaion 의 performance 평가 지표에는 Accuracy(정확도), Precision (정밀도), Recall(재현도), F1-score 네가지 가 있다.

 

평가 지표를 알기 전에 먼저 알아야할 것이 있다.

 

confusion matrix (오차행렬) : Traing 을 통한 Prediction 의 성능을 측정하기 위해 실제 값과 예측값을 비교하기 위한 표이다. 

actual 은 실제값을 의미하며 prediced 는 예측값을 의미한다. 만약 둘다 Positive 라면 True Positive 이런 식으로 표기한다. TP 와 TN 은 값을 맞게 잘 예측한 것이지만 FP 와 FN 은 예측하지 못한 것을 의미한다.

정확도란 모델이 바르게 분류한 비율을 의미한다. 정밀도란 모델이 Positive 로 분류한 것 중 실제값이 Positive 인 비율을 의미한다. 

재현도는 실제 Positive 중 모델이 Positive 로 분류한 비율을 말한다. F1-score 은 Precisionr과 Recall의 조화평균으로 데이터가 불균형할 때 사용된다.

 

성능 평가를 위해선 새로운 데이터를 통해 성능을 평가한다. 이 데이터를 테스트 데이터라고 하는데 초기의 데이터셋에서 훈련 데이터와 테스트 테이터를 초반에 나눈 후, 훈련 데이터로 모델을 훈련시킨 후 테스트 데이터로 테스트를 실시한다.

validation data 는 Traing 과정 중에 사용된다. 

 

 

 

 

 

Experience E

전체 데이터셋을 의미한다. 데이터셋은 많은 examples 들의 집합이다. 

 

각각의 데이터는 feature 들로 분류하여 행렬로 나타낼 수 있다. 이 행렬을 design matrix 라고 한다. 

Unsupervised vs. Supervised

     - Unsupervised: x → 𝑝(x)

     -  Supervised:x,y→𝑝(y|x)

semi-supervised 러닝도 있다. 이는 준 지도학습으로 지도학습과 비지도학습의 중간이다. 일부만 라벨이 주어졌을 때 사용된다.

 

 

 

 

 

 

Generalization

머신러닝의 주요과제는 새롭게 주어진 테스트 데이터를 어떻게 잘 수행할 수 있는가이다. 

 

이를 측정하기 위해

Trainig performance (트레이닝 데이타에 대한 수행능력)

와 Test preformance (테스트 데이터에 대한 수행능력) 를 각각 계산한다.

 

 

 

 

 

 

예측 모델을 만들때 다음과 같이 선형일 수도 약간 곡선일수도 더 곡선일 수도 있다. 파라미터의 개수가 증가할 수록 트레이닝 데이터에는 더 잘 맞는다는 것을 알 수 있다.

그런데 트레이닝 데이터에 잘 맞으면 좋은 모델이라 할 수 있을까?

 

만약 트레이닝 데이터에 딱 맞는다면 테스트 데이터로 새로운 데이터가 들어오면 잘 안맞을 수도 있다. 

 

모델 캐패시티는 파라미터, 즉 차수라는 뜻이다.

 

모델 캐패시티에 따른  그래프의 모양을 잘 살펴보자.

 

만약 캐패시티가 늘어나면 Overfitting 이 발생할 수 있다. 트레이닝 데이터에 너무 딱맞는 상황이다.

캐패시티가 적어도 underfitting 이 될 수 있다 . 이는 제대로 예측하지 못하는 모델이다.

 

적절한 캐패시티의 모델을 찾아야한다.

왼쪽은 underfitting 오른쪽은 overfitting 이다.

 

 

이에 대해 일반화를 해보면

만약 캐패시티가 늘어나면 트레이닝 에러는 줄어들게 된다. 다만 generalization error 는 늘어난다. 만약 캐패시티가 줄어들면 underfitting 존에 진입하여 training error 가 늘어나고 generalization 은 조금 감소한다.

따라서 이 Generalization error 가 적은 적절한 캐피시티를 찾아야한다.

 

이에대한 No Free Lunch (NFL) 이론이 있다. 

이것은 모든 문제에 대해 월등한 올바른 머신러닝 모델은 없고 각 장단점이 있다는 뜻이다. 그러니 최적의 모델을 잘 선택해야한다.

 

 

weight decay 

테스트 에러를 낮추는 편이 일반적인 성능을 확인할 수 있고 이를 위해 오버피팅이 되지 않아야한다. 그렇게 하기 위해선

모델 캐패시티를 바꿔가면서 학습시키기 보다는 충분히 큰 캐피시티의 모델에서 규제를 가하는 편이 더 낫다.

 

 

 

728x90

+ Recent posts