|
1.기계학습
:인공지능의 한 분야로, 컴퓨터에 학습기능을 부여하기 위한 연구 분야.
:이들 알고리즘은 항상 고전적인 의사결정을 하는 프로그램과 다르게, 데이터 중심의 예측 또는 결정을 내릴 수 있다.
:기계학습은 어떤 문제에 대하여 명시적 알고리즘을 설계하고 프로그래밍하기 어렵거나 불가능한 경우 주로 사용됨.
2.기계학습이 중요하게 사용되는 분야
-음성인식처럼 규칙과 공식이 복잡할때
-신용카드 거래 사기 감지 처럼 작업 규칙이 지속적으로 바뀌는 상황
-주식거래처럼 데이터 특징이 계속 바뀌고 프로그램 계속 변경해야할때
-전자메일 스팸 판단
-구매자가 클릭할 확률이 가장 높은 광고 알아내고싶을때 , 사용자가 선호하는 상품 자동 추천하고싶을때
-영상인식:다양한 상황처리, 이미지 자동 분류, 이미지 데이터베이스중 특정이미지 탐색할때
-자동 번역,의료진단,가상 개인 보조
3.기계학습의 분류
(1)지도학습: 지도학습의 목표는 입력을 출력에 매핑하는 일반적인 규칙을 학습하는 것.
(2)비지도학습 : 외부에서 정답이 주어지지않고 학습 알고리즘이 스스로 입력에서 어떤 구조를 발견하는 학습.
: 데이터 숨겨진 패턴 발견 가능, 대표적인 것: 클러스터링: ex구글 뉴스에서 비슷한 뉴스 자동으로 그룹핑하는 것
(3)강화학습 : 보상이나 처벌 형태의 피드백으로 학습이 이루어지는 기계학습.
: 주로 동적인 환겨엥서 프로그램의행동에 대한 피드백만 제동됨. ex)바둑에서 어떤 수를 두어서 승리하면 보상이 주어짐.
4.지도학습
:입력-출력 쌍을 학습한 후 새로운 입력값 들어와씅ㄹ때 출력값을 합리적으로 예측하는 것.
:입력과 출력이 주어질때 입력에서 출력으로의 매핑 함수를 학습하는 것
y=f(x)
:크게 분류 -선형회귀와 분류로 나눌수 있음.
-지도학습 : 회귀
-일반적으로 예제 데이터들을 2차원 공간에 찍은 후 , 이들 데이터들을 가장 잘 설명하는 직선이나 곡선을 찾는 문제.
-학습이 끝난 후새로운 데이터가 들어오면 이 직선이나 곡선을 이용하여 출력 값을 예측하게 된다.
-회귀는 출력의 형태가 이산적이 아닌 연속적임 ==> 즉 y=f(x)에서 x,y가 모두 실수이다.
-지도학습 : 분류
-식 y=f(x)에서 출력 y가 이산적인 경우 이것을 분류문제라고 부름.
-분류는 입력을 2개 이상의 클래스로 나눔.
-딥러닝, knn ,svm,의사 결정 트리 등이 있다.
5.비지도 학습
-교사없이 컴퓨터가 스스로 입력들을 분류하는 것
-y=f(x)에서 정답인 y레이블이 주어지지 않는것.
-정답이 없는 문제를 푸는 것과 같으므로 학습이 맞게 되었는지 확인할 수 없지만 데이터들의 상관도를 분석하여 유사한 데이터들을 모을 수 있음.
-클러스터링(군집화)
6.기계학습의 요소
-특징
:학습 모델에게 공급하는 입력
-학습데이터,텍스트 데이터
7.선형 회귀 분석
-선형회귀
: 입력데이터를 가장 잘 설명하는 직선의 기울기와 절편을 찾는 문제
-직선의 방적식 f(x) =mx+b
m:직선의 기울기 , b:절편
-기계학습에서는 기울기대신 가중치라는 용어 씀. 절편대신 바이어스.
-선형회귀 알고리즘은 데이터 요소에 여러직선을 맞추어본 후 가장 적은 오류를 발생시키는 직선을 찾움
698p
-표에 들어있는 데이터를 이용해 선형 회귀 시스템 학습시킨후 새로운 키 넣었을때 몸무게 예측할 수 있는 시스템 만들기
(1)linear_model모듈 가져오기, LinearTegression()생성자 생성
(2) 학습 데이터는 반드시 2차원 배열. 하나의 행은 하나의 학습 예제 , 열은 입력의 특징
따라서 입력 특징 많으면 열의 개수 증가함. 학습데이터에 하나의 열만 있어도 반드시 2차원 배열로 만들어야함. 레이블은 1차원이면 됨.
(3)학습완료 -->새로운 값 178을 넣어서 몸무게 예측 확인
예측시 predict()함수 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pylab as plt from sklearn import linear_model #linear_model모듈 가져오기 reg = linear_model.LinearRegression() #LinearTegression()생성자 호출해서 선형 회귀 객체 생성 X =[[174],[152],[138],[128],[186]] #학습예제 y = [71,55,46,38,88] #정답 reg.fit(X,y) #학습 함수, 학습시키기 #학습이 종료되면 발견된 직선의 기울기와 절편 알수 있음 print("직선의 기울기:",reg.coef_ ) print("직선의 절편 :",reg.intercept_) print("학습점수:",reg.score(X,y)) #1에 가까울수록 데이터를 잘 맞춤 #이제 새로운 데이터 넣어 학습해보기 a= reg.predict([[178]]) #2차원 배열로 넣어야함. print("몸무게 예측 " ,a) | cs |
(4) 찾은 직선을 그래프로 그려보기
학습데이터를 입력으로 하여 예측값 계산 -->직선을 가지고 예측하기 때문에 직선상의 점이 됨.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import matplotlib.pylab as plt from sklearn import linear_model #linear_model모듈 가져오기 reg = linear_model.LinearRegression() #LinearTegression()생성자 호출해서 선형 회귀 객체 생성 X =[[174],[152],[138],[128],[186]] #학습예제 y = [71,55,46,38,88] #정답 reg.fit(X,y) #학습 함수, 학습시키기 #학습이 종료되면 발견된 직선의 기울기와 절편 알수 있음 print("직선의 기울기:",reg.coef_ ) print("직선의 절편 :",reg.intercept_) print("학습점수:",reg.score(X,y)) #1에 가까울수록 데이터를 잘 맞춤 #이제 새로운 데이터 넣어 학습해보기 a= reg.predict([[178]]) #2차원 배열로 넣어야함. print("몸무게 예측 " ,a) #학습데이터 산포도로 그리기 plt.scatter(X,y,color ='black') #학습데이터를 입력으로 하여 예측값 계산, 직선을 가지고 예측하므로 직선 상의 점이 됨. y_pred = reg.predict(X) #예측값으로 선 그래프 그림. 직선이 그려짐. plt.plot(X,y_pred,color='blue',linewidth=3) plt.show() | cs |
8.선형 회귀 실습
700p 다음과 같은 예제 데이터를 가장 잘 설명하는 직선 찾기\
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import matplotlib.pylab as plt from sklearn import linear_model #linear_model모듈 가져오기 reg = linear_model.LinearRegression() #선형 회귀 객체 생성 X = [[1.0],[2.0],[3.0],[4.0],[5.0]] #학습 데이터 y=[1.0,2.0,1.6,3.8,2.3] #정답 데이터 reg.fit(X,y) #학습 시키기 #학습데이터와 y값을 산포도로 그리기 plt.scatter(X,y,color='black') #학습데이터를 입력으로 하여 예측값 계산하기. y_pred = reg.predict(X) #예측값 직선 그리기. 계산된 기울기와 y절편을 가진 직선 그려짐. plt.plot(X,y_pred,color='blue',linewidth=3) plt.show() | cs |
9.신경망
:딥러닝의 시작은 인공 신경망이다. 입력층과 출력층 사이에 은닝층일 가지고 있는 신경망.
-다층 퍼셉트론
: 다층 퍼셉트론에 사용할 수 있는 학습 알고리즘 -->역전파 알고리즘.
10.딥러닝
:dnn에서 사용하는 학습 알고리즘. dnn은 mlp(다층퍼셉트론)에서 은닉층의 개수 증가시킨것.
11.뉴론의 모델
-
활성화 함수는 입력값의 가중 합계값을 받아서 출력값을 계산하는 함수.
-활성화 함수는 미분 가능하고 연속적 이어야함. 학습 알고리즘에서 활성화 함수의 일차 미분값을 사용하기 때문.
12.역전파 학습 알고리즘
:입력이 주어지면 순방향으로 계산하여 출력을 계산한 후 실제 출력과 우리가 원하는 출력 간의 오차를 계산. 이 오차를 역방향으로 전파하면서 오차를 줄이는 방향으로 가중치를 변경.
mlp에서 학습을 시킬때 실제 출력과 원하는 출력 사이의 오차를 이용. 오차를 줄이는 방향으로 가중치 변경. 이것을 위하여 오차를 계산하는 함수는 손실함수.
13.손실함수
:mlp인 다층퍼셉트론을 학습시킬때 실제 출력과 목표 출력의 차이를 계산 할 수있다. 이 차이를 오차로 사용 할 수 있다.
k는 출력 노드의 번호.
yk : 목표 출력 값
tk: 실제 출력된 값
목표 출력값 - 실제 출력값에서 제곱한 값을 모든 출력노드에 대하여 합한 값
손실함수 E(w)를 최소로 만드는 가중치w를 찾으면 됨!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
w는 가중치
-역전파 알고리즘은 손실함수 값을 줄이는 문제 ==>최적화 문제로 접근.
-최적화 문제란 어떤 함수를 최소나 최대로 만드는 값을 찾는 문제.
손실함수 값이 0 이면 신경망이 입력을 완벽히 분류한것.!!
-오차값을 최소화 하는 가중치를 찾는데 일반적으로 사용되는 알고리즘 ==>경사 하강법
-경사 하강법 : 함수의 최소값 찾기 위한 1차 미분을 사용하는 반복적인 최적화 알고리즘.
-현재 위치에서 함수의 그래디언트 값을 계산한 후에 그래디언트의 반대 방향으로 움직이는 방법.
어떤 위치에서 그래디언트는 w를 조금 증가했을때 손실함수가 얼마나 증가하는가를 나타낸다. (그래디언트는 1차미분값이므로 -가 나오면 손실함수가 감소 ==>즉 반대방향으로 가면됨)
14.활성화 함수 실험
구글 신경망 시뮬레이터
15. 케라스
:고수준 딥러닝 API. 케라스는 빠른 실험을 가능하게 하는데 중점을 두고 개발됨.
-쉽고 빠른 프로토 타이핑 가능
-순방향 신경망, 컨볼루션 신경망과 반복적인 신경망은 물론 여러가지 조합도 지원.
-cpu, gpu에서 원활하게 실행됨.
-케라스 핵심 데이터 구조는 모델.
-레이어를 구성하는 방법 나타냄.
-가장 간단한 모델 유형 sequential 선형 스택 모델(순방향으로 전파되는 신경망 모델)
(1) 모델 생성 sequential
(2)레이어 쌓기
#모델에 레이어 쌓기 add() ,dense 클래스는 완전연결된 레이어를 구현하는 클래스. 하단의 레이어와 완전히 연결되어 있다는 의미
#units 매개변수는 노드의 개수
input_dim : 입력의 개수.
activation : 활성화 함수 -->시그모이드 활성화 함수 사용
(3)레이어 하나 더 쌓기
#units 매개변수는 노드의 개수
activation : 활성화 함수 -->시그모이드 활성화 함수 사용
dense 클래스는 완전연결된 레이어를 구현하는 클래스. 하단의 레이어와 완전히 연결되어 있다는 의미
(4) 최적화 방법
=>경사 하강법 나타내는 객체 생성
lr = 학습률 0.1로 지정
학습률은 한번의 학습에서 가중치가 변경되는 비율....
(5) 학습 과정 구성
-compile()
매개변수 loss =손실함수 지정 , 평균제곱 오차로 설정.
(6) 학습
-논리적인xor학습시키기
epochs= 전체 출력 반복 횟수 , barch_size=1 은 1샘플 마다 가중치 변경됨.
(6)예측
predict()
-xor과 아주똑같진 않지만 상당히 유사한 값 나옴. 0,1,1,0과 가까움.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import tensorflow as tf import numpy as np model = tf.keras.models.Sequential() #sequential 모델 생성 #모델에 레이어 쌓기 add() ,dense 클래스는 완전연결된 레이어를 구현하는 클래스. 하단의 레이어와 완전히 연결되어 있다는 의미 #units 매개변수는 노드의 개수 input_dim : 입력의 개수. activation : 활성화 함수 -->시그모이드 활성화 함수 사용 model.add(tf.keras.layers.Dense(units=2,input_dim=2,activation='sigmoid')) model.add(tf.keras.layers.Dense(units=1,activation='sigmoid')) #최적화 방법 => 경사 하강법 사용 , 경사 하강법 나타내는 개체 생성 #lr = 학습률 0.1로 지정 학습률은 한번의 학습에서 가중치가 변경되는 비율.... sgd = tf.keras.optimizers.SGD(learning_rate=0.1) #학습 과정 구성 model.compile(loss='mean_squared_error',optimizer=sgd) #-논리적인xor학습시키기 epochs= 전체 출력 반복 횟수 , barch_size=1 은 1샘플 마다 가중치 변경됨. X = np.array([[0,0],[0,1],[1,0],[1,1]]) #입력 데이터 y=np.array([[0],[1],[1],[0]])#목표 출력 model.fit(X,y,batch_size=1,epochs=10000) #예측 print(model.predict(X)) | cs |
-논리적인 or학습
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import tensorflow as tf import numpy as np model = tf.keras.models.Sequential() #sequential 모델 생성 #모델에 레이어 쌓기 add() ,dense 클래스는 완전연결된 레이어를 구현하는 클래스. 하단의 레이어와 완전히 연결되어 있다는 의미 #units 매개변수는 노드의 개수 input_dim : 입력의 개수. activation : 활성화 함수 -->시그모이드 활성화 함수 사용 model.add(tf.keras.layers.Dense(units=2,input_dim=2,activation='sigmoid')) model.add(tf.keras.layers.Dense(units=1,activation='sigmoid')) #최적화 방법 => 경사 하강법 사용 , 경사 하강법 나타내는 개체 생성 #lr = 학습률 0.1로 지정 학습률은 한번의 학습에서 가중치가 변경되는 비율.... sgd = tf.keras.optimizers.SGD(learning_rate=0.1) #학습 과정 구성 model.compile(loss='mean_squared_error',optimizer=sgd) #-논리적인or학습시키기 epochs= 전체 출력 반복 횟수 , barch_size=1 은 1샘플 마다 가중치 변경됨. X = np.array([[0,0],[0,1],[1,0],[1,1]]) #입력 데이터 y=np.array([[0],[1],[1],[1]])#목표 출력 model.fit(X,y,batch_size=1,epochs=10000) #예측 print(model.predict(X)) | cs |
16.케라스를 이용한 mnist숫자 인식
-케라스를 사용해 필기체 숫자 이미지를 인식하는 mlp신경망 작성하기
(1) mlp구성
입력 : 필기체 숫자 이미지
출력 : 10개의 노드로서 숫자 0~9
숫자 0이미지가 입력되면 첫번째 출력 노드의 값이 1.0 나머지 0.0 되어야함.
2차원 이미지 -->1차원으로 변홚 신경망에 입력.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import tensorflow as tf import numpy as np import matplotlib.pyplot as plt #데이터 가져오기 mnist = tf.keras.datasets.mnist #훈련데이터와 테스트 데이터 가져오기 (x_train,y_train),(x_test,y_test) = mnist.load_data() #넘파이 사용해 입렬 0.0 ~1.0사이로 만들기(입력 정규화) x_train ,x_test = x_train /255.0 , x_test/255.0 #출력 plt.imshow(x_train[0],cmap = 'Greys') plt.show() print("ok") | cs |
https://transcranial.github.io/keras-js/#/mnist-cnn
17. 케라스 실습
-코드를 작ㄱ성해본 dnn모델들 keras.js로 구현되어있음..
18.책 내용 총정리
-타이타닉 생존자 예측하여 보기
https://www.kaggle.com/competitions/titanic/overview
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import tensorflow as tf import numpy as np import pandas as pd #데이터 읽기 train =pd.read_csv("train.csv",sep=',') test = pd.read_csv("test.csv",sep=',') #필요없는 칼럼 삭제 train.drop(['SibSp','Parch','Ticket','Embarked','Name','Cabin','PassengerId','Fare','Age'],inplace=True,axis=1) #결손치 있는 행 삭제 train.dropna(inplace=True) #기호를 수치로변환 for ix in train.index: if train.loc[ix,'Sex'] == "male":#남자->1여->0 train.loc[ix,'Sex'] =1 else: train.loc[ix,'Sex']=0 #2차원 배열->1차원 배열로 평탄화 target = np.ravel(train.Survived) #생존여부 학습데이터에서 삭제 axis=1열 train.drop(['Survived'],inplace=True,axis=1) #케라스 모델 생성 model=tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(16,activation='relu',input_shape=(2,))) model.add(tf.keras.layers.Dense(8,activation='relu')) model.add(tf.keras.layers.Dense(1,activation='sigmoid')) #모델 컴파일. model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']) #학습 train = trian.astype(np.float32) target = target.astype(np.float32) model.fit(train,target,epochs=30,batch_size=1,verbose=1) | cs |
오류
-정규화란?
· 머신러닝에 사용되는 데이터는 그 값이 너무 크거나 작지 않고 적당한 범위 (-1에서 ~ 1사이)에 있어야 모델의 정확도가 높아진다고 알려져있다.
· 그래서 학습 전에 미리 값이 적당한 범위를 유지하도록 모델에 입력할 데이터를 변환하기도 한다. 이러한 작업을 데이터 정규화라고 한다.
· 정규화에서 많이 쓰이는 기법은 정규화와 표준화이다. 각 기법의 의미와 변환 방법은 다음과 같다.
|
첫댓글 데이터 정규화가 무엇이고 왜 필요한지 조사해보시오
글 마지막에 추가했습니다.😀