IT

머신러닝-1st

https.. 2024. 10. 20. 03:33

지도학습
인공지능을 누군가 직접 가르치고 이끄는 방법
사람이 원하는 정답의 방향으로 학습이 진행된다.
입력값과 출력값을 함께 주고 학습 시키는 방법
정답 레이블이 주어진 상태에서 학습
분류/회귀
 
비지도학습
정답이 없는 데이터를 사용하여 학습
인공지능에게 입력값만 주고 정답 레이블을 알려주지 않음
예를 들어, 배와 사과 사진을 주고 이것이 배야. 사과야. 라는 정답을 주지 않은 채 학습을 시킴
인공지능이 주어진 입력값의 특징을 찾아 스스로 판단하여 그룹을 나누는 방식으로 학습을 진행함
인공지능이 스스로 판단할 수 있는 지능을 갖게 됨
따라서 새로운 데이터가 들어오더라도 어느 그룹에 속하는지 스스로 판단할 수 있음
다만, 어느 것이 배인지, 사과인지 정답을 주지 않았기 때문에 구분할 수 없음
 
군집화
비지도 학습을 사용해 만들어진 그룹이 군집,
다양한 그룹으로 만드는 과정이 군집화
 
차원축소
차원이란 데이터 특징의 크기
차원 축소는 모든 조건(데이터)을 고려할 수 없기 때문에 이중에서 몇 가지 특징 만으로 좁혀 나간다.
-> 데이터의 피처를 줄인다.
비지도 학습을 사용하여 데이터를 가장 잘 표현할 데이터를 찾기 때문에 더 효율적으로 사용 가능
 
강화학습
학습을 할 때, 정답을 도출할 경우 보상을 주어 정답을 도출할 가능성을 높이는 방법
보상을 최대화 하는 방향으로 학습이 진행됨
일단 해보고 시행착오를 거치는 학습 방법
현재 상태에서 어떤 행동을 취하는 것이 최적인지 학습하는 것

import tensorflow as tf
import pandas as pd

# 데이터 준비
filepath = 'lemonade.csv'
lemonade = pd.read_csv(filepath)
lemonade.head()

# 독립변수, 종속변수
independent = lemonade[['temp']]
dependent = lemonade[['sales']]
print(lemonade.shape)
print(independent.shape, dependent.shape)

# 모델 생성
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')

# 모델 학습
model.fit(independent, dependent, epochs=100)

# 모델 예측
print(model.predict(independent)) # 학습된 모델을 이용해 독립변수로 예측값을 출력하는 부분. 모델이 학습한 결과로부터 실제 데이터를 기반으로 얼마나 잘 예측하는지 확인하기 위함.
# 독립변수(lemonade의 temp) 데이터를 이용해서 학습하겠지만, 최종적으로 똑같은 데이터 넣어서.. 얼마나 잘 예측이 되나
# 내가 학습시켰더라도 완벽한 인공지능 모델이 나올 수 없기 때문에(loss값 0인 것 없음) 학습 시킨 데이터지만 다시 집어넣어 얼마나 차이가 있나 보려고.
print(model.predict([[15]]) # 15도에 대한 판매량을 예측. 학습된 모델이 새로운 값에 대해 어떻게 예측하는지 확인

 
SVM(서포트벡터머신)
분류를 할 때, 마진을 최대로 가져가는 방향으로 분류를 한다.
서포트벡터와 구분선과의 거리 마진이 크면 클수록, 학습에 사용되지 않는 새로운 데이터가 들어오더라도 더 잘 분류할 가능성이 커짐
즉, 여백을 최대화 하는 방향으로 학습, 여백을 최대화하는 결정 경계를 찾는다. 이를 통해 일반화 능력을 높임
마진이란, 두 클래스 간의 서포트 벡터의 거리
서포트 벡터란, 하이퍼플레인으로부터 가장 가까이 있는 벡터
 
하이퍼매개변수
모델의 동작 제어에 사용하는 변수
 
C(cost)
선형 SVM일 때, C 매개변수 1개만 존재
- C를 크게 하면, 잘못 분류한 훈련 집합의 샘플 적고, 여백 작아짐
훈련 집합에 대한 정확률 높음, 일반화 낮아짐
 
- C를 작게 하면, 잘못 분류한 훈련 집합의 샘플 많아지고, 여백이 커짐
훈련 집합에 대한 정확률 낮음, 일반화 높아짐
 
C값 조금씩 수정해서 loss값 어떻게 바뀌나 모니터링
 
gamma
비선형 SVM일 때, C, gamma 매개변수 2개 존재
하나의 데이터 샘플이 영향력을 행사하는 거리
gamma값이 높아짐에 따라 점점 뾰족해짐
gamma 클수록 표준편차 작음. 데이터 샘플이 영향력 행사하는 거리가 짧아짐

from sklearn import datasets
from sklearn import svm
import plotly.express as px

d = datasets.load_iris()
print(d.DESCR)

for i in range(0, len(d.data)):
	print(i+1, d.data[i], d.target[i])
    
s = svm.SVC(gamma=0.1, C=10)
s.fit(d.data, d.target)

new_d = [[6.4, 3.2, 6.0, 2.5], [7.1, 3.1, 4.7, 1.35]]

res = s.predict(new_d) # 테스트 집합을 가지고 예측 수행

print('새로운 샘플 부류는: ', res)

 
결정트리
바이너리 트리 형태
트리를 이용하여 예측하는 방법
질문을 던져 스무고개처럼 대상을 좁혀 나가면 분류 문제를 쉽게 해결할 수 있음
~보다 커? ~보다 작아? 라는 기준을 나타내는 것이 중요
상대에 맞게 가까이 해야 상대적으로 빠른 결과를 얻을 수 있음 

from sklearn import datasets
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier

d = datasets.load_iris()
print(d.DESCR)

dtree_model = DecisionTreeClassifier(max_depth=4, min_samples_split=3)
dtree_model.fit(d.data, d.target)

new_d = [[6.4, 3.2, 6.0, 2.5], [7.1, 3.1, 4.7, 1.35]]
res1 = dtree_model.predict(new_d)

print('새로운 샘플 부류는: ', res)

res2 = dtree_model.predict(d.data)
print('정확도: ', metrics.accuracy_score(res2, d.target))
# 모델이 예측한 결과(res2)와 실제 정답(d.target)을 비교하여 정확도를 계산하고 출력
# 모델이 얼마나 정확하게 예측했는지 평가

 
딥러닝
심층 신경망이 학습하는 과정
입력, 출력, 은닉층이 존재해야함
딥.. 히든레이어의 개수가 많은 것
 
입력층
데이터를 입력 받는 층
 
은닉층
입력층에서 들어온 데이터가
여러 신호로 바뀌어서 출력층까지 전달됨
이때, 여러 뉴런 지날 때마다 신호 세기가 변경됨
은닉층의 각각 뉴런의 개수는 우리가 정해야 함
 
출력층
출력층에 어떤 값이 전달되었느냐에 따라 인공지능의 예측값이 결정된다.
 
심층신경망
깊은 신경망, 히든레이어의 개수가 많은 것
 
Dense 전결합층
모든 레이어, 모든 노드 다 사용하는 것
각 입력 노드가 모든 출력 노드에 연결되어 있다.
각 노드에서는 입력으로 들어온 값을 가중치와 곱하고, 편향 더한 뒤 비선형 활성화 함수를 통해 출력값을 생성한다.
이렇게 생성된 출력값은 다음 레이어의 입력으로 사용된다.
복잡한 패턴이나 관계를 학습하고, 이를 기반으로 예측, 분류, 회귀 수행

가중치
값이 얼마나 중요한지 아닌지를 표현
각 노드마다 고유한 값을 가짐
각 레이어를 연결하는 선에 있다.
 
편향
인공신경망에서 모델의 성능을
높이기 위해 가중치를 거쳐 변환된 신호 세기를 조절할 때 사용
각 층마다 하나의 값으로 존재한다.
 
활성화함수
퍼셉트론에 의해 계산된 값을 다음으로 보낼지, 말지 결정하는 것
만약 보낸다면 어떤 값으로 바꿔 보낼지, 그대로 보낼지 정함
즉, 신호 세기를 특정 값으로 바꾸기 위해 사용하는 함수임
시그모이드, 하이퍼볼릭탄젠트, 렐루 등
 
소프트맥스
정규화 작업을 수행
정규화는 기준을 맞추는 작업이다.
0~1사이의 값으로 바꿔준다.
분류문제에서 100% 또는 1.0이 최대가 되도록 총합을 1로 맞춰주는 작업
 
퍼셉트론
다수의 신호를 입력 받아 하나의 신호 출력
out = f(x1w1 + x2w2 + ... + xnwn + b)
퍼셉트론에서 출력값은 부등식 x1w2+x2w2 .. > (임계값)
각 뉴런에 가중치 곱한 게 임계값 이상이 되냐, 안 되냐에 따라 결정된다.
즉, 임계값이 어느 정도가 되면 전달하고, 전달하지 않고를 bias로 정의 가능하다.
 
오차줄이기
오차를 줄이는 것이 인공신경망의 핵심이다.
가중치에 따라 신호의 세기가 바뀌고, 인공지능의 결과값이 결정되기 때문에 가중치를 잘 계산해야 한다.
가중치를 잘 정해야 원하는 결과를 얻음
경사하강법을 이용
 
경사하강법
기울기를 보고 기울기가 줄어드는 쪽으로 가중치값을 이동시킨다.
오차를 줄이려면 오차가 가장 작은 지점으로 이동해야 한다.
b지점에 있는 기울기가 크고, a지점으로 갈수록 기울기가 작아진다.
우리가 목표로 하는 a지점의 기울기는 다른 지점에 비해 가장 작은 0의 값을 가진다.
접선의 기울기가 x축에 평행하는 순간이 가장 오차가 적다.
기울기가 가파를수록 다음 값의 변화가 크고,
기울기가 완만할수록 값의 변화가 작다.
이러한 미분 개념을 이용하여 오차를 수정한다.
경사하강법의 핵심은 미분이다.
미분하여 기울기가 0으로 가는 지점을 찾는 것
 
최적의 가중치 찾는 방법
가장 좋은 w를 찾으려면, -무한대에서 +무한대 사이의 값을 조금씩 증가하면서 w넣어 cost구해야한다.
이때, w 변할수록 최종 loss값도 바뀜
처음 w값 모르고, w값 랜덤하게 찍었을 때,
가장 낮은 지점에 있는 w가 더 낮아질 수 있는 경향이 있나 없나 미분해서 
조금씩 움직여서 가능한 더 낮은 w값 찾아내는 것이 목적이다.
 
오차역전파법
여러 가중치를 차례로 변경해 나가는 방법
에러가 많이 나면, 왜 에러가 났는지 오차를 끝에서부터 거꾸로 가면서 줄임
가중치를 역으로 전파시켜서 내가 가중치 전파시킨 것과 비교해서
어디가 차이가 많이 났나 보고 마지막부터 처음까지 되돌아가면서
경사하강법 이용해서 가중치 수정하는 방법
인공신경망은 이 과정을 반복하면서 오차를 0으로 줄여나간다.
이렇게 오차값 계산하고, 오차값 따라 가중치 점점 수정하는 모습이
인공신경망에서 인공지능의 학습 방법이다.
 

# 보스톤 집값
import tensorflow as tf
import pandas as pd

filepath = 'boston.csv'
boston = pd.read_csv(filepath)

# 1. 변수 선언
independent = boston [['crim', 'zn', ..., 'lstat']] # 13개
dependent = boston [['medv']] # 1개

# 2. 모델 생성
X = tf.keras.layers.Input(shape=[13]) # 레이어 만들 건데, Input레이어이고, 뉴런(독립변수)이 13개, 이름은 X
H = tf.keras.layers.Dense(10, activation='swish')(X) # 히든레이어 뉴런의 개수가 10개, 전결합층이며 활성화함수는 swish사용. X를 입력 데이터로 받음
Y = tf.keras.layers.Dense(1)(H) # 출력레이어 1개의 출력값을 생성하며 전결합층 사용, H를 입력레이어로 받음
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse') # 모델 학습 방법을 정하는 명령어

# 3. 모델 학습
model.fit(independent, dependent, epochs=100)

# 4. 모델 예측
print(model.predict(independent[5:10]) # 모델의 예측값과 실제 정답값을 비교
print(dependent[5:10]) # 실제 정답값

 
Sequential()
입력층, 은닉층, 출력층이 한 방향으로 순차적으로 구성
model = Sequential() 선언하고
model.add() 라는 라인을 추가하면 새로운 층이 만들어짐
-> 변수 선언 없이 그냥 쓴 순서대로 레이어 만들어짐

# 폐암수술환자생존율
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

dataset = pd.read_csv('ThoraricSurgery.csv')

X = dataset[['info1', 'info2', ..., 'info16']] # 16개
y = dataset[['live']] # 1개

model = Sequential()
model.add(Dense(30, input_dim=16, activation='swish')) # 히든레이어 뉴런의 개수가 30게, 입력 레이어 없는 대신 input_dim으로 독립변수 명시
model.add(Dense(10, activation='swish'))
model.add(Dense(1, activation='sigmoid'))

# model = Sequential()
# model.add(Dense(30, input_dim=16))
# model.add(Activation='swish'))
# model.add(Dense(10))
# model.add(Activation='swish'))
# model.add(Dense(1))
# model.add(Activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=200, batch_size=128, verbose=0)

print(model.predict(X[5:10])
printy[5:10])
# 초음파광물예측

 
검증셋
최적의 학습 파라미터를 찾기 위해 학습 과정에서 사용
검증셋을 설정하면, 검증셋에서 테스트한 결과를 추적하면서 최적의 모델을 만들 수 있음
validation_split
데이터셋을 나누는 것이 아닌 학습데이터의 일부를 나눔

# 와인종류예측
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split

# 데이터 준비
dft = pd.read_csv('wineAI.csv', header=None)

# 와인의 속성을 X, 와인의 분류를 y
X = df.iloc[:, 0:12] # 모든 행과 0번째부터 11번째 열
y = df.iloc[: ,12] # 모든 행과 12번째 열

# 학습셋과 테스트셋 구분 8:2
X_train, X_test, y_train, y_test = train_test_spilt(X, y, test_size=0.2, shuffle=True)

# 모델 생성
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 모델 학습 0.8 * 0.25 = 0.2
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=50, batch_size=500, validation_spilt = 0.25, verbose=0)
# validation_spilt
# 검증셋. 학습셋의 일부를 할당. 학습데이터 중 25% 만큼 검증셋으로 써라

# 모델을 테스트셋에 적용해 정확도 계산
score = model.evaluate(X_test, y_test) # 모델의 정확도를 평가
print('Test accuracy: ', score[1])
# 키핑해놓은 20%에 대한 테스트 데이터를 score[1]의 정확도를 score 변수에 받아옴
print(model.predict(X[5:10]) # 학습 데이터의 5번째부터 9번째에 대해 예측한 값을 출력

'IT' 카테고리의 다른 글

머신러닝 3rd  (0) 2024.10.20
머신러닝 2nd  (0) 2024.10.20
리눅스 마스터 2급 1차 2403회  (0) 2024.08.15
[아이리포] SQLD 14일 합격 SQLD 모든 것  (0) 2024.06.28
[길벗] 아는 만큼 보이는 백엔드 개발  (0) 2024.02.29