본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Playdata_study/AI

210804_MachinLearning 1 (정의, 분류 - SVM)

by 케리's 2021. 8. 5.

Data 분석 

 

Numpy, Pandas 

 

 

1. 일반적으로 xml, xtml, csv, json 파일을 불러와서 분석 작업을 한다.

2. cloud 환경 (크롤링)에서 데이터 불러와서 분석 작업 한다.

 

 

 

   ✔ Data Load

   ✔ 전처리 : Explore Data Feature Engineering

                  Data 마이닝Encoding (mapping)

                  Binning (구간) 

   ✔ 분석 : 머신러닝 , 딥러닝 

 

 

 

MachinLearning

 

computers the ability to learn without being explic itly programmed.

기계가 스스로 학습

 

 

1. 많은 데이터가 있어야지 학습이 가능하다.

2. computer power 도 좋아야 한다.

3. 수학적 알고리즘 가능해야 한다.

 

 

학습방법 

 

1. 지도학습 : Data로 학습 (Feature=컬럼,속성 + label=정답)

                 데이터를 학습시킬 때 답을 알려주는 것, 기업적 특징

 

  ※ 고양이 이미지 (속성, 이미지, X값, Feature, 특징), 고양이 단어 (Target, y값, label, 정답)

 

 

  ▶ Training DataSet   → Machine → [Train Model] -- Training error 중요하지 않다 

     - 라벨이 붙어있는 데이터를 이용하여 모델을 학습시킴

     - 이때 모델은 N개의 클래스로 분류하는 모델 

 

 

  ▷ Test DataSet (미지의 data)  → Machine  → [Test Model] → 예측 Predict -- Test error 중요하다

      Test error 를 낮추는것이 Machin Learning 의 목표!!! 

     - 학습 때 사용하지 않은 새로운 데이터를 모델에 넣고, 결과값을 예측하는 과정

     - 예측한 것 중 얼마나 맞췄는지에 따라 그 모델의 성능을 평가함 (accuracy)

 

 

 

  Test 

 

     ① Test : Test를 한번만 함 (수능)

     ② Validation Test : (모의고사)

     ③ Inference Test : 정답이없다, 상용화 되기 바로 직전의 Test 

 

 

 

 Training error (학습오차)

 

    라벨이 붙어 있지만 모든 데이터를 다 perfect 하게 맞추는 모델은 아님

 

 

 Test error (예측오차)

   

    새로운 데이터를 넣어 결과를 예측 했을 때의 오차

    예측 오차가 작으면 일반화가 잘 되는 좋은 모델임 (Train Data에 너무 의존하지 않는다)

    * Overffiting : Training 은 학습이 잘되었으나  Test는 결과가 좋지 않음

                       Overffiting 을 낮추는것이 목표!!!

                       단조로운 Data, 학습데이터에 의존되어 있으면 Overffiting 발생 

                       추상성 ↑, 일반화 Data 를 높여야한다.

 

    * Underfitting: Training 시간이 얼마 되지 않았을때 

 

 

 

   1) 분류 (Classification)

 

       ① Binary Classification (강아지 vs 고양이)

           - 기준 값이 꼭 필요하다 (Thresh holder)

       ② Multi Label Classification (강아지 vs 고양이 vs 송아지 vs 병아리)

 

              : Decision Tree (결정트리)

                Random Forest (랜덤포래스트),

                Gradient Boosting 

 

                | SVM (support vector machin)

 

 

   2) 회귀(Regression) : Linear Regression              

                              : Decision Tree (결정트리)

                                Random Forest (랜덤포래스트),

  

 

 

 

 

 

 

2. 비지도학습 : Data (Feature만 존재, label 없음), 추천시스템 (넷플릭스)

                    데이터를 학습시킬 때 답을 알려주지 않고,

                    모델이 스스로 데이터의 특성에 따라 유의미한 결과 뽑아내도록 함

 

  1) Clustering → 추천 협업 시스템

    

 

 

머신러닝이란?

 

E : Data , P : Performance Measure, T : Training Experience 반복하며 실행 

 

  • 머신러닝 = 기계학습
  • 머신러닝은 기본적으로 데이터를 이용하는 것
  • Training 데이터로 모델을 학습시키고 새로운 데이터로 모델의 예측값을 뽑아 내는 것
  • 사람의 개입 없이 모델이 스스로 학습

 

  • 프로그래밍 

     - 주어진 코드나 알고리즘 대로 똑같이 수행

     - Input, output 보다 내부적 알고리즘 중요

 

  • 머신러닝

     - 같은 구조의 모델이어도 데이터 셋이 다르면 학습된 모델이 달라짐

     - 데이터가 중요, 데이터 중심 & 모델 중심

     - 기계가 알아서 학습 (사람 개입 ×), 예측 못함 = BlackBox 

     - 알고리즘 불가능 할 경우 (ex, 바둑알고리즘, 주가예측알고리즘) 

 

 

 

AI > 머신러닝 > 딥러닝 

 

 

  • AI (Artificial Intelligence)

     - 인공지능은 인간의 지능, 사고, 감각 재현

     1) Narrow : 단 한가지만 다루는 특정 기술 (ex, 얼굴인식 → 얼굴인식만 다룬다)

     2) General : 모든 기술 

 

  • 머신러닝

     - 데이터를 이용해 인간 개입없이 모델 학습 및 새로운 데이터 결과 예측 

     - 인공지능스피커, 검색엔진, 기계번역, 자율주행, 의료, 이미지복원, 추천엔진, 로보틱스

 

  • 딥러닝

    - 머신러닝 중 인공 신경망(Neuron net) 층이 아주 깊어지면 딥러닝이라고 함 

 

 

이미지 데이터 셋

 

MNIST

 

  - 0~9 까지의 흑백 손글씨 이미지 데이터 셋

  - 각 데이터는 (28*28)의 사이즈의 이미지

  - 6만개의 Training 데이터 / 1만개의 test 데이터

  - Fashion-MNIST : 10개 클래스의 흑백 패션 이미지 

 

 

Cifar -10

  - 머신러닝 및 컴퓨터 비전 쪽에서 널리 사용되는 데이터 셋

  - 10개의 서로 다른 클래스의 이미지들

  - 총 6만개의 (32*32) 사이즈의 다양한 이미지 

 

 

 


 

분류 (Classification)

 

SVM (Support Vector Machine)

 

  •   주로 분류 및 회귀 분석에 쓰이는 지도 학습 모델 

       - 비 확률적 이진(Binary Classification) 선형 분류 모델

       - 두 집단을 분류하는 경계선을 찾는다고 생각 

  • 데이터를 선형으로 분리하는 최적의 선형(직선) 결정 경계를 찾는 알고리즘
  • 마진이란 두 데이터 군이 결정 경계와 떨어져 있는 정도를 말함  (마진이 큰 값이 잘 분류한 데이터)
  • SVM의 기본 형태는 두 클래스(집단)를 선형으로 분리시킴 

 

  • Support vector 

      - 분류하는 경계선 또는 경계면이 가장 가까운 점과 가장 먼 거리를 가지도록 함

      - 경계를 결정하는 (Support) 데이터 점 (vector) 들을 가리킴 

      - 이 데이터들이 결정 경계를 지지(Support)하고 있다고 말할 수 있기 때문에 서포트벡터라고 함

 

 

  • 매개변수 cost(비용)

      - 얼마나 세심하게 경계를 찾을지

      - cost가 낮으면, outliers를 많이 허용하여 좀 더 일반적인 경계를 찾음

      - cost가 높으면 최대한 세심하게 분류하는 경계를 찾음 

 

 

  • 선형 분리가 안되는 데이터 일경우

     -  더 높은 차원에서 경계를 찾아 분류함

     -  이상치(outliers) 들을 몇 개정도 허용함 

 

 

  • 매개변수와 Cost 와 gamma 

    - 커널 함수 

     : 기본적으로는 가우시안 방사 기저 함수 (Gaussian Radial Basis Funtion)

       더 높은 차원으로 데이터를 사상시키는 (mapping) 함수

 

 

    - 커널 함수의 gamma

      각 데이터 점들이 영향을 미치는 거리

      gamma가 클수록, 거리가 짧아져서 경계가 더 굴곡짐 

      gamma가 작으면 거리가 길고 더 일반화된 경계를 찾음 

 

 

    - 커널 함수의 cost 

      C는 얼마나 많은 데이터 샘플이 다른 클래스에 놓이는 것을 허용하는지를 결정

 

     ※ C는 두 데이터를 정확하게 구분하는데 초점, gamma는 개별데이터마다 결정선을 지정하는것에 초점

        C는 아무리 커져도 결정선이 하나이지만 gamma는 여러개의 결정선을 만들 수 있다.

        두 값 모두 커질수록 알고리즘의 복잡도는 증가한다.

        성능을 높이는 것과 overfit을 줄이는 것 사이의 균형을 잘 맞춰야 한다.

 

 

지도학습 

특징(Feature)들로 학습 

 

 


실습 

 

 

01_ML_SVM_iris

 

 

Module Configuration

필요한 모듈 불러오기

 

import pandas as pd
from sklearn.svm import SVC # SVC :: 함수사용
# sklearn.svm :: svm을 만들기 위한 서브모듈

 

Data Loader

 

csv = pd.read_csv('../data/iris.csv')
print(csv) 
# lavel = category = 품종
# feature = 특징 = data = x
# ---- 결과 

     sepal.length  sepal.width  petal.length  petal.width    variety
0             5.1          3.5           1.4          0.2     Setosa
1             4.9          3.0           1.4          0.2     Setosa
2             4.7          3.2           1.3          0.2     Setosa
3             4.6          3.1           1.5          0.2     Setosa
4             5.0          3.6           1.4          0.2     Setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  Virginica
146           6.3          2.5           5.0          1.9  Virginica
147           6.5          3.0           5.2          2.0  Virginica
148           6.2          3.4           5.4          2.3  Virginica
149           5.9          3.0           5.1          1.8  Virginica

[150 rows x 5 columns]

# variety :: label
# sepal.length  sepal.width  petal.length  petal.width :: Feature

 

Data Split 

X(label), y(Feature) 로 구분한다 

 

label = csv['variety']
data = csv [["sepal.length","sepal.width","petal.length","petal.width"]] #feature

 

Model Generate and Training

 

# ----- 모델을 만들고 :: SVC, 학습한다 :: fit
model = SVC() 
model.fit(data,label)
# ---- 결과 

SVC()

 

Prediction

예측

 

# --- 예측할 땐 미지의 데이터를 넣는다.

pred = model.predict([
    [5.2,3.4,1.2,0.2],
    [2.7,0.4,3.4,4.0],
    [1.2,3.2,2.2,12.8]
])

print(pred)
# ---- 결과 

['Setosa' 'Virginica' 'Virginica']

 

 

 

😎 Code Processing 

 

# --------- Code Processing

# 1. ------ Module Configuration 
# 2. ------ Data Loader
# 3. ------ Data Split (label, data) and Shuffle
# 4. ------ Model Generate 
# 5. ------ Training
# 6. ------ Predict
# 7. ------ Accuracy

 

 

 

02_ML_SVM_iris02

Training model, Test model 분류해서 학습하기

 

 

Module Configuration

 

import pandas as pd
from sklearn.svm import SVC

 

 

 

Data Loader

 

csv = pd.read_csv("../data/iris.csv")
csv

 

 

 

Data Split (label, data)

 

label = csv['variety']
data = csv [["sepal.length","sepal.width","petal.length","petal.width"]]

print(label)
# ----- 결과 
# -- 데이터가 잘 안섞여 있다.


0         Setosa
1         Setosa
2         Setosa
3         Setosa
4         Setosa
         ...    
145    Virginica
146    Virginica
147    Virginica
148    Virginica
149    Virginica
Name: variety, Length: 150, dtype: object

 

 

Data Split and Shuffle

 

  • Train DataSet 과 Test DataSet으로 분리
  • label을 확인하면 sklearn 데이터 셋은 잘 안 섞여 있는 특징을 보인다

 

#------ 들어가기전에 알고가기!

def sum_and_multi(a,b):
    return a+b, a*b # 반환 값 여러개 가능하다.

result = sum_and_multi(10,20)
print(result)

res1,res2 = sum_and_multi(10,20)
print(res1,res2)
print(res1)
print(res2)
# ---- 결과

(30, 200)
30 200
30
200

 

 

# --- train, test 을 나누는 함수, defalut 값 75%, 25% 로 나눔

from sklearn.model_selection import train_test_split

 

# ---- 반환값이 4개로 만들어져 있다. 반환되는 순서를 잘 지켜야한다.

# ---- train_data, train_label (75), test_data, test_label(25) split 됨
# ---- Feature 와 label 의 순서대로 작성 
# ---- train_test_split() :: 랜덤 순서로 작성

train_data, test_data, train_label, test_label = train_test_split(data,label)
# ---- train_data, train_label (80), test_data, test_label(20) split 됨

train_data, test_data, train_label, test_label = train_test_split(data,label, test_size=0.2)

 

 

Shuffle 확인

잘 섞였는지 확인 

 

print(train_label)
print('*'*50)
print(test_label)
# ---- 결과

86     Versicolor
31         Setosa
10         Setosa
95     Versicolor
24         Setosa
          ...    
106     Virginica
8          Setosa
80     Versicolor
91     Versicolor
16         Setosa
Name: variety, Length: 120, dtype: object
**************************************************
143     Virginica
65     Versicolor
59     Versicolor
87     Versicolor
128     Virginica
20         Setosa
146     Virginica
120     Virginica
12         Setosa
35         Setosa
141     Virginica
45         Setosa
84     Versicolor
110     Virginica
100     Virginica
69     Versicolor
17         Setosa
77     Versicolor
99     Versicolor
43         Setosa
67     Versicolor
108     Virginica
119     Virginica
112     Virginica
4          Setosa
148     Virginica
136     Virginica
98     Versicolor
71     Versicolor
129     Virginica
Name: variety, dtype: object

 

 

모델생성, 학습진행

 

model = SVC()

# --- 학습시킬때는 데이터 전체를 넣는 것이 아니라 학습용 데이터만을 입력한다.
model.fit(train_data, train_label)
# --- 결과

SVC()

 

예측하기

 

pred = model.predict(test_data)
print(pred) # 예측값
# ---- 결과 

['Virginica' 'Versicolor' 'Versicolor' 'Versicolor' 'Virginica' 'Setosa'
 'Virginica' 'Virginica' 'Setosa' 'Setosa' 'Virginica' 'Setosa'
 'Versicolor' 'Virginica' 'Virginica' 'Versicolor' 'Setosa' 'Versicolor'
 'Versicolor' 'Setosa' 'Versicolor' 'Virginica' 'Virginica' 'Virginica'
 'Setosa' 'Virginica' 'Virginica' 'Versicolor' 'Versicolor' 'Virginica']

 

print(test_label) # 정답 확인
# ------ 결과 

143     Virginica
65     Versicolor
59     Versicolor
87     Versicolor
128     Virginica
20         Setosa
146     Virginica
120     Virginica
12         Setosa
35         Setosa
141     Virginica
45         Setosa
84     Versicolor
110     Virginica
100     Virginica
69     Versicolor
17         Setosa
77     Versicolor
99     Versicolor
43         Setosa
67     Versicolor
108     Virginica
119     Virginica
112     Virginica
4          Setosa
148     Virginica
136     Virginica
98     Versicolor
71     Versicolor
129     Virginica
Name: variety, dtype: object

 

 

성능평가

 

from sklearn.metrics import accuracy_score

score = accuracy_score(pred, test_label) # 예측값, 정답
print(score*100) # %로 변환
# --- 결과 (Random)

100.0

댓글