1. 회귀분석과 분류분석
■ 의미
회귀분석은 종속 변수와 독립 변수 간의 관계를 모델링하고 예측하는 분석 방법으로, 연속형 데이터를 다룸.
독립 변수는 종속 변수에 영향을 주는 요소들로 구성되며, 주어진 데이터를 통해 함수적인 관계를 찾고 예측을 수행.
반면, 분류분석은 주어진 데이터를 기반으로 샘플들을 여러 개의 클래스로 분류하는 분석 방법으로, 범주형 데이터를 다룸.주어진 데이터로부터 클래스를 구분하는 기준을 학습하고, 새로운 입력값이 어느 클래스에 속하는지 예측함.
2. 완전연결(fully connected)신경망과 합성곱(convolution)신경망
■ 완전연결 신경망(FCNN):
각 뉴런이 이전 계층의 모든 뉴런과 연결되어 있고,
다음 계층의 모든 뉴런과도 연결되어 있음. 주로 분류나 회귀 문제를 해결하는 데 사용됨.
입력이 고정된 크기를 가져야하며, 공간적인 구조를 인식하지 못하는 단점이 있음.
■ 합성곱 신경망(CNN):
입력 데이터의 공간적 구조를 이용하며, 이미지 분류, 객체 감지, 컴퓨터 비전 작업 등에 사용됨.
합성곱 계층과 풀링 계층으로 구성되어 있으며, 이를 통해 이미지의 지역적 패턴을 학습하고 공간적 변이에 대응 가능.
2. 이미지 분석에서 완전연결(fully connected)신경망의 문제점
■ 의미
이미지 데이터의 경우 3차원(세로, 가로, 채널)의 형상을 가지며, 공간적 구조(spatial structure)를 지님.
예를 들어 공간적으로 가까운 픽셀은 값이 비슷하거나, RGB의 각 채널은 서로 밀접하게 관련 있음
■ 문제점
데이터 형상의 무시
- 변수의 개수
- 네트워크 크기
- 학습시간의 문제
3. CNN(합성곱 신경망) 합성곱층(Convolutional Layer, Conv Layer)
■ 의미
이미지 데이터는 일반적으로 채널, 세로, 가로 이렇게 3차원으로 구성된 데이터
합성곱에서는 3차원 데이터(1, 28, 28)를 입력하고 3차원의 데이터로 출력하므로 형상을 유지 가능
CNN에서는 이러한 입출력 데이터를 특징맵(Feautre Map)이라고 함
4. CNN(합성곱 신경망) 합성곱층(Convolutional Layer, Conv Layer) 2
■ 의미
− 합성곱층 뉴런의 수용영역(receptive field)안에 있는 픽셀에만 연결
− 앞의 합성곱층에서는 저수준 특성에 집중하고, 그 다음 합성 곱층에서는 고수준 특성으로 조합
5. CNN(합성곱 신경망) 필터(Filter)
■ 의미
필터가 합성곱층에서의 가중치 파라미터(W)에 해당 학습단계에서 적절한 필터를 찾도록 학습
입력데이터에 필터를 적용하여 필터와 유사한 이미지의 영역을 강조하는 특성맵(feature map)을 출력하여 다음 층(layer)으로 전달
6. CNN(합성곱 신경망) 합성곱의 연산
■ 의미
CNN(합성곱 신경망)에서의 합성곱 연산은 입력 데이터에 필터(커널)를 적용하여 특성 맵(feature map)을 생성하는 과정
간단히 말해, 합성곱 연산은 입력 데이터와 필터를 겹쳐서 곱하고 합산하여 새로운 특성 맵을 만들어냄.
이 과정을 입력 데이터의 모든 위치에서 수행하면서 필터를 이동시키며 계산하며,
이를 통해 입력 데이터의 지역적인 패턴을 감지하고 추출할 수 있음.
7. CNN(합성곱 신경망) 패딩(Padding)
■ 의미
데이터의 크기는 Conv Layer를 지날 때 마다 작아지며, 이에 따라 가장자리 정보가 사라지는 문제 발생.
합성곱 연산을 수행하기 전, 입력데이터 주변을 특정값으로 채워 늘리는 것
주로 zero-padding을 사용함
8. CNN(합성곱 신경망) 스트라이드(Stride)
■ 의미
필터가 입력 데이터를 이동하는 간격을 나타내는 값. 스트라이드 값이 1인 경우에는 필터가 한 칸씩 이동하여 모든 위치에서 연산을 수행하고, 값이 더 큰 경우에는 필터가 건너뛰며 이동함. 스트라이드 값은 특성 맵의 크기 조절과 계산량 감소를 위해 활용
보통 1과 같은 작은 값이 더 잘 작동됨.
9. CNN(합성곱 신경망) 3차원 데이터의 합성곱
■ 의미
3차원 데이터의 합성곱 연산은 입력 데이터와 필터가 3차원으로 겹쳐지며, 해당 위치에서 요소별로 곱셈을 수행한 후 모든 결과를 합산하여 특성 맵을 생성. 이를 통해 입력 데이터의 공간적인 패턴과 깊이 방향의 특성을 동시에 고려.
10. CNN(합성곱 신경망) - 풀링층
■ 의미
그림의 사이즈를 점진적으로 줄이는 법 Max-Pooling, Average Pooling
Max-Pooling : 해당영역에서 최대값을 찾는 방법
Average Pooling : 해당영역에서 평균값을 계산하는 방법
2 x 2 filter로 2 stride를 적용하여 4x4 이미지를 2x2이미지로 변환한 예제
https://dev-with-gpt.tistory.com/52
1. CNN - MNIST
[코드]
import numpy as np
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(x_train[0])
print(y_train[0])
import matplotlib.pyplot as plt
plt.imshow(x_train[0], 'gray')
plt.show()
[출력]
2. CNN - Fashion MNIST
[코드]
import numpy as np
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(x_train[0])
print(y_train[0])
import matplotlib.pyplot as plt
plt.imshow(x_train[0], 'gray')
plt.show()
[출력]
3. CNN - cifar10
[코드]
import numpy as np
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test)=cifar10.load_data()
class_names= ['airplane', 'automobile', ' bird', 'cat', 'deer', 'dog', 'frog',
'horse', 'ship', 'truck']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[(y_train[i][0])])
plt.show()
[출력]
4. CNN - cifar100
[코드]
import numpy as np
from keras.datasets import cifar100
(x_train, y_train), (x_test, y_test)=cifar100.load_data()
class_names = ['apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',
'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',
'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',
'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',
'house', 'kangaroo', 'computer_keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',
'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',
'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',
'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',
'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose',
'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',
'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',
'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',
'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman',
'worm']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(100):
plt.subplot(10, 10, i+1)
plt.subplots_adjust(
wspace=0.5, hspace=0.5
)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[(y_train[i][0])])
plt.show()
[출력]
5. CNN acc vs CNN_MaxPooling,Dropout acc
5-1. CNN acc
[코드]
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D
#1. 데이터
datasets = mnist
(x_train, y_train),(x_test, y_test) = datasets.load_data()
#print(datasets.load_data())
# 정규화 => 0~1 사이로 숫자 변환
x_train, x_test = x_train/255.0, x_test/255.0
print(x_train.shape, y_train.shape)
# 합성곱 (CNN) 레이어에서는 차원수를 맞춰주어야한다.
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)
#2. 모델구성
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(4,4), #입력층
input_shape =(28,28,1)))
model.add(Conv2D(64, (3,3), activation='relu')) # cnn 은닉층은 relu 성능이 좋음
model.add(Flatten())
model.add(Dense(256)) # %x_train.shap
model.add(Dense(128, activation='relu')) # cnn 은닉층은 relu 성능이 좋음
model.add(Dense(10, activation='softmax')) # 0~9까지 분류해야하는 다중분류이므로.
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)
#4. 평가, 예측
loss ,acc = model.evaluate(x_test, y_test)
print('loss : ', loss)
print('acc : ', acc)
[출력]
5-2. CNN_MaxPooling, Dropout acc
[설명]
■ 입력층:
model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu', input_shape=(32,32,3)))
이 부분은 2차원 합성곱 계층을 생성하는 것으로, 첫 입력층이며, 32x32 크기의 RGB(채널이 3인)
이미지를 입력 받음
여기서 filters=64는 64개의 필터를 사용하여 합성곱 연산을 수행하며, kernel_size=(3,3)은 각 필터의 크기가 3x3임을 나타냄. padding='same'은 입력 이미지 주변에 0으로 패딩을 추가하여 출력 이미지의 크기를 입력 이미지와
동일하게 유지. activation='relu'는 활성화 함수로 ReLU(Rectified Linear Unit)를 사용함.
■ 은닉층:
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256, activation = 'relu'))
model.add(Dense(128, activation = 'relu'))
이 부분은 모델의 은닉층을 구성하고. MaxPooling2D는 특성 맵의 크기를 줄이는 데 사용되며, 이는 연산량을 줄이고, 과적합을 방지하는 효과를 가짐
Dropout은 무작위로 노드를 제거하여 과적합을 방지하는 기법.
Flatten은 2차원 특성맵을 1차원으로 변환하여 Dense층에서 처리할 수 있게 함
Dense는 전결합층으로, 각각의 뉴런이 이전 계층의 모든 뉴런과 연결되어 있음.
여기서 가중치는 학습을 통해 결정되며, 더 높은 정확도를 얻으려면 이러한 가중치를 최적화하는 것이 중요
■ 출력층:
model.add(Dense(100, activation = 'softmax'))
이 부분은 모델의 출력층을 구성합니다. Dense 계층은 각 클래스에 대한 확률을 출력하며,
이는 'softmax' 활성화 함수를 통해 각 확률의 합이 1이 되도록 만듬.
여기서 100은 출력 클래스의 수를 나타냄
[코드]
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
#1. 데이터
datasets = mnist
(x_train, y_train),(x_test, y_test) = datasets.load_data()
#print(datasets.load_data())
# 정규화 => 0~1 사이로 숫자 변환
x_train, x_test = x_train/255.0, x_test/255.0
print(x_train.shape, y_train.shape)
# 합성곱 (CNN) 레이어에서는 차원수를 맞춰주어야한다.
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)
# 2.모델구성
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(4,4),
activation='relu',
input_shape = (28,28,1)))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256))
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)
#4. 평가, 예측
loss ,acc = model.evaluate(x_test, y_test)
print('loss : ', loss)
print('acc (Dropout & Maxpooling): ', acc)
[출력]
MaxPooling과 Dropout 을 통해 acc를 개선시켰음을 확인할 수 있다.
6. Pandas & HeatMap (matplotlib + seaborn)
[출력]
[설명]
Pandas의 corr() 함수를 활용하여 변수들 간의 상관계수를 계산하고,
Seaborn이나 Matplotlib을 이용하여 상관계수 히트맵을 시각화함으로써 변수들 간의 관계를 파악.
상관계수는 -1부터 1까지의 범위를 갖으며, 1에 가까울수록 양의 상관관계를 의미하며, -1에 가까울수록 음의 상관관계를 의미.
상관계수 히트맵은 밝은 색으로 표현되며, 밝을수록 상관계수가 높은 변수들을 나타냄.
이를 통해 관계가 강한 변수들을 시각적으로 확인할 수 있음
또한, 상관관계가 높은 변수들을 선택하여 모델에 적용함으로써 변수 선택을 수행함.
다중공선성 문제를 회피하기 위해 상관관계가 높은 변수들 중 하나를 선택하거나, 변수 축소 기법(예: 주성분 분석)을 사용하여 변수의 수를 줄이는 것도 가능
요약하면, 상관계수를 계산하고 상관계수 히트맵을 통해 변수들 간의 관계를 시각화하며, 상관관계가 높은 변수들을 선택하여 모델에 활용함으로써 성능을 향상시킬 수 있으며,
이를 통해 변수들 간의 관련성을 파악하고 모델의 복잡성을 줄이는 데 도움을 줌
[코드]
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
#상관계수 히트맵
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터
path = './'
datasets = pd.read_csv(path + 'Boston_house.csv')
print(datasets.columns)
print(datasets.head(7))
[출력]
[코드]
x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
'RAD', 'ZN', 'TAX', 'CHAS']] # datasets 의 columns
y = datasets[['Target']]
print(x.shape) # (506, 13)
print(y.shape) # (506, 1)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size = 0.2, shuffle=True, random_state=77
)
print(x_train.shape, y_train.shape) # (404, 13) (404, 1)
print(x_test.shape, y_test.shape) # (102, 13) (102, 1)
sns.set(font_scale = 1.2)
sns.set(rc = {'figure.figsize':(9, 6)})
sns.heatmap(data=datasets.corr(),
square = True,
annot = True,
cbar = True
)
plt.show()