머신러닝/Tensorflow 기초

3. 아이리스 품종 분류

dlwltn98 2021. 1. 19. 22:05

머신러닝 야학 정리

출처 :  https://github.com/blackdew/tensorflow1/blob/master/csv/iris.csv

 

⇒ 독립 변수 : 꽃잎길이, 꽃잎폭, 꽃받침길이, 꽃받침폭

⇒ 종속 변수 : 품종 =⇒ '범주형 데이터' =⇒ "분류(classification)"

   회귀와 분류를 나누는 기준 : 종속변수의 데이터 타입.

# 1. 과거의 데이터를 준비

아이리스 = pd.read_csv('iris.csv')

# 판다스가 범주형 데이터들만 골라서 **원핫인코딩** 해준다.
아이리스 = pd.get_dummies(아이리스)

독립 = 아이리스[['꽃잎길이', '꽃잎폭',
                                 '꽃받침길이','꽃받침폭']]
종속 = 아이리스[['품종']]
print(독립.shape, 종속.shape)

pd.get_dummies(아이리스)의 결과

 ⇒ 원핫인코딩이 되면서 **종속변수의 개수가 3개**가 되었음


⇒ 이 수식의 결과는 -무한대 ~ +무한대까지 모든 숫자를 대상으로 한다.

But. 우리의 분류 모델은 0 또는 1을 맞추려고 함

 **⇒ Y값의 최소값은 0 , 최댓값은 1로 결과를 만들고 싶어함**

각각의 수식을 softmax라는 함수로 감싸주면 0과 1사이의 결과를 받을 수 있음

      y1 = softmax(W1X1 + W2X2 + W3X3 + W4X4 + b)

# 2. 모델의 구조를 만든다

X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X,Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')
 - **분류**에 사용하는 Loss ⇒ **crossentropy**

⇒ 분류에는 Loss보다 사람이 더 보기 좋은 평가지표가 있음 ⇒ '정확도'

accuracy → 1 = 100% 모두 다 맟춘 것 / 0 = 모두 틀린 것

 - **회귀**에 사용하는 Loss ⇒ **mse**
# 3. 데이터로 모델을 학습(FIT)
model.fit(독립, 종속, epochs=1000)
# 4. 모델을 이용합니다.
print("Predictions: ", model.predict(독립[0:5])

⇒ 범주형 데이터는 수식에 사용할 수 있는 형태로 바꿔주는 과정 필요

⇒ onehot-encodong

  • 모든 범주들을 칼럼으로 바꾼다.
 - 첫번째 데이터는 setosa이니 setosa 칼럼을 1로 바꾼다.

 - 두번째 데이터는 virginica이니 virginica 칼럼을 1로 바꾼다.

 - 나머지도 동일하게 해당 범주에 해당하는 칼럼의 값을 바꾼다.


⇒ 데이터가 0 또는 1 숫자 형태로 변함

⇒ 범주형 데이터를 1과 0의 데이터로 바꿔주는 과정을 '**onehot-encoding**'

### 분류모델이 하는 것 → 분류를 추측하는 것

     0~100 사이의 확률값으로 분류를 표현. →  이것을 도와주는 도구

- Sigmoid
- Softmax ⇒ 비율로 예측하기 위해 사용

 

    ⇒ 컴퓨터가 0과 1사이의 결과를 내도록 한 후에 다음처럼 해석

    - s=1, vi=0, ve=0 ⇒ setosa일 확률이 백프로
    - s=0.7, vi=0.3, ve=0 ⇒ setosa일 확률 70%, virginica일 확률 30%

## Activation 활성화 함수

 - 최종결과를 만들기전에 함수 하나가 추가되어 있는 모습

 - 숫자를 예측했던 회귀모델에서는 결과를 내기전에 감싸는 함수가 없었음

⇒ **입력을 그대로 출력으로 만드는 Identity 함수**가 있었다고 재정의 할 수 있음

⇒ 퍼셉트론의 출력이 어떠한 형태로 나가야하는지 조절하는 역할

---

## + 실습

```python
# 라이브러리 사용
import tensorflow as tf
import pandas as pd

# 1. 과거의 데이터를 준비
file_path = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
iris = pd.read_csv(file_path)
iris.head()
```

```python
# 원핫인코딩
encoding = pd.get_dummies(iris)
encoding.head()
```

```python
# 칼럼 확인
print(encoding.columns)
```

```python
# 독립변수, 종속변수
독립 = encoding[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = encoding[['품종_setosa', '품종_versicolor','품종_virginica']]
print(독립.shape, 종속.shape)
```

```python
# 2. 모델의 구조를 만든다
X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X,Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')

# 3. 데이터 모델응 학습(FIT)
model.fit(독립, 종속, epochs=10)
```

```python
# 4.모델을 이용
model.predict(독립[0:5])
```

 ⇒ [setosa, virginica, versicolor]

⇒ setosa일 확률 98프로

```python
# 학습한 가중치
model.get_weights()
```

- 칼럼[0] - setosa (함수 씌워야함 - softmax)

---

출처 : [https://opentutorials.org/course/4570/28987](https://opentutorials.org/course/4570/28987)

'머신러닝 > Tensorflow 기초' 카테고리의 다른 글

+ 머신러닝 마무리  (0) 2021.01.21
4. 신경망 완성 : 히든 레이어  (2) 2021.01.20
+ 딥러닝 학습의 원리  (0) 2021.01.15
2. 보스턴 집값 예측  (0) 2021.01.14
1. 레모네이드 판매 예측  (1) 2021.01.13