초간단 예측 AI 만들기
아래와 같은 cs데이터가 있다고 가정하자
admit : 실제 합격했는지 안했는지
gre : 영어성적
gpa : 학점
rank : 지원한 대학교수준 1이 제일 높은거
위 데이터를 학습시켜서 학습시켜서
gre gpa rank 데이터를 주면 admit(합격여부)을 확률로 예측하는 딥러닝 모델을 만들어 보자
텐서플로우의 keras를 사용하면 알아서 학습해준다
1. 신경망 시퀀스
먼저 신경망 레이어를 만들어보자
신경망레이어는 Sequential를 사용하면 쉽게 만들 수 있다
아래와 같이 적고 그 안에 레이어들을 넣는다
import tensorflow as tf
model = tf.keras.models.Sequentrial([
레이어1,
레이어2,
레이어3,
])
커다란 시퀀스 안에 여러개의 레이어들이 있는것이다
2. 레이어
레이어를 작성하는 방법이 있다
tf.keras.layers.Dense()를 이용한다
import tensorflow as tf
model = tf.keras.models.Sequentrial([
tf.keras.layers.Dense(),
tf.keras.layers.Dense(),
tf.keras.layers.Dense(),
])
3. 노드의 개수
이후에 소괄호 안에 숫자를 입력해야하는데
한 레이어 안에 들어갈 노드의 개수이다.
레이어의 갯수는 결과가 잘나올때까지 아무렇게나 설정하면되는데
보통은 2의 제곱수를 쓰면 결과값이 잘나온다
그리고 중요한건 제일 마지막 노드는 1개를 해주는게 중요하다.
이유는 내가 원하는 결과값이 하나이기 때문인데
만약 결과값을 두개로 하고싶다면 2를 넣으면된다. 일반적으론 1을 쓴다
그리고 1을하면
예측값은 항상 실수로 나온다. 정수로 거의 안나온다. 정수가 필요하면 반올림을 하면된다.
import tensorflow as tf
model = tf.keras.models.Sequentrial([
tf.keras.layers.Dense(64),
tf.keras.layers.Dense(128),
tf.keras.layers.Dense(1),
])
4. 활성함수(activation function)
레이어를 디자인할때 활성함수를 넣어줘야하는데
Dense함수의 두번째 파라미터에 넣어준다.
활성함수로는
sigmoid, tanh, relu, softmax, leakyRelu 등이 있다
https://jwinjection.tistory.com/238
둘다 tanh로 설정해보겠다.
import tensorflow as tf
model = tf.keras.models.Sequentrial([
tf.keras.layers.Dense(64, activation ='tanh'),
tf.keras.layers.Dense(128 activation ='tanh'),
tf.keras.layers.Dense(1),
])
그리고 마지막 레이어가 중요한데
마지막 레이어의 예측결과는 합격여부확률을 알려주는거라
0~1사이 확률로 뱉어야하기때문에
활성함수로 sigmoid를 사용할것이다
sigmoid는 모든 수를 0에서 1사이로 압축해주는 함수이기때문
그래서 출력결과가 0.8가 나왔다 그럼
=입학확률 80% 가 되는 것이다
여기까지 모델디자인 끝
5. 모델 compile
만든 모델을 compile해줘야 모델이 최종 완성된다
model.compile(optimizer=???, loss=???, metrics=['accuracy'])
1) optimizer
첫번째로 optimizer는
경사하강법 같은 걸로 w값을 수정해줘야하는데
https://jwinjection.tistory.com/239
기울기를 뺄때 learning rate이 곱하는데
그때그때 상황에 맞게 learning rate의 최적의 값을 구해주는것이 optimizer이다
기본제공되는 optimizer로
adam, adagrad, adadelta, rmsprop, sgd 등 이있다.
일반적으로는 adam 을 제일 많이 사용
model.compile(optimizer='adam', loss=???, metrics=['accuracy'])
3) loss function
로스함수도 문제마다 더 적합한 로스함수가 있는데
0~1 사이값, 확률 예측, 분류문제 등에 쓰는 로스함수가 바로
binary_crossentropy 이다
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
4) metrics
metircs는 모델을 딥러닝할때 어떤 요소를 평가할 건지 적는 칸
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
6. model 학습(fit) 시키기
만든 모델에 데이터만 넣어주고 fit 하면 알아서 학습을 해준다
x데이터는 트레이닝 테이터
y데이터는 정답 데이터 를 넣어주면된다
mopdel.fit(x데이터, y데이터, epochs=???)
예시를 들면
x데이터에는 gre, gpa, rank
y데이터에는 admit 이 들어간다고 보면된다
epochs 는 뭘까?
epochs는 몇번 학습을 시킬지를 정하는 변수인데
예를들어 10으로 정하면
10번 돌려서 학습하는거고 몇번을 해도 상관없다.
그럼 데이터를 어떤식으로 넣으면 좋을까?
최종적으로 하나의 리스트를 넣어주면된다.
x는 gre gpa rank 들을 하나의 행씩 리스트로 묶어서
아래와 같이 넣으면된다
x = [ [380, 3.21, 3] , [660, 3.67, 3] ... ]
y는 [ 0,1,1,1, 0 /... ] 이런식 또는 [ [0], [1], [1], ..] 이런식으로 넣어주면된다
import tensorflow as tf
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='tanh'),
tf.keras.layers.Dense(128, activation='tanh'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(x데이터, y데이터, epochs=10)
#[ [380,3.21.3], [660,3.67,3], [], [] ] 인풋
#[ [0], [1], [1], [1] .. ] 정답
pandas사용
그럼 이 많은 데이터를 직접 이렇게 치는가?!
아니다
파이썬 라이브러리인 pandas를 이용할 것이다
pandas는 주로 파이썬에서 행과 열로 구조화된 데이터들 엑셀이나 csv파일을 다루고싶을때 사용하는 라이브러리다
코드 제일 상위에 아래 코드를 추가해주자
import pandas as pd
참고로 나는 csv파일을 파이썬파일과 같은 경로에 뒀다
CSV파일을 읽어들여서 print 해보자
import pandas as pd
data = pd.read_csv('gpasscore.csv')
print(data)
아래와같이 컬럼명이 적히고
그아래에 행번호와 같이 데이터가 출력되는 것을 볼 수 있다
데이터 전처리(preprocessing) 하기
데이터를 입력값에 넣기 전에 해야할 작업이 하나 있다.
바로 전처리 이다.
데이터를 보면 중간에 빈칸이 있다
이럴땐
그 행 전체를 없애거나
아니면 위아래 평균값을 입력해주는데
빈값이 포함되어있는 행 전체를 없애는 전처리를 해보겠다
isnull함수를 사용해보겠다
import pandas as pd
data = pd.read_csv('gpasscore.csv')
print(data.isnull())
아래와같이 결과가 나온다
false이면 null 이 아니라는것
요약 해서 보고싶다면 sum()을 쓰면된다
import pandas as pd
data = pd.read_csv('gpasscore.csv')
print(data.isnull().sum())
gre에 null 값이 하나 있다는 뜻
빈값이 있는 행을 제거하기 위해서는
dropna라는 함수를 사용하면된다
import pandas as pd
data = pd.read_csv('gpascore.csv')
print(data.isnull().sum())
data = data.dropna()
print(data.isnull().sum())
제거전과 제거후를 비교해보면 아래와 같다
만약 제거하지않고 빈값을 특정 값으로 채우고싶다면
fillna 함수를 사용하면된다
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = fillna(100)
pandas 출력함수
다음은 열을 출력해보자
예를들어 gpa 열의 데이터들만 보고싶다면 아래와같이 작성하면된다
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
print(data['gpa'])
열관련 다양한 함수들이 있는데
먼저 최소값 구하는 함수이다
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
print(data['gpa'].min())
최대값도 있다
print(data['gpa'].max())
갯수도 셀수있다
print(data['gpa'].count())
pandas사용하여 데이터 리스트화 하기
이제 본격적으로 데이터를 리스트화 해보자
먼저y데이터를 만들어보자
[1,0,0,0,1..] 이런식으로 표현해야하는데
아래와 같이 적으면 끝이다
import tensorflow as tf
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
y데이터 = data['admit'].values
print(y데이터)
이제 x데이터를 만들어보자
x데이터는 [ [1,2,3] , [3,4,5] ] 이런식으로 한 행 씩 리스트로 묶여야하는데
반복문을 사용하면된다
data.iterrows를 쓰면
i값에는 인덱스번호
rows에는 row데이터가 순차적으로 들어간다
for i, rows in data.iterrows():
그래서 아래와 같이 작성하면된다
import tensorflow as tf
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
y데이터 = data['admit'].values
x데이터 = []
for i, rows in data.iterrows():
x데이터.append([rows['gre'],rows['gpa'],rows['rank']])
딥러닝 학습
이제 아래코드를 실행하면 에러가 날건데
import tensorflow as tf
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
y데이터 = data['admit'].values
x데이터 = []
for i, rows in data.iterrows():
x데이터.append([rows['gre'],rows['gpa'],rows['rank']])
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='tanh'),
tf.keras.layers.Dense(128, activation='tanh'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(x데이터, y데이터, epochs = 10)
이유는 x데이터, y데이터를 파이썬리스트를 그대로 집어넣었기때문인데
파이썬 리스트가 아니라
numpy array 또는 tf tensor 형으로 넣어줘야하기 때문이다
그래서 좀더 쉬운 리스트를 numpy array형태로 바꿔보자
아래 코드를 상단에 추가하자
import numpy as np
이후 x데이터와 y데이터를 np.array로 덮어씌워주자
import numpy as np
import tensorflow as tf
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
y데이터 = data['admit'].values
x데이터 = []
for i, rows in data.iterrows():
x데이터.append([rows['gre'],rows['gpa'],rows['rank']])
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='tanh'),
tf.keras.layers.Dense(128, activation='tanh'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(np.array(x데이터), np.array(y데이터), epochs = 10)
그리고 코드를 실행시키게 되면 학습을 하게될것이다.
아래와같이 결과가뜰건데
epoch는 몇번째 학습인지
loss는 현재 총손실 => 총손실이 적을수록 정확한것
accuracy 는 정확도(모델의 정답률) => 높을수록 좋음
정확도가 낮으니 epoch를 1000으로 늘려보자
손실이 좀 줄어들고 정확도가 조금 올라갔다ㅋ
5000번 돌려보자
와우
7. model 사용하기
이제 내가 학습시킨 모델을 사용해볼차례
predict() 함수를 사용하면된다.
학습시킬때 썻던 리스트 형식으로 데이터를 넣어주면된다
대신 얘는 numpy array 형식으로 안넣어도 된다
영수 : 750 3.7 3
철수 : 400 2.2 1
import numpy as np
import tensorflow as tf
import pandas as pd
data = pd.read_csv('gpascore.csv')
data = data.dropna()
y데이터 = data['admit'].values
x데이터 = []
for i, rows in data.iterrows():
x데이터.append([rows['gre'],rows['gpa'],rows['rank']])
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='tanh'),
tf.keras.layers.Dense(128, activation='tanh'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(np.array(x데이터), np.array(y데이터), epochs = 3000)
#예측
예측값 = model.predict([[750, 3.70, 3], [400, 2.2, 1]])
print(예측값)
영수 합격확률 86%
철수 합격확률 6%
성능향상
전처리를 깔끔하게 하기,
하이퍼 파라미터 튜닝 : 노드수, 레이어수 등 실험적으로 변경해보면서 딥러닝을 돌려보자,
활성함수,
optimizer 등등 적절한걸 사용하면됨.,
'AI > 🤖 딥러닝' 카테고리의 다른 글
딥러닝 | 경사하강법 (0) | 2024.08.11 |
---|---|
딥러닝 | 활성함수(Activation Function) (0) | 2024.08.11 |
딥러닝 | Neural Network 계산, Loss function (0) | 2024.08.11 |
딥러닝 | 뉴럴 네트워크 (0) | 2024.08.11 |
딥러닝 | 딥러닝이란? (0) | 2024.08.11 |