정상적으로 Path가 잡혀 있으면 Conda와 VS Code가 연동이 그냥 되어야 하는데

이번에는 연동이 안 되었다. 뭐가 문제인지 살펴보니 Path가 문제이다. 

나는 miniconda를 설치하였으니 miniconda관련 Path를 설정해 주었다. 

Anaconda를 설치 한 사람은 Anaconda관련 경로를 잡아 주면 된다. 

Path에서 경로를 잡아 주면 된다. 

miniconda관련된 경로 3개를 잡아 주면 된다. 

User에 따라 경로는 다 다를 수 있으니 참고

. : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\USER\Documents\WindowsPowerShell\profile.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft .com/fwlink/?LinkID=135170)를 참조하십시오.

> 파워쉘에서의 권한 에러

Step 1. 파워쉘 관리자 권한으로 실행

Step2. get-executionPolicy 

: 현재 권한 상태 확인, Restricted이면 로컬에서 스크립트를 실행할 수 없는 상태 인 것. 따라서 VS Code에서 에러가 발생

Step3. 권한을 상승 시켜 줘야 함 

: Set-ExecutionPolicy RemoteSigned

, 권한을 상승 시키면 문제가 발생할 수 있다 어쩌구저쩌구 하는데 별 문제 없을 것이므로 Y

Step4. VS Code 재실행

Anomaly Detection - 이상탐지

이상탐지에는 오토인코더, PCA를 비롯한 다양한 방법론이 있고 최근에는 AutoML로도 탐지 할 수 있지만 이번에 알아 보고자 하는 내용은 쉽게 알 수 있는 비지도 학습의 K means clustering이다.먼저 Kmeans clustering에 대하여 알아 보자. 

1. Kmeans Clustering이란

- Kmeans clustering은 말 그대로 데이터가 모인 라벨을 찾아 내는 알고리즘이다. 단, 비지도 학습으로 데이터에 라벨이 없을 때 해당 라벨을 찾아내는 알고리즘이다. 즉, X → Y' 최적화하는 딥러닝 지도 학습이 아니고 라벨을 모를 때 

1,2,3,4,5 →  A 클러스터

10,20,30,40,50 → B 클러스터 

100, 101, 102, 103, 104 → C클러스터 

이런 방식으로 데이의 패턴을 보고 먼저 학습을 하는 것이다. 그러면 그룹을 할당할 수 있고 해당 그룹에는 중심점이 있다. 예를 들면 1,2,3,4,5에서는 3이 중심점이다. 

이상으로 K means clustering의 설명을 마치겠다. 장단점은 다른 곳에도 설명이 잘 나와 있으니(예. 장점은 구현이 쉽고 단점은 이상치에 변동을 많이 받는 등) 해당 블로그나 논문을 참조하면 될 것이고 이번에는 코드의 구현을 참조 하도록 한다.

2. Kmeans clustering 코드 

2.1 라이브러리 임포트

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

2.2 클러스터 개수 설정 및 데이터 예측

kmeans = KMeans(n_clusters=3, random_state=42)
data['Cluster'] = kmeans.fit_predict(data)

임의로 클러스터의 개수를 설정해주고 데이터를 예측해 준다.(초간단)

2.3 제대로 계산히 되었는 지 검증하기 위해 중심위치와 중심사이즈 계산

 
# Calculating cluster centers
cluster_centers = pd.DataFrame(kmeans.cluster_centers_, columns=data.columns[:-1])
# Calculating cluster sizes
cluster_sizes = data['Cluster'].value_counts().rename('Size').to_frame()

# Printing cluster centers and sizes
print("Cluster Centers:\n", cluster_centers)
print("\nCluster Sizes:\n", cluster_sizes)

 

2.4 시각화(Optional)

plt.scatter(data['LVDT'], data['TEMPERATURE'], c=data['Cluster'], cmap='viridis')
plt.xlabel('LVDT')
plt.ylabel('TEMPERATURE')
plt.title('Cluster Visualization')
plt.show()

모든 값이 0과 1이므로 다음과 같이 나오는 것이 정상

2.5 Scipy의 zscore를 통해 통계적으로 outlier를 계산하여 이상데이터를 계산 

- Zscore: 99.7 %의 값이 Z의 값에 있어야 한다는 것. 그렇지 않으면 이상치로 간주. 

- 이러한 이론에 따라서 다음과 같은 코드를 작성

from scipy.stats import zscore
# Calculating the Z-score for the 'Pump' column
data['Pump_Zscore'] = zscore(data['Pump'])
# Identifying outliers (e.g., using a threshold of 3)
outliers_z = data[abs(data['Pump_Zscore']) > 3]
print("Outliers usi - 이러한 이론에 따라서 다음과 같은 코드를 작성 ng Z-score method:\n", outliers_z)

-3 < Z < 3 사이에 있지 않은 값은 이상 값으로 간주

- 다른 탐지 기술도 그렇지만 실제로 적용 시에는 도메인 지식을 사용하고 회의를 해야 함. 

- 본 예제에서는 다음과 같은 결과 값이 나옴

 

다음에는 오토인코더를 통한 이상탐지를 다뤄보도록한다. 

- 중요한 신경망의 개념 중 하나. 

- NN은 다음과 같이 

- Input값이 Hidden layer에서 선형 함수를 거친 다음 Activation Function(tanh)를 거치고 Output으로 바로 전환디는 과정을 거침.  

NN

- 그러나 RNN은 Hidden layer에서 선형함수를 거친 다음Activation Function(tanh)가 바로 Output으로 전달되지 않고, 다시 Input 값으로서 전달 됨. 그 다음 다시 해당 값이 선형 함수를 거치고 Actication Function을 거친 다음 다음 Input 값으로 전달 됨. (반복) => Recurrent Neural Network => 순서가 있는 데이터를 처리하는데 강점을 가짐. 

RNN

- 순서가 있는 데이터?

: 내부 요소들이 동일하다고 하더라도 순서가 바뀌면 통합적으로 완전히 다른 의미가 되는 것. 

예) 텍스트 데이터. 

I work at google(나는 구글에 근무한다)

I google at work(나는 회사에서 구글링한다)

: 내부 요소는 동일하지만 순서가 바뀌니까 다른 의미가 되었다. 

그렇다면 우리가 RNN으로 잘 알고 있는 주식 데이터를 살펴보자. (종가만)

1일   2일    3일    4일   

1000 1050  900   1060

1일    3일   2일    4일

1000  900   1050  1060

- 내부 요소는 같지만 내가 의도하는 바는 전혀 다르다. 나는 시계열로 일별 종가를 필요로 하였는데 전혀 다른 값이 왔다. 이런 데이터는 RNN으로 손쉽게 처리 할 수 있다. 

- RNN은 순서가 있는 데이터를 온전히 파악하기 위하여 은닉측 내에 순환적 구조(Recurrent structure)를 이용하여 과거의 데이터를 기억(Remember)해 두고 있다가 새롭게 입력으로 주어지는 데이터와 은닉층에서 기억하고 있는 과거 데이터를 연결 - (New Input+Recurrent Output)시켜서 그 의미를 알아내는 기능을 수행. 

=> 데이터 분석 결과가 데이터 분석 결과에 영향을 미칠 경우 RNN을 사용하자!

[RNN의 동작 원리]

가장 간단한 텍스트 데이터(I work at google)를 분석하면서 동작 원리를 알아 보자. 

1. 먼저 문장을 각 요소별로 분리한다. (데이터 전처리 = 형태소 분리) 

: I/work/at/google

2. 신경망 구조 설계

: 입력 - 은닉 - 출력

: 은닉층으로는 tanh를 사용한다. 그리고 최종 분류로는 softmax를 사용한다. 

: 출력층은 명사, 대명사, 동사, 전치사 4가지 Class를 분류한다. 

3. 먼저  I가 입력층으로 들어감. I는 선형회귀를 서친 다음 tanh를 거침. 이전에 아무 값도 들어오지 않았으므로 I를 그대로 분석함. 이후 출력층에서는 다시 한 번 선형회귀를 거치고 softmax를 통해서 해당 단어(I)가 어떤 class에 속하는 지 분류해 냄. 여기서는 대명사.

4. 다음으로 Work를 입력. 

같은 신경망에 Work가 들어감. 기본에 I가 잔존해 있어서 이 값이 영향을 줌. 하지만 분류는 위 3의 과정과 같이 똑같이 해낼 수 있음. 즉, 동사로 분류

(이하 상동)

 

 

오토인코더의 종류는 다양하다. Single Auto Encoder, Deep Auto Encoder, Stacker Auto Encoder, Denoising Auto Encoder. 그리고 경우에 따라서는 Auto Encoder를 합칠 수도 있고 이러한 어플리케이션을 Google에서 볼 수 있다. 

여기에서는 각각의 단일 경우에 대해서만 그림과 간단한 설명으로 살펴 보도록 한다. 

Auto Encoder

: Encoder와 Decoder - 즉, 입력과 출력이 대칭이 되도록 네트워크를 디자인 한 오토인코더

Stacked Auto Encoder

: Latent space역시 단층이 아니라 여러 층이 될 수 있다. 이에 따라 이러한 네트워크를 Stacked layer라고 이름을 붙였다. 이러한 네트워크는 일반적으로 Single Auto Encoder보다 좋은 성능을 보인다. (Deep learning이 layer가 깊어 질 수록 성능이 좋아지는 것 처럼)

 

Deep Auto Encoder

더 이상 그리기가 힘들어서 캡쳐로 대체한다. (https://wiki.pathmind.com/deep-autoencoder

딥 오토안코더는 네트워크를 최소 4개 사용해야 한다. 그리고 Encoder와 Decoder를 대칭으로 사용해야 함. 

Denoising Auto Encoder

그림이 별로 없다. 설명을 많이 보충해야 할 것 같다. 

- 일단 상기의 그림을 보면 Encoder쪽 그림이 깨끗하지 못하다. 즉. Noise가 섞여 있다. Network에 Keras에서는 Gaussian잡음을 넣는 것는 코드를 지원하는 것으로 기억한다. 

- 그리고 가우시안 Noise를 넣은 다음에는 Encoder에 잡음이 섞인 Input'를 넣은 다음 압축(Copressed represenation)을 한다. 

- 그리고 Decoder는 해당 Compressed representation을 어떻게든 깨끗하게 처음처럼 Gaussian Noise가 섞이지 않은 처음 Input(주의!....Input'가 아님) 으로 복원하는 것을 목표로 한다. 

 

 

Sparse Encoder도 있는데 이건 시간나면 해 보겠다. 지금은..잘 모른다. =_ㅠ

 

 

 

# library import

from keras.datasets import mnist

from keras.layers import Input, Dense

from keras.models import Model # <=기존 모델의 인풋 값과 내 모델의 아웃풋 값을 전달

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

==========================

#data load

(X_train, _), (X_test, _) = mnist.load_data()

#chage types as a real value 

X_train = X_train.astype('float32')/255

X_test = X_test.astype('float32')/255

#reshape the data from (60000, 28,28) , (10000, 28,28)to (60000, 784), (10000, 784)  

X_train = X_train.reshape(len(X_train), np.prod(X_train.shape[1:]))

X_test = X_test.reshape(len(X_test), np.prod(X_test.shape[1:]))

print(X_train.shape)

print(X_test.shape)

 

#set input layer

input_img= Input(shape=(784,))

#===================encoder================================#

encoded = Dense(units=128, activation='relu')(input_img)

encoded = Dense(units=64, activation='relu')(encoded) ###

encoded = Dense(units=32, activation='relu')(encoded)

#===================decoder================================#

decoded = Dense(units=64, activation='relu')(encoded)

decoded = Dense(units=128, activation='relu')(decoded)

decoded = Dense(units=784, activation='sigmoid')(decoded)

Input layer, Enc. Dec. Network 개념도

중간에 네트워크 짜는 개념은 알고 가야 할 것 같아서 설명을 넣는다. 

- 상기와 같이 초기에 전처리한 Input layer를 넣고 그 다음에 차차 압축해 가면서 Encoder를 넣는다. 

- 그리고 그 다음에 압축된 데이터를 복원하기 위해 Latent space(여기서는 32)로부터 차차 다시 올라가도록 한다. 

- 그리고 이러헤 복원시키는 이미지를 사용하는 오토인코더를 만든다. (최종모델)

#####################################

autoencoder=Model(input_img, decoded) # decode를 거쳐 복원하는 최종 모델 (auto encoder)???????(확인 필요) Model의 의미

autoencoder.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])

autoencoder.fit(X_train, X_train,

                epochs=50,

                batch_size=256,

                shuffle=True,

                validation_data=(X_test, X_test))

#####################################

encoder = Model(input_img, encoded) # encode를 거쳐 lated space로 압축하는 모델(확인 필요)

다음은 실수로 오토인코딩 하는 코드 살펴 보는 것으로 하는 것으로

 

저번 포스팅에서 오토인코더의 기본적인 개념에 대해서 알아 보았다. 

복습하면 오토인코더는 딥러닝을 2개 붙여놓은 것으로 

  • 하나의 딥러닝 구조는 Encoder로 Hidden(latent space)로 압축 하는 것. 
  • 하나의 딥러닝 구조는 Decoder Hidden(latent space)으로 압축된 것에서 원본으로 복원하는 것. 

이다. 즉, 단순히 출력 =입력이 되도록 하는 개념이다. 하지만 이런 Autoencoder도 여러 기법을 사용한다. 

예를 들어서 Denoising autoencoder, 그리고 Stacked encoder와 같은 방법이 존재한다. 

Denoising autoencoder(https://excelsior-cjh.tistory.com/187)

입력에 Noise를 추가하고 노이즈가 없는 우너본 입력을 Decoder가 구성하도록 학습시키는 것. 

Denoising AE 

일반적으로 Gaussian Random을 추가하며, 복원할 떄는 입력된 초기 값을 복원한다. 

- Denoising Auto Encoder를 사용하면 (Training Data + Noise) - Training Data를 학습한 결과가 Encoder에 넣어져서 노이즈를 붙이기 전 데이터와 노이즈를 붙였을 때 Data와의 차이를 구한다.

- 어떤 Data가 Noise에 대해 강력한 지 알 수 있다. 

- 예) 사람이라면 머리, 눈, 코가 가장 강력하게 구분하는 데 강력한 영향을 미치고, 주근깨 등은 적은 영향을 미침. 

- 따라서 Denoising Auto Encoder를 잘 활용하면 데이터가 별로 없는 상황에서도 어떤 특성이 가잔 영향력을 많이 미치는 지 비지도 학습으로 딥러닝을 수행할 수 있다. 

Stacked Auto Encoder(http://jaynewho.com/post/9)

Stacked Encoder의 구조

Auto Encoder자체가 비지도 학습이지만 Stacked Encoder는 Latent Space를 더 많이 사용하여 레이블되지 않은 데이터가 많을 때 사용하는 방법이다. 즉, Hidden layer를 더 많이 사용함으로써, 1)  전체 데이터를 학습시켜서 데이터를 레이블링한 다음 2)  하위 레이어를 사용하여 다시 학습시키는 방법을 사용하여 성능을 증가 시키는 방법을 사용한다. 

이 방법으로 일반적인 오토인코더보다 성능이 훨씬 개선되지만 정확한 수식이나 코드는 아직 보지 못했다. 최근에는 Denoising과 Stacked Auto Encoder를 섞어서 사용하는 것 같은데 이러한 방법에 대해서도 알아 봐야 할 것 같다. 다음에는 이, Stacked Denoising Auto Encoder아니면 Stacked나 Denoising Autoencoder의 코드를 알아 보도록 하겠다. 

-끝- 

 

 

Auto Encoder란 무엇인가

오토인코더란 비지도 학습의 하나로 사람이 라벨링을 해줘서 일일히 가르쳐 줘야 하는 지도학습과 달리(개, 고양이)분류를 하는 일반적으로 우리가 알고 있는 딥러닝과 같이

그림1. 지도 학습 알고리즘의 예시

레이블링을 따로 해 줄 필요가 없다. 

일반적으로 우리가 알고 있는 딥러닝의 구조가 그림2와 같다면 오토인코더의 구조는 그림3과 같다.

그림2. 딥러닝의 구조
그림3. 오토인코더의 구조

간단하게 설명하면 딥러닝을 2개 붙여놓은 구조이다.

  • 하나의 딥러닝 구조는 Encoder로 Hidden(latent space)로 압축 하는 것. 
  • 하나의 딥러닝 구조는 Decoder Hidden(latent space)으로 압축된 것에서 원본으로 복원하는 것. 

따라서 Auto Encoder를 거치면 원래의 Data를 비슷하게 복원할 수 있다.

하지만 Decoder는 Train Data즉 학습 Data만 제대로 복원할 수 있고 학습하지 않은 Data는 제대로 복원할 수 없다. 


 오토 인코더에 대해서는 자세한 수식도 있고 이에 대해서 설명한 글도 많이 있지만 이는 이해하지 못했으므로 추후에 포스팅 하도록 하고 이번에는 개념적인 것만 포스팅 하도록 한다. 

참고: https://lewisxyz000.tistory.com/22

+ Recent posts