학교/인공지능

3_인공지능개론

서윤-정 2024. 4. 21. 10:46

* 샘플로 구성되는 데이터셋

- 기계 학습이 사용하는 데이터는 여러 개의 샘플을 담고 있어서 데이터셋(data set)이라 부르기도 함

 

* 특징으로 구성되는 특징 벡터 (feature vector)

 

 

* DESCR은 iris 데이터셋에 대한 설명문 제공

- 특징벡터에 있는 특징별로 간단한 통계량을 보여주고 데이터를 수집한 시기와 사람 등 정보 제공

 

 

 

 

 

 

 

 

 

 

* 데이터 로딩 후 내용 출력

 

 

 

 

 

 

 

 

 

 

 

 

 

* iris 내용 확인

 

 

 

 

 

 

 

 

 

 

 

 

* 샘플을 특징 벡터와 레이블로 표현

- 특징 벡터는 x로 표기

- d 는 특징의 개수로서 특징 벡터의 '차원'이라 부름

- 오른쪽 표에서 xd

- 즉, 하나의 샘플은 d개의 특징을 갖는 '특징 벡터'로 표현

- 여러 개의 샘플: X1, X2, ..., X150

- 즉, 샘플 1개는 d개의 차원으로 구성

- 레이블(정답)의 부류의 개수가 C라고 하면, 

0, 1, 2, ..., c-1의 값 또는 1, 2, ... c-1, c 의 값

또는 원핫 코드 (one-hot code)

- 원핫 코드는 한 요소만 1인 이진열

- ex) Setosa는 (1, 0, 0), Versicolor는 (0, 1, 0), Virginica는 (0, 0, 1)로 표현

 

 

 

 

 

 

 

 

 

[특징 공간에서 데이터 분포]

[다차원 특징 공간]

- 종이에 그릴 수 있는 공간은 3차원으로 제한되지만,

수학에서는 아주 높은 차원까지 다룰 수 있음

 

* 2차원 상의 두 점의 거리

 

 

* d차원 상의 두 점의 거리 

 

 

 

 

 

 

 

 

 

 

* 특정 공간을 분할하는 결정 경계 (decision boundary)

- 2~3차원은 그림을 그릴 수 있는데 4차원 이상은 수학적 상상력 필요

 

 

* 현대 기계 학습이 다루는 데이터

- 수백~수만 차원 특징 공간

- 고차원 공간에서 부류들이 서로 꼬여있는 매우 복잡한 분 

 

 

 

 

 

 

 

 

 

 

 

 

[특징의 분별력]

* 기계 학습은 높은 분별력을 지닌 특징을 사용해야 함

- 100여년 전의 iris 데이터는 사람이 네 종류의 특징을 자를 들고 직접 추출

 

* 다양한 형태의 특징 공간

- 아래 그림에서 오른쪽으로 갈수록 특징의 분별력이 낮아짐

- 실제 세상은 (c) ~ (d) 와 같은 비선형 데이터를 생성

(데이터의 원천적인 성질, 측정이나 레이블링 오류, 특징 설계를 잘못해서 등)

- 가급적 (d) 보다 (c)와 같은 특징을 사용해야 함

 

 

 

 

 

 

 

 

 

 

 

[선형 vs 비선형]

* 선형 (Linear)

- 직선 (line) 모양

 

 

* 비선형 (Nonlinear)

- 직선 모양이 아닌 모든 것

 

 

 

 

 

 

 

 

 

 

 

[특징 공간을 분할하는 결정 경계]

* 결정 경계를 정하는 문제에서 고려 사항

- 비선형 분류기 (nonlinear classifier) 사용

 

 

 

 

- 과잉 적합 (overfittinig) 회피

- 과잉 적합은 아웃라이어를 맞히려고 과다하게 복잡한 결정 경계를 만드는 현상

- 훈련 집한에 대한 성능은 높지만 테스트 집합에 대해서는 형편없는 성능 (일반화 능력 저하)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[기계 학습 적용: 모델링과 예측]

* 모델링과 예측

- 기계 학습의 핵심

- 기계 학습에는 아주 다양한 모델이 있음

 

* 통계적인 머신러닝 접근법은 현재 아래 2가지 정도만 사용

- SVM (Support Vector Machine)

- Decision tree (결정 트리)

 

 

 

 

 

 

 

 

[SVM (Support Vector Machine)]

* SVM은 분류 및 회귀분석에서 사용 가능

- 그러나 분류 쪽에 성능 뛰어남

- 지도 학습 방법

- Hyper-plane(초평면)을 이용해 카테고리 나눔

 

* SVM은 분류를 할 때 최고의 마진(margin)을 가져가는 방향으로 분류를 수행

- Margin: 두 클래스의 support vector 거리

- 마진이 크면 클수록 학습에 사용하지 않은 새로운 데이터가 들어오더라도 잘 분류할 가능성이 커지기 때문

- SVM 뿐만 아니라 모든 머신 러닝 학습 방법이 추구하는 방향

 

* Support Vector

- hyper-plane으로부터 가장 가까이 있는 vector

 

- 아래 그림에서, 파란색 점과 빨간색 점을 최대 마진으로 구별하는 직선은 검은색 직선

- 2차원일 때는 직선이지만, 3차원 이상이면 평면이 되어서 hyper-plane, 즉 평면(plane)라고 부름

 

 

 

 

 

 

 

 

 

 

 

 

 

[SVM 원리]

* 기계 학습의 목적은 일반화 능력을 극대화 하는 것

- SVM은 일반화 능력을 높이려 여백(margin)을 최대화

- hyper-plane '1'은 오류가 너무 많음

- hyper-plane '2'은 파란색 부류에 조금만 변형이 생겨도 결정 경계를 넘을 가능성

- hyper-plane '3'은  두 부류 모두에 대해 멀리 떨어져 있어 경계를 넘을 가능성이 낮음

- SVM 학습 알고리즘은 여백을 최대화 하는 결정 경계를 찾음

 

 

 

 

 

 

* SVM을 비선형 분류기로 확장

- 원래 SVM은 선형 분류기

- 커널 트릭 (kernel trick)을 사용하여 비선형 분류기로 확장

- 커널 함수를 사용하여 선형 공간을 비선형 공간으로 변형 (아래 그림)

- 커널 함수로는 polynomial function, Gaussian radial basis function(RBF), sigmoid 함수를 사용

- 커널 함수의 종류와 커널 함수의 모양을 조절하는 매개변수가 필요 --> 하이퍼 매개변수

 

 

 

 

 

 

 

 

 

 

 

[SVM 코드]

from sklearn import datasets
from sklearn import svm
import plotly.express as px


d = datasets.load_iris()  # 데이터를 읽은 후에,   # 1 데이터 준비
print(d.DESCR)    # 내용 출력


for i in range(0, len(d.data)):   # 샘플 순서대로 출력
  print (i+1, d.data[i], d.target[i])


s=svm.SVC(gamma=0.1, C=10)  # SVM 중 SVC 객체 생성   # 2 모델 생성
s.fit(d.data, d.target)     # iris 데이터로 학습을 시킴   학습 → fit
# 3 학습


new_d = [[6.4, 3.2, 6.0, 2.5], [7.1, 3.1, 4.7, 1.35]]
# 101, 51번째 데이터를 변형해서 새로운 데이터 생성


res = s.predict(new_d)  # L:14에서 만든 데이터를 이용해서 예측(predict)
# 4 예측


print('새로운 2개 샘플 부류는: ', res)


df = px.data.iris()
fig = px.scatter_3d(df, x='petal_length', y='sepal_width', z='petal_width', color='species')  
# petal_length을 제외하고 3차원 공간 구성
fig.show()
 

 

 

 

 

 

 

 

 

 

 

 

 

 

[SVM 하이퍼 매개변수]

* 하이퍼 매개변수

- 모델의 동작을 제어하는데 쓰는 변수.

모델의 학습을 시작하기 전에 설정해야 하는데, 

적절한 값으로 설정해야 좋은 성능을 얻을 수 있음

 

* 하이퍼 매개변수 최적화

- 기계학습의 중요한 주제 중의 하나임

 

 

 

 

 

 

 

 

[하이퍼 매개변수]

* C (cost) 하이퍼 매개변수

- 선형 SVM일 때는 C 매개변수 1개만 존재 

- 지금까지 모든 샘플을 옳게 분류하는 경우를 다루자면, 실제로는 오류를 허용하는 수 밖에 없음

- C를 크게 하면, 잘못 분류한 훈련 집합의 샘플은 적은데 여백이 작아짐

(훈련 집합에 대한 정확률은 높지만 일반화 능력 떨어짐)

- C를 작게 하면, 여백은 큰데 잘못 분류한 샘플이 많아짐

(훈련 집합에 대한 정확률은 낮지만 일반화 능력 높아짐)

 

 

* gamma 라는 하이퍼 매개변수

- 비선형 SVM 일 때는 C, gamma 매개변수 2개 존재

- C는 앞과 동일

- 다음 예는 선형으로는 불가능

 

 

 

- gamma는 하나의 데이터 샘플이 영향력을 행사하는 거리를 결정

- 가우시안 함수의 표준편차와 관련되어 있는데, 클수록 작은 표준편차를 갖음

- 즉, gamma가 클수록 한 데이터 포인터들이 영향력을 행사하는 거리가 짧아지고, gamma가 낮을수록 커짐

 

 

 

 

 

 

 

 

 

 

* C 하이퍼 매개변수

- C = 1 인 상황에서는 두 개의 이상치를 인정하고 무난하게 결정 경계를 찾은 반면,

- C = 100 일 때는 하나의 이상치만 인정하면서 조금은 억지스럽게 분

 

 

 

 

 

 

 

* gamma 하이퍼 매개변수

- gamma의 값이 높아짐에 따라 파란색의 공간이 점점 작아짐

- 서로 합쳐져서 특정 형태가 만들어지는 것임

 

 

 

 

 

 

 

 

 

 

 

 

[SVM]

* SVM 적용 예

- line 11: SVM 분류기 모델 중 SVC(classification) 클래스의 객체를 생성하여 s에 저장

- line 12: 객체 s의 fit 함수는 훈련 집합을 가지고 학습을 수행

(매개변수로 특징 벡터 iris.data와 레이블 irist.target을 설정)

- line 16: 객체 s의 predict 함수는 테스트 집합을 가지고 예측 수행

 

 

 

 

 

 

 

 

 

 

 

 

[특징 추출과 표현]

* 기계 학습의 전형적인 과정

- 실제에서는 다양한 형태로 나타남

- iris 데이터셋은 채집한 붓꽃의 꽃잎과 꽃받침 크기를 사람이 직접 자로 재서 기록함

- 데이터 수집과 특징 추출을 사람이 직접 수행한 경우임

- 딥러닝을 사용하면 사람이 할 일은 사과 영상을 수집하고 등급 레이블을 붙이는 것이 전부

- 딥러닝은 특징 추출과 모델링을 동시에 최적화 함

(고전적인 기계학습(SVM) 같은 것을 사용하면 특징 추출을 사람이 설계하고 구현해야 함)

- 어떤 경우든 특징은 분별력이 높아야 함

 

 

 

 

 

 

 

 

[특징의 분별력]

* 사람의 분별력

- 직관적으로 분별력이 높은 특징을 선택해 사용

- ex) 두 텀블러를 구분하는 특징

- 글씨 방향, 몸통 색깔, 손잡이 유무, 뚜껑 유무 등

- 뚜껑 유무라는 특징은 분별력이 없음

- 손잡이 유무라는 특징은 높은 분별력

- 사람은 물체를 인식할 때 본능적으로 가장 분별력이 높은 특징을 선택해 사용함

- 둘 이상의 특징을 사용하면 분별력을 높일 수 있음

- ex) 손잡이가 있고 몸통 색이 더 하얀 텀블러라고 말하면 정확하게 인식할 가능성이 커짐

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[IRIS 특징 추출/표현을 통한 데이터 이해]

* 특징 공간에서 데이터 분포

 

* iris 데이터

- 특징이 4개이므로 4차원 특징 공간을 형성

- 150개 샘플 각각은 4차원 특징 공간의 한 점

- 차원을 하나 제외하고 3차원 공간에 데이터 분포를 그림

- plotly, pandas 라이브러리 설치

 

 

 

 

 

 

 

[IRIS 특징 추출/표현을 통한 데이터 이해]

* 특징 공간에서 데이터 분포 관찰 예

- petal width(수직 축)에 대해 Setosa는 아래쪽, Virfinica는 위쪽에 분포의 실행 결과와 일치

--> petal width 특징은 분별력(discrimminating power)이 뛰어남 (=분산이 크다)

- sepal width 축은 세 부류가 많이 겹쳐서 분별력이 낮음

- 전체적으로 보면, 세 부류가 3차원 공간에서 서로 다른 영역을 차지하는데 몇 개 샘플은 겹쳐 나타남

 

 

 

 

 

 

 

 

 

 

 

[k-means (k-평균) 알고리즘]

- k-means 는 군집 분석에서 많이 사용되는 대표적인 알고리즘

- k는 데이터에서 군집의 수를 의미하고, 

means(평균)란 중심(centroid)과 동일한 군집의 데이터의 평균을 의미

- 데이터의 평균을 이용하여 k개의 군집을 만드는 알고리즘으로 1~4단계로 나눔

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[특징 공간을 분할하는 결정 경계]

* 인공지능의 인식은 철저히 수학에 의존

- 샘플은 특징 벡터로 표현되며, 특징 벡터는 특징 공간의 한 점에 해당

- 인식 알고리즘은,

특징 공간의 성능을 높이는데 더 유리한 새로운 특징 공간으로 여러 차례 변환한 다음

최종적으로 특징 공간을 분할하여 부류를 결정

(특징 공간 변환, 특징 공간 분할로 분류 문제 해결)

- 특징 공간 변환 예

 

 

 

 

 

 

 

 

 

 

[기계 학습 적용: 모델링과 예측]

* 훈련 집합과 테스트 집합

 

* 훈련 집합

- 기계 학습 모델을 학습하는데 쓰는 데이터로서 특징 벡터와 레이블 정보를 모두 제공

 

* 테스트 집합

- 학습을 마친 모델의 성능을 측정하는데 쓰는 데이터로서 예측할 때는 특징 벡터 정보만 제공하고,

계산된 예측 결과를 가지고 정확률을 측정할  때 레이블 정보를 사용

 

 

 

 

 

 

 

[인공지능 설계 사례: 과일 등급을 분류]

* 인공지능 제품 핵심

- 데이터를 읽고 모델링과 예측을 수행

- 붓꽃 영상을 획득하고 특징을 추출하는 컴퓨터 비전 모듈을 전처리로 붙이면 붓꽃 인식 프로그램 완성

 

 

 

 

 

 

 

* 사과의 상중하의 세 부류로 분류하는 인공지능 기계의 설계

- 과정 1) 데이터 확보

- 상중하 비율이 비슷하게 수천 개의 사과 수집

- 데이터 편향(data bias)을 방지하기 위해 여러 농장에서 수집

- 카메라로 촬영하여 파일에 저장

 

- 과정 2) 특징 벡터와 레이블 준비

- 어떤 특징 사용? 사과의 크기, 색깔, 표면의 균일도는 분별력이 높은 특징

- 컴퓨터 비전 기술로 특징 추출 프로그램 작성. 특징 추출하여 apple.data 파일에 저장

- 사과 분류 전문가를 고용하여 레이블링. apple.target 파일에 저장

 

- 과정 3) 학습하는 과정을 프로그래밍 (훈련 데이터 사용)

 

- 과정 4) 예측 과정을 프로그래밍 (새로 수집한 테스트 데이터 사용)

 

 

 

 

 

 

 

 

 

 

 

 

 

[규칙 기반/고전적 기계학습/딥러닝]

* 규칙 기반 방법

- 분류하는 규칙을 사람이 구현

- ex) 꽃잎의 길이가 a보다 크고, 꽃잎의 너비가 b보다 작으면 Setosa라는 규칙에서, 

a와 b를 사람이 결정해 줌

- 큰 데이터셋에서는 불가능하고, 데이터가 바뀌면 처음부터 새로 작업해야 하는 비효율성

 

* 기계 학습 방법

- 특징 벡터를 추출하고 레이블을 붙이는 과정은 규칙 기반과 동일 (수작업 특징, hand-crafted feature)

- 규칙 만드는 일은 기계 학습 모델을 이용하여 자동으로 수행 (ex) SVM

 

* 딥러닝 방법

- 레이블을 붙이는 과정은 기계 학습과 동일

- 특징 벡터를 학습이 자동으로 알아냄

--> 특징 학습 또는 표현 학습을 한다고 말함

- 장점: 특징 추출과 분류를 동시에 최적화하므로 뛰어난 성능 보장, 인공지능 제품 제작이 빠름

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[결정 트리]

from sklearn import datasets
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier


d = datasets.load_iris()  # 데이터를 읽은 후에,   # 1 데이터 준비
# print(d.DESCR)    # 내용 출력


#for i in range(0, len(d.data)):   # 샘플 순서대로 출력
#  print (i+1, d.data[i], d.target[i])


dtree_model = DecisionTreeClassifier(max_depth = 4, min_samples_split = 3)  # 2 모델 생성
dtree_model.fit(d.data, d.target)   # 학습 --> fit                          # 3 학습

new_d = [[6.4, 3.2, 6.0, 2.5], [7.1, 3.1, 4.7, 1.35]]
# 101, 51번째 데이터를 변형해서 새로운 데이터 생성
res1 = dtree_model.predict(new_d)   # L:14에서 만든 데이터를 이용해서 예측(predict)


print('새로운 2개 샘플 부류는: ', res1)

res2 = dtree_model.predict(d.data)    # 4 예측
# res2와 원래 정답 d.target과의 비교
print('정확도: ', metrics.accuracy_score(res2, d.target))

 

 

 

 

* 결정 트리 (decision tree)

- 트리를 이용하여 예측하는 방법

- 질문을 던져 스무고개처럼 대상을 좁혀 나가면 분류 문제를 쉽게 해결할 수 있음

- 우리가 의사결정하는 과정과 유사하며 해석이 매우 쉬운 쉬운 장점

 

 

 

 

 

 

 

* 불순도 (impurity)

- 노드에 클래스가 순수 (pure) 하지 않은 정도

- 노드에 2개 이상의 서로 다른 클래스가 있다면 순수하지 않은 것

- 노드 1: 서로 다른 클래스(노란색 사각형, 파란색 원)가 1:1 의 비율로 섞여 있으며 가장 불순도가 높음

- 노드 3: 클래스(노란색 사각형)가 순수한 상태로 불순도 값이 가장 낮고,

- 노드 2: 노드 1과 노드 3의 중간 정도의 값을 가지고 있음

 

 

 

 

 

 

* 엔트로피 (entropy)

* 무질서도

- 원래 엔트로피가 증가하는 쪽으로, 즉 무질서해지는 쪽으로 변하려 함 

- 일반적으로 에너지를 방출하는 쪽으로 변하려 하지만, 

경우에 따라서는 외부로부터 에너지를 흡수해가면서까지 무질서해지려 

- 엔트로피는 에너지의 쓸모를 나타내는 양. 엔트로피가 적은 에너지는 쓸모가 많고 잘 사용할 수 있다는 것을 의미.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

* 결론

- [방법2] 의 정보 획득 값이 0.61로 [방법1]의 0.1245보다 크므로 [방법2]로 분할하는 것이 더 좋음

(엔트로피가 0인 것이 순수)

 

* [방법2]를 이용하여 분활한 결과를 두 가지 방법으로 표현한 것

- 결정 트리 표현 방법에서 '길이 < 50'으로 먼저 분할하면 [1]은 노란 사각형만 남아 더 이상 분할하지 않아도 됨

- 오른쪽 자식 노드는 위와 동일한 방법으로 '무게 < 27'로 분할하면 단말 노드가 모두 순수(pure)하게 잘 분할

- 앞에서 배운 정보 획득의 과정을 한 번 더 거치면 [2], [3]과 같이 분류할 수 있음

 

 

 

 

 

 

 

 

 

 

* 과잉적합 (overfitting)

- 데이터의 양이 많아지면 분할되는 노드의 개수가 매우 많음

- 트리가 복잡해질수록 훈련 데이터에 대해서는 정확도가 높지만, 

새로운 데이터에 대해서는 오버 피팅

--> 이것을 결정트리에서는 '가지치지(pruning)' 라고 함

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'학교 > 인공지능' 카테고리의 다른 글

5_인공지능개론  (1) 2024.06.08
4_인공지능개론  (0) 2024.06.06
2_인공지능개론  (1) 2024.04.20
결정 트리 코드  (0) 2024.04.19
SVM 코드  (0) 2024.04.19