목차
-
인공지능 vs 기계학습 vs 딥러닝
-
전통 프로그래밍과 머신러닝 프로그래밍
-
전통 프로그래밍
-
머신러닝 프로그래밍
-
기계 학습 응용 분야
-
기계 학습의 분류
-
지도 학습(Supervised Learning)
-
지도 학습 : 선형회귀
-
지도 학습 : 분류
-
비지도 학습(Unsupervised Learning)
-
비지도 학습 : 군집화
-
강화 학습(Reinforcement Learning)
-
기계학습(ML) 알고리즘 선택
-
사이킷런으로 선형회귀 구
-
실습 . 다차원 선형회귀
-
인공 신경망
-
퍼셉트론(perceptron)
-
활성화 함수(Activation function)
-
텐서플로우(Tensorflow)
-
머신러닝 활용 절차
-
지도 학습 : 회귀 vs 분류
-
아이리스 품종 분류
-
원핫 인코딩(onehot-encoding)
-
활성화 함수와 손실 함수
-
소프트맥스(softmax)
-
아이리스 품종 분류(인공신경망)
-
딥러닝
-
딥러닝으로 손글씨 숫자 분류
-
모델 구조 작성
인공지능 vs 기계학습 vs 딥러닝
- 인공지능 (Artificial Intelligence)
- 인간처럼 학습하고 추론하는 프로그램 연구
- 기계학습 (Machine Learning)
- 인공지능의 한 분야
- 프로그래밍 없이 스스로 학습하는 프로그램 연구
- 딥러닝 (Deep Learning)
- 기계 학습의 한 분야
- 인공 신경망 등을 사용하여 빅데이터로부터 학습하는 프로그램 연구
전통 프로그래밍과 머신러닝 프로그래밍
전통 프로그래밍
머신러닝 프로그래밍
머신러닝은 정답에 가까운 예측을 내는 것
기계 학습 응용 분야
기계 학습의 분류
지도 학습이 결과가 제일 좋음
지도 학습(Supervised Learning)
- 컴퓨터는 "교사"에 의해 주어진 예제와 정답(혹은 레이블)을 제공받음
- 지도학습의 목표
- 입력을 출력에 매핑하는 일반적인 규칙을 학습
- 결과가 제일 좋고, 데이터를 준비하는데 더 많은 시간이 걸
지도 학습 : 선형회귀
- 지도학습
- 과거데이터 ⇒ 학습 ⇒ 모델(독립변수와 종속변수의 관계식) 생성
- 공식의 대중화
- 선형회귀
- 선형 관계식으로 모델 생성
- 모델에 신규 데이터 입력 ⇒ 예측치 출력
상관관계를 더 빨리 찾아서 관계식을 정립하고 예측을 한다.
지도 학습 : 분류
- 앞에 나왔던 식 y = f(x)에서 출력 y가 이산적(discrete)인 경우
- 분류 문제, 인식 문제
- 분류에서는 입력을 2개 이상의 클래스로 나누는 것
비지도 학습(Unsupervised Learning)
- “교사” 없이 컴퓨터가 스스로 입력들을 분류
- 식 y = f(x)에서 레이블 y가 주어지지 않는 것
- 데이터들의 상관도를 분석
- 유사한 데이터 모으기
알고리즘을 통해 분류 정도는 할 수 있을것 분류가 된 데이터에 인간이 레이블을 붙이면 정답이 생긴다.
비지도 학습 : 군집화
- 가장 대표적인 비지도 학습
- 클러스터링(군집화, clustering)
- 데이터간 거리를 계산하여서 입력을 몇 개의 그룹으로 나누는 방법
강화 학습(Reinforcement Learning)
- 컴퓨터가 어떤 행동을 취할 때마다 외부에서 처벌이나 보상이 주어짐
- 알파고 최종 버전도 강화 학습 사용
- 게임에서 많이 사용됨
기계학습(ML) 알고리즘 선택
사이킷런으로 선형회귀 구
# 2차원 배열로 전달하는 이유는
# 실습. 사이킷런으로 선형회귀 구현
# 새로운 학생의 키를 전달하여 몸무게 예측
import numpy as np
from sklearn import linear_model # scikit-learn 모듈을 가져온다.
regr = linear_model.LinearRegression()
X = [[164], [179], [162], [170]] # 다중회귀에도 사용하도록 함
y = [53, 63, 55, 59]
regr.fit(X, y)
input_data = [ [180] , [185] ]
result = regr.predict(input_data)
print(result)
예측을 하는데 학습된 데이터들 중에 제일 오차가 적은 기준으로 ?
# 선형회귀 그래프 그리기
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model # scikit-learn 모듈을 가져온다.
regr = linear_model.LinearRegression()
X = [[164], [179], [162], [170]] # 다중회귀에도 사용하도록 함
y = [53, 63, 55, 59]
regr.fit(X, y)
# 학습 데이터와 y 값을 산포도로 그린다.
plt.scatter(X, y, color='black')
# 학습 데이터를 입력으로 하여 예측값을 계산한다
y_pred = regr.predict(X)
# 학습 데이터와 예측ㄱ밧으로 선그래프로 그린다.
# 계산된 기울기와 y 절편을 가지는 직선이 그려진다.
plt.plot(X, y_pred, color='blue', linewidth=3)
plt.show()
여기에서 직선은 입력된 값들 중 상관관계를 정립한 결과의 오차가 제일 적은(최적)의 직선을 나타냄
→ 키와 몸무게 사이의 관계를 정립하고 키가 어떤 값일 때 몸무게가 대략 어떤 값인지를 예측
실습 . 다차원 선형회귀
# 다차원 선형 회귀
import numpy as np
from sklearn import linear_model
regr = linear_model.LinearRegression()
# 남자는 0, 여자는 1
# 입력데이터 X 값은 2차원 배열로 정의
X = [[164, 1], [167, 1], [165, 0], [170, 0], [179, 0], [163, 1], [159, 0], [166, 1]]
# y값은 1차원 데이터
y = [43, 48, 47, 66, 67, 50, 52, 44]
regr.fit(X, y) # 학습
print("계수 :" , regr.coef_)
print("절편 :", regr.intercept_ )
print("점수 :" , regr.score(X, y))
print("키 166 여학생의 추정 몸무게 : ", regr.predict([[166, 1]]))
print("키 166 남학생의 추정 몸무게 : ", regr.predict([[166, 0]]))
인공 신경망
- 인간의 뇌를 흉내 내어 만든 기계 학습 모델
- 신경세포속 수상돌기는 다른 신경세포로부터 신호를 전달받아서(입력) 이 신호에 대한 반응을 축삭말단을 통해서 다른 신경세포로 전달(출력)
- 인공적인 신경세포를 흉내내는 프로그램을 퍼셉트론 (Perceptron) 이라고도 함
퍼셉트론(perceptron)
- 입력 데이터는 입력 노드에 전달
- 입력 노드는 출력 노드로 연결
- 출력 노드는 두 개의 기능으로 구분
- 전달되어 오는 신호를 모두 합하는 부분
- 이렇게 합산된 신호에 따라 다음 계층으로 신호를 보낼 것인지 말 것인지는 활성화activation 함수에 의해 결정
활성화 함수(Activation function)
- 활성화 함수 종류
- 시그모이드(Sigmoid), 하이퍼볼릭 탄젠트(tanh), 소프트맥스(Softmax)
- 렐루(ReLU), 스위시(swish)
텐서플로우(Tensorflow)
- 머신러닝과 딥러닝을 위한 오픈소스 플랫폼
- 텐서플로우는 우수한 기능과 서비스를 제공
- 병렬처리를 잘 지원
- 고급 신경망 네트워크 모델을 쉽게 구현
- 케라스 활용
- 텐서플로우 패키지 포함
- import tensorflow as tf
- 텐서플로우 패키지 버전 확인
- tf.version
머신러닝 활용 절차
- 데이터 준비
- 머신러닝 모델 구조 작성
- 기계 학습(Fit)
- 모델 이용
- 데이터 준비 → 판다스 이용
- 모델 구조 작성 → 케라스 이용
# 판매 예측 (인공신경망, keras 활용)
import tensorflow as tf
import pandas as pd
# 1. 데이터를 준비함
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/lemonade.csv'
레모네이드 = pd.read_csv(파일경로, encoding='UTF-8')
# 종속변수, 독립변수
독립 = 레모네이드[['온도']]
종속 = 레모네이드[['판매량']]
print(독립.shape, 종속.shape)
# 2. 모델을 만듭니다.
X = tf.keras.layers.Input(shape=[1])
Y = tf.keras.layers.Dense(1)(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')
# 3. 모델을 학습시킵니다.
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)
# 4. 모델을 이용합니다.
print(model.predict(독립))
print(model.predict([[15]]))
데이터가 한계적이기 때문에 epochs로 해당 데이터를 반복해서 학습해
지도 학습 : 회귀 vs 분류
- 지도 학습 데이터가 수치 데이터(양적)이면 회귀 문제
- 지도 학습 데이터가 범주형 데이터이면 분류 문제
아이리스 품종 분류
- 아이리스 품종은 범주형 데이터 è 분류 문제
- 원핫 인코딩 필요
- 판다스의 get_dummies() 함수 이용
원핫 인코딩(onehot-encoding)
- 범주형 데이터를 수치 데이터로 변환하여줌
활성화 함수와 손실 함수
- 활성화 함수로 softmax 사용
- 손실(비용) 함수로 다중분류용 categorical_crossentropy 사용
소프트맥스(softmax)
- 다중 분류 문제에서 사용되는 활성화 함수
- 확률 값의 합이 1
아이리스 품종 분류(인공신경망)
import tensorflow as tf
import pandas as pd
# 1. 데이터를 준비함
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로, encoding='UTF-8')
# 원핫인코딩
인코딩 = pd.get_dummies(아이리스)
# 독립변수, 종속변수
독립 = 인코딩[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 인코딩[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)
# 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=100)
# 모델을 이용합니다.
# 맨 처음 데이터 5개
print(model.predict(독립[:5]))
print(종속[:5])
딥러닝
- 히든 레이어를 여러 층 사용한 인공지능망
딥러닝으로 손글씨 숫자 분류
- MNIST 데이터 셋 활용
- 28*28 픽셀 이미지
- 총 70,000개 데이터로 구성
- 훈련 데이터 60,000개
- 테스트 데이터 10,000개
# 딥러닝으로 손글씨 숫자 분류
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# 데이터 불러오기
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# x_train.shape = (60000, 28, 28), y_train.shape = (60000,)
print(x_train.shape, '', y_train.shape)
# 훈련 데이터의 첫 번째 이미지 출력하기
plt.imshow(x_train[0], cmap='gray')
plt.show()
- 데이터 전처리
- 픽셀별 0~255 범위의 값을 0.0 ~ 1.0 범위의 값으로 변환(정규화)
모델 구조 작성
- 입력층, 은닉층, 출력층 생성
- 입력층을 1차원으로 생성 : 2차원 이미지 배열을 1차원 이미지 배열로 변환
- Flatten() 함수 사용
- 활성화 함수 설정
- 은닉층 : 렐루(ReLU) 함수
- 출력층 : 소프트맥스(softmax) 함수
- 모델 학습
- 모델 컴파일에서 설정한 학습 방법으로 모델 학습
- 훈련 데이터, 훈련 데이터 레이블, 반복 학습 횟수(epochs) 설정 필요
- 훈련 데이터를 반복 학습하면서 정확도를 높임
- 너무 많이 학습하면 훈련 데이터만 정확히 예측하는 과대적합 문제 발생
- 모델 평가
- 모델이 학습 완료 후 테스트 데이터와 테스트 데이터 레이블을 사용하여 새로운 데이터를 얼마나 잘 예측하는지 확인
- evaluate() 메소드 사용
- 손글씨 숫자 예측
- predict() 메소드 사용
인공지능 vs 기계학습 vs 딥러닝
- 인공지능 (Artificial Intelligence)
- 인간처럼 학습하고 추론하는 프로그램 연구
- 기계학습 (Machine Learning)
- 인공지능의 한 분야
- 프로그래밍 없이 스스로 학습하는 프로그램 연구
- 딥러닝 (Deep Learning)
- 기계 학습의 한 분야
- 인공 신경망 등을 사용하여 빅데이터로부터 학습하는 프로그램 연구
전통 프로그래밍과 머신러닝 프로그래밍
전통 프로그래밍
머신러닝 프로그래밍
머신러닝은 정답에 가까운 예측을 내는 것
기계 학습 응용 분야
기계 학습의 분류
지도 학습이 결과가 제일 좋음
지도 학습(Supervised Learning)
- 컴퓨터는 "교사"에 의해 주어진 예제와 정답(혹은 레이블)을 제공받음
- 지도학습의 목표
- 입력을 출력에 매핑하는 일반적인 규칙을 학습
- 결과가 제일 좋고, 데이터를 준비하는데 더 많은 시간이 걸
지도 학습 : 선형회귀
- 지도학습
- 과거데이터 ⇒ 학습 ⇒ 모델(독립변수와 종속변수의 관계식) 생성
- 공식의 대중화
- 선형회귀
- 선형 관계식으로 모델 생성
- 모델에 신규 데이터 입력 ⇒ 예측치 출력
상관관계를 더 빨리 찾아서 관계식을 정립하고 예측을 한다.
지도 학습 : 분류
- 앞에 나왔던 식 y = f(x)에서 출력 y가 이산적(discrete)인 경우
- 분류 문제, 인식 문제
- 분류에서는 입력을 2개 이상의 클래스로 나누는 것
비지도 학습(Unsupervised Learning)
- “교사” 없이 컴퓨터가 스스로 입력들을 분류
- 식 y = f(x)에서 레이블 y가 주어지지 않는 것
- 데이터들의 상관도를 분석
- 유사한 데이터 모으기
알고리즘을 통해 분류 정도는 할 수 있을것 분류가 된 데이터에 인간이 레이블을 붙이면 정답이 생긴다.
비지도 학습 : 군집화
- 가장 대표적인 비지도 학습
- 클러스터링(군집화, clustering)
- 데이터간 거리를 계산하여서 입력을 몇 개의 그룹으로 나누는 방법
강화 학습(Reinforcement Learning)
- 컴퓨터가 어떤 행동을 취할 때마다 외부에서 처벌이나 보상이 주어짐
- 알파고 최종 버전도 강화 학습 사용
- 게임에서 많이 사용됨
기계학습(ML) 알고리즘 선택
사이킷런으로 선형회귀 구
# 2차원 배열로 전달하는 이유는
# 실습. 사이킷런으로 선형회귀 구현
# 새로운 학생의 키를 전달하여 몸무게 예측
import numpy as np
from sklearn import linear_model # scikit-learn 모듈을 가져온다.
regr = linear_model.LinearRegression()
X = [[164], [179], [162], [170]] # 다중회귀에도 사용하도록 함
y = [53, 63, 55, 59]
regr.fit(X, y)
input_data = [ [180] , [185] ]
result = regr.predict(input_data)
print(result)
예측을 하는데 학습된 데이터들 중에 제일 오차가 적은 기준으로 ?
# 선형회귀 그래프 그리기
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model # scikit-learn 모듈을 가져온다.
regr = linear_model.LinearRegression()
X = [[164], [179], [162], [170]] # 다중회귀에도 사용하도록 함
y = [53, 63, 55, 59]
regr.fit(X, y)
# 학습 데이터와 y 값을 산포도로 그린다.
plt.scatter(X, y, color='black')
# 학습 데이터를 입력으로 하여 예측값을 계산한다
y_pred = regr.predict(X)
# 학습 데이터와 예측ㄱ밧으로 선그래프로 그린다.
# 계산된 기울기와 y 절편을 가지는 직선이 그려진다.
plt.plot(X, y_pred, color='blue', linewidth=3)
plt.show()
여기에서 직선은 입력된 값들 중 상관관계를 정립한 결과의 오차가 제일 적은(최적)의 직선을 나타냄
→ 키와 몸무게 사이의 관계를 정립하고 키가 어떤 값일 때 몸무게가 대략 어떤 값인지를 예측
실습 . 다차원 선형회귀
# 다차원 선형 회귀
import numpy as np
from sklearn import linear_model
regr = linear_model.LinearRegression()
# 남자는 0, 여자는 1
# 입력데이터 X 값은 2차원 배열로 정의
X = [[164, 1], [167, 1], [165, 0], [170, 0], [179, 0], [163, 1], [159, 0], [166, 1]]
# y값은 1차원 데이터
y = [43, 48, 47, 66, 67, 50, 52, 44]
regr.fit(X, y) # 학습
print("계수 :" , regr.coef_)
print("절편 :", regr.intercept_ )
print("점수 :" , regr.score(X, y))
print("키 166 여학생의 추정 몸무게 : ", regr.predict([[166, 1]]))
print("키 166 남학생의 추정 몸무게 : ", regr.predict([[166, 0]]))
인공 신경망
- 인간의 뇌를 흉내 내어 만든 기계 학습 모델
- 신경세포속 수상돌기는 다른 신경세포로부터 신호를 전달받아서(입력) 이 신호에 대한 반응을 축삭말단을 통해서 다른 신경세포로 전달(출력)
- 인공적인 신경세포를 흉내내는 프로그램을 퍼셉트론 (Perceptron) 이라고도 함
퍼셉트론(perceptron)
- 입력 데이터는 입력 노드에 전달
- 입력 노드는 출력 노드로 연결
- 출력 노드는 두 개의 기능으로 구분
- 전달되어 오는 신호를 모두 합하는 부분
- 이렇게 합산된 신호에 따라 다음 계층으로 신호를 보낼 것인지 말 것인지는 활성화activation 함수에 의해 결정
활성화 함수(Activation function)
- 활성화 함수 종류
- 시그모이드(Sigmoid), 하이퍼볼릭 탄젠트(tanh), 소프트맥스(Softmax)
- 렐루(ReLU), 스위시(swish)
텐서플로우(Tensorflow)
- 머신러닝과 딥러닝을 위한 오픈소스 플랫폼
- 텐서플로우는 우수한 기능과 서비스를 제공
- 병렬처리를 잘 지원
- 고급 신경망 네트워크 모델을 쉽게 구현
- 케라스 활용
- 텐서플로우 패키지 포함
- import tensorflow as tf
- 텐서플로우 패키지 버전 확인
- tf.version
머신러닝 활용 절차
- 데이터 준비
- 머신러닝 모델 구조 작성
- 기계 학습(Fit)
- 모델 이용
- 데이터 준비 → 판다스 이용
- 모델 구조 작성 → 케라스 이용
# 판매 예측 (인공신경망, keras 활용)
import tensorflow as tf
import pandas as pd
# 1. 데이터를 준비함
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/lemonade.csv'
레모네이드 = pd.read_csv(파일경로, encoding='UTF-8')
# 종속변수, 독립변수
독립 = 레모네이드[['온도']]
종속 = 레모네이드[['판매량']]
print(독립.shape, 종속.shape)
# 2. 모델을 만듭니다.
X = tf.keras.layers.Input(shape=[1])
Y = tf.keras.layers.Dense(1)(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')
# 3. 모델을 학습시킵니다.
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)
# 4. 모델을 이용합니다.
print(model.predict(독립))
print(model.predict([[15]]))
데이터가 한계적이기 때문에 epochs로 해당 데이터를 반복해서 학습해
지도 학습 : 회귀 vs 분류
- 지도 학습 데이터가 수치 데이터(양적)이면 회귀 문제
- 지도 학습 데이터가 범주형 데이터이면 분류 문제
아이리스 품종 분류
- 아이리스 품종은 범주형 데이터 è 분류 문제
- 원핫 인코딩 필요
- 판다스의 get_dummies() 함수 이용
원핫 인코딩(onehot-encoding)
- 범주형 데이터를 수치 데이터로 변환하여줌
활성화 함수와 손실 함수
- 활성화 함수로 softmax 사용
- 손실(비용) 함수로 다중분류용 categorical_crossentropy 사용
소프트맥스(softmax)
- 다중 분류 문제에서 사용되는 활성화 함수
- 확률 값의 합이 1
아이리스 품종 분류(인공신경망)
import tensorflow as tf
import pandas as pd
# 1. 데이터를 준비함
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로, encoding='UTF-8')
# 원핫인코딩
인코딩 = pd.get_dummies(아이리스)
# 독립변수, 종속변수
독립 = 인코딩[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 인코딩[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)
# 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=100)
# 모델을 이용합니다.
# 맨 처음 데이터 5개
print(model.predict(독립[:5]))
print(종속[:5])
딥러닝
- 히든 레이어를 여러 층 사용한 인공지능망
딥러닝으로 손글씨 숫자 분류
- MNIST 데이터 셋 활용
- 28*28 픽셀 이미지
- 총 70,000개 데이터로 구성
- 훈련 데이터 60,000개
- 테스트 데이터 10,000개
# 딥러닝으로 손글씨 숫자 분류
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# 데이터 불러오기
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# x_train.shape = (60000, 28, 28), y_train.shape = (60000,)
print(x_train.shape, '', y_train.shape)
# 훈련 데이터의 첫 번째 이미지 출력하기
plt.imshow(x_train[0], cmap='gray')
plt.show()
- 데이터 전처리
- 픽셀별 0~255 범위의 값을 0.0 ~ 1.0 범위의 값으로 변환(정규화)
모델 구조 작성
- 입력층, 은닉층, 출력층 생성
- 입력층을 1차원으로 생성 : 2차원 이미지 배열을 1차원 이미지 배열로 변환
- Flatten() 함수 사용
- 활성화 함수 설정
- 은닉층 : 렐루(ReLU) 함수
- 출력층 : 소프트맥스(softmax) 함수
- 모델 학습
- 모델 컴파일에서 설정한 학습 방법으로 모델 학습
- 훈련 데이터, 훈련 데이터 레이블, 반복 학습 횟수(epochs) 설정 필요
- 훈련 데이터를 반복 학습하면서 정확도를 높임
- 너무 많이 학습하면 훈련 데이터만 정확히 예측하는 과대적합 문제 발생
- 모델 평가
- 모델이 학습 완료 후 테스트 데이터와 테스트 데이터 레이블을 사용하여 새로운 데이터를 얼마나 잘 예측하는지 확인
- evaluate() 메소드 사용
- 손글씨 숫자 예측
- predict() 메소드 사용