데이터 처리

# 1. Pandas 가져오기
import pandas as pd
# 2. 데이터 불러오기
data = pd.read_csv('diabetes_data.csv')
data.head()

# 데이터 통계치 확인하기

data.describe()

# 3. X/y 나누기
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values

# values를 붙여서 numpy array형태로 가져온다!!!!! 매우 중요하다!!!! 큰 깨달음
print(X.shape)
print(y.shape)
# 4. Train set, Test set 나누기
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25, random_state=42)


X_val, X_test, y_val, y_test = train_test_split(X_test,y_test, 
                                                test_size=0.5,
                                                random_state=19)
print(X_train.shape)
print(X_val.shape)
print(X_test.shape)
print(y_train.shape)
print(y_val.shape)
print(y_test.shape)

Keras 모델 만들기

# 5. Keras 패키지 가져오기

from keras.models import Sequential
from keras.layers import Dense

# 6. MLP 모델 생성

model = Sequential()

model.add(Dense(units=64, input_dim=8, activation='relu'))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))

model.summary()

# 7. Compile - Optimizer, Loss function 설정
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# 8. 학습시키기
from keras.callbacks import EarlyStopping, ModelCheckpoint

early_stop = EarlyStopping(patience=20)
batch_size = 32
epochs = 200
history = model.fit(X_train,y_train,
                  batch_size=batch_size,
                  nb_epoch=epochs,
                  validation_data=(X_val,y_val),
                  callbacks=[early_stop],
                  verbose=1
                  )

# 9. 모델 평가하기
train_acc = model.evaluate(X_train,y_train)
test_acc = model.evaluate(X_test,y_test)

print(train_acc)
print(test_acc)

시각화

# 10. 학습 시각화하기
import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])

plt.title('Accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train','val'], loc = 'upper left')
plt.show()

# loss 값 그래프 그리기
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])

plt.title('loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train','val'], loc = 'upper left')
plt.show()

# 11. 모델 저장
model_path ='diabet_model.h5'
model.save(model_path)
# 12. 모델 불러오기

from keras.models import load_model

loaded_model = load_model(model_path)
print(loaded_model.summary())

 

'Data Anaylsis > Deep Learning' 카테고리의 다른 글

딥러닝 3일차  (0) 2020.03.18
딥러닝 2일차  (0) 2020.03.17
AND,OR/XOR 문제 keras로 구현!  (0) 2020.03.16
Deep learning 1일차  (0) 2020.03.16
conda 가상환경 설치  (1) 2020.03.13

AND 문제

# 1. Numpy 가져오기
import numpy as np

print(np.__version__)
import keras

print(keras.__version__)
# 3. Keras 패키지 가져오기
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
# 2. 입력/출력 데이터 만들기

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[0],[0],[1]])
# 4. Perceptron 모델 생성

model = Sequential()

model.add(Dense(units=1, input_dim=2, activation='sigmoid'))

model.summary()

# 5. Compile - Optimizer, Loss function 설정

sgd = SGD(lr=0.1)

model.compile(loss='binary_crossentropy',
              optimizer=sgd)
# 6. 학습시키기

model.fit(X,y, batch_size=1, nb_epoch=500)
# 7. 모델 테스트하기
test = np.array([[0,1]])
pred = model.predict(test)

print(pred)

[[0.09028968]]

print(model.get_weights())

[array([[4.248023 ], [4.2462897]], dtype=float32), array([-6.5563927], dtype=float32)]

 


OR 문제

X = np.array([[0,0],[0,1],[1,0],[1,1]])
Y = np.array([[0],[1],[1],[1]])
model = Sequential()

model.add(Dense(1, input_dim=2, activation='sigmoid'))
model.summary()

sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy', optimizer='sgd')
model.fit(X,Y, batch_size=1, nb_epoch=100)
test = np.array([[1,1]])
model.predict(test)

array([[0.9742955]], dtype=float32)

 

XOR 문제

 

X2 = np.array([[0,0],[1,0],[0,1],[1,1]])
Y2 = np.array([[0],[1],[1],[0]])
model_2 = Sequential()

model_2.add(Dense(units=16,input_dim=2, activation='relu'))
model_2.add(Dense(units=1, activation='sigmoid'))

model_2.compile(loss='binary_crossentropy',optimizer=sgd)
model_2.fit(X2,Y2, batch_size=1, nb_epoch=200)
test = np.array([[0,0],[1,0],[0,1],[1,1]])
pred = model_2.predict(test)
print(pred)

 

'Data Anaylsis > Deep Learning' 카테고리의 다른 글

딥러닝 3일차  (0) 2020.03.18
딥러닝 2일차  (0) 2020.03.17
Keras 모델 생성/학습 - 당뇨병 예측 모델  (0) 2020.03.16
Deep learning 1일차  (0) 2020.03.16
conda 가상환경 설치  (1) 2020.03.13

python으로 다양한 라이브러리를 받아서 사용하다 보면,

라이브러리의 버전 차이 때문에 곤란할 때가 많습니다.

 

 

여기서는, conda 명령어를 통해 environment(가상 환경)을 만들어,

그곳에 필요한 라이브러리를 설치하는 실습을 해보도록 하겠습니다.

(주의! anaconda 64bit, window 환경이 기본적으로 설치되어 있어 합니다!)

Anaconda Prompt를 열어주세요!


 

env 만들기

conda create -n keras_env python=3.6

keras_env라는 이름으로 가상 환경을 만들건대, python 버전은 3.6으로 설치할 것이라고 명명한다.

 

설치되어있는 env를 보려면 

conda env list

라고 작성해주시면 됩니다.

Anaconda Prompt 창을 보시면

 

다음과 같이 (base)라는 것을 보실 수 있습니다. base는 가상 환경이 아닌 기본 환경을 뜻하는 것으로,

가상 환경으로 넘어가서 라이브러리들을 설치해주어야 합니다.

conda activate keras_env

다음과 같이 작성해주시면 

가상 환경이 활성화되었음을 확인할 수 있습니다.

pip list

해보시면,

 

기본적으로 설치되는 라이브러리들(뭔가 가상환경 실행을 위한 파일들 같음) 빼고는 라이브러리가 텅텅 빈 것을 볼 수 있습니다.

 

# 가상환경 비활성화
conda deactivate

# 가상환경 삭제
conda env remove -n keras_env

다음 명령어로 비활성화할 수 있고, 삭제할 수 있습니다.

 

마지막으로, 가상 환경에 tensorflow와 keras를 설치해보도록 하겠습니다.

현재는 tensorflow가 2.1.0까지 나와있는 상태입니다.

"케라스 창시자에게 배우는 딥러닝" 책을 공부하기 위해서, 책에서 사용하는 라이브러리 버전과 같게

tensor flow를 설치하는게 아무래도 좋겠죠?

tensorflow는 1.8.0 버전, keras는 2.2.0 버전을 사용하는 것 같으니 버전을 맞추어 pip로 설치해보도록 합시다.

 

가상환경 turn it on!

pip install tensorflow==1.8.0
pip install keras==2.2.0

설치가 문제없이 되었음을 확인할 수 있습니다.

python을 열고 import 해보겠습니다.

 

잘 import 되는 것을 확인할 수 있습니다!

 

지금까지 가상환경 설치, 가상환경에서 tensorflow,keras를 버전에 맞추어 설치해보았습니다.

'Data Anaylsis > Deep Learning' 카테고리의 다른 글

딥러닝 3일차  (0) 2020.03.18
딥러닝 2일차  (0) 2020.03.17
Keras 모델 생성/학습 - 당뇨병 예측 모델  (0) 2020.03.16
AND,OR/XOR 문제 keras로 구현!  (0) 2020.03.16
Deep learning 1일차  (0) 2020.03.16

선형 회귀분석의 기초라고 할 수 있는 단순 선형 회귀분석이다.

 

머신러닝에 있어서 정답 레이블이 연속형인 값을 예측하는 데 사용된다.

 

예를 들어보자.

아버지의 키를 통해 아들의 키가 몇이 될지 예측하고 싶다.

<여기서 아버지의 키는 X변수(독립변수, feature), 아들의 키는 Y변수(종속변수, label)이다.>

데이터로 몇 명의 아버지와 몇명의 아들의 키를 가지고 있다.

 

다음과 같이 아버지의 키와 아들의 키를 scatter로 뿌려보면 다음과 같이 보일 것이다.

그러면 우리는 아버지의 키와 아들의 키를 잘 설명할 수 있는 직선을 그을 수 있다.

다음과 같이 여러 직선을 그은 것 중에, 점(실제 데이터)과 예측(점과 X값이 같으면서 선위의 점) 사이의 거리(cost)

최소가 되는 점이 아버지의 키와 아들의 키를 가장 잘 설명하는 직선이 될 것이다.


왜 우리는 이러한 선을 긋고,

예측을 하려는 것일까?

 

머신러닝의 기본으로 다시 돌아와 보면,

데이터가 풍부해짐에 따라 

가지고 있는 데이터를 통해

새로운 데이터를 맞이 했을 때, 그 값을 미리 예측할 수 있다면,

어떠한 서비스를 예측하여 제공해 줄 수도 있고,

기후 예측 등 실생활에서 활용을 할 수 있다.


 

이 예제에서도 마찬가지로, 아버지의 키를 통해 아들의 키가 어떻게 변화하는지를 보면서

아버지의 키와 아들의 키가 관계가 있다는 인사이트를 도출할 수 있다.

 

다시 본론으로 돌아오면, 이러한 점과 선 사이의 거리는 제곱의 형태나 절댓값의 형태로 나타낼 수 있다.

제곱을 다 더한 것이 우리가 자주 듣던 MSE(Mean Squared Error, 평균 제곱 오차)이고,

절댓값을 다 더한 것이 MAE(Mean Absolute Error, 오차절대합)이다.

결국, 점-선 또는 선-점을 합해버리면 그 값들이 상쇄가 되어 제곱이나 절댓값 형태를 취해주어서

상실되는 것을 방지하는 것이다.

 

여기서 제곱을 한다면, 에러가 크게 날 수록, 그 에러에 대해 제곱을 하게 되면 더 크게 값이 형성된다.

제곱 형태를 사용하면, 많이 벗어난 에러애 대해 큰 벌점을 주게 되는 것이다.

이러한 경우, 이상점이 있다면 error가 높을 것이라는 추측을 할 수 있다.


MSE를 활용하여 cost함수를 최소화 하도록 해보자.

수식적으로 간단하게 접근해보자.

저 아버지와 아들의 관계를 나타낸 선을 y = wx + b라고 한다면,

y와 x의 관계를 잘 설명하는 최적의 w와 b를 구하는 것이 목표인 것이다.

 

여기서  

y는 우리가 예측할 값이므로 H(x)로 표현할 수 있다.

이러한 과정을 Gredient Decesnt, 경사하강법이라고 부른다.

이를 수식적으로 표현해보면, 다음과 같은 cost 식을 도출해 낼 수 있다. 우리는 이 cost(W,b)를 최소화하는 것이 목적이다.

위의 식에서 H(x)자리에 wx+b를 대입하고, 식을 푼다면 이 식은 W에 대한 2차방정식으로 표현될 수 있다.

(나머지 문자는 상수 취급)

그러면 우리는 2차방정식을 그래프(2차함수, 아래로볼록)을 그릴 수 있고,

X축은 W축, Y축은 COST축이라고 말할 수 있다.

 

이 cost가 가장 작은 지점은  이차함수에 있어서 미분된 값(기울기)가 0이 되는 지점일 것이다.

그 값을 구하기 위해 W미분값이 최소가 되는 값을 구하는 과정이 바로 Gredient Decent의 핵심 아이디어이다.

 

기존 가중치 - 알파(learning rate, 학습률) * W를 미분해서 나온 값 * cost(W)값 을 진행하면서

W의 값을 계속 업데이트 해나가며, 더이상 W가 움직이지 않을때, 그 지점이 바로 cost의 최솟값, w의 최적값이 되는 것이다.

 

 여기서 알파값(learning rate)을 어떻게 잡느냐에 따라 W가 움직이는 속도가 정해진다. learning rate 값이 클수록 W는 크게크게 바뀌게될 것이고, learning rate 값이 작을수록 천천히 접근하게 될 것이다.

이를 잘 맞춰 주어야한다.

 

단순선형회귀의 기본적인 개념은 여기까지다.

질문이 있으시다면 댓글에 적어주시면

성실히 답변해드리겠슴다.

 

'Data Anaylsis > Machine Learning' 카테고리의 다른 글

gausian mixture  (0) 2020.04.13
릿지 라쏘 엘라스틱넷  (1) 2020.03.12
다중회귀, 다항회귀(Multiple linear regression, Polynomial regression)  (0) 2020.03.06
s  (0) 2020.02.27
데이터분석 기본개념  (0) 2020.02.12

+ Recent posts