Elasticsearch Install

ElasticSearch & Kibana 설치 in WSL2

ElasticSearch & Kibana 설치 in WSL2 - Data Science | DSChloe

Step 1. 사전 필수 패키지 설치

0.우선 시스템 패키지를 업데이트 하고, HTTPS와 관련된 패키지를 설치한다.

Windows Terminal → wsl bash

또는

Ubuntu → ..cd → ..cd

sudo apt-get update && sudo apt-get upgrade

sudo apt update

sudo apt install apt-transport-https

  1. 자바를 설치한다.
  • 이미 설치가 되어 있다면 버전만 확인한다.

sudo apt install openjdk-11-jdk

java -version

  1. 자바 환경 변수를 설정하기 위해 아래와 같이 에디터를 입력한다.

sudo vi /etc/environment

→ (그리고 다음내용을 추가한다.)

→ 인서트 모드에서 JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

→ esc → :wq 하여 저장하고 나간다.

• 환경변수를 업데이트 한다.

• 그리고 실제 경로가 나오는지 확인한다.

source /etc/environment

echo $JAVA_HOME

→ /usr/lib/jvm/java-11-openjdk-amd64 가 출력되면 성공.

Step 2. ElasticSearch 설치

• GPG Keys를 확인하여 설치를 진행한다.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

• 라이브러리를 아래와 같이 추가한다.

sudo sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'

• 이제 elasticsearch를 설치한다.

sudo apt-get update

sudo apt-get install elasticsearch

Step 3. Elasticsearch 서비스 시작

• 이번에는 elasticsearch 서비스를 시작한다.

sudo systemctl start elasticsearch

에러 발생 :

System has not been booted with systemd as init system (PID 1). Can’t operate.
Failed to connect to bus: Host is down

에러 해결 :

boot - 시스템이 init system(PID 1)으로 systemd로 부팅되지 않았습니다. 작동 할 수 없음 - 우분투에게 물어보십시오. (askubuntu.com)

sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=basic.target

sudo -E nsenter --all -t $(pgrep -xo systemd) runuser -P -l $USER -c "exec $SHELL"

• 서비스가 가능하도록 한다.

• 그리고 서비스를 시작한다.

sudo systemctl enable elasticsearch

sudo systemctl start elasticsearch

• 실제 서비스가 작동하는지 확인한다.

curl -X GET "localhost:9200/"

→ 주소창에 입력 : localhost:9200/

→ windows Terminal과 같은 내용이 출력되면 성공

Step 4. Kibana 설치 및 서비스 시작

• 우선 kibana를 설치한다.

• 그리고 서비스를 활성화한다.

sudo apt-get install kibana

sudo systemctl enable kibana

• 서비스를 시작하고, 확인해본다

sudo systemctl start kibana

sudo systemctl status kibana

Step 5. Kibana WebUI 확인

http://localhost:5601/ 에서 확인해본다.

[Reference]

Apache Nifi Install

Apache airflow

Apache-Airflow in windows 설치

• Windows WSL2에서 airflow를 설치한다.

Step 1. Install pip on WSL

• c드라이브에 들어간다.

관리자 권한으로 실행 : Ubuntu

cd..

cd..

cd mnt/c

• 폴더를 만든다

mkdir airflow-test

ls

cd airflow-test/

• pip를 설치한다.

sudo apt-get update && sudo apt-get upgrade

sudo apt install python3-pip

Step 2. Install virtualenv package

• virtualenv 라이브러리를 설치한다.

sudo pip3 install virtualenv

Step 3. Create a virtual environment

• 이제 가상환경을 생성한다.

virtualenv venv

• 가상환경에 접속을 한다.

→ airflowtest 경로에서 해야 한다.

source venv/bin/activate

→ 경로 확인

pwd

• 이번에는 .bashrc 파일을 수정한다.

• 파일을 열고, 맨 밑줄에 다음과 같은 코드를 추가한다.

vi ~/.bashrc

→ 내용 추가 : export AIRFLOW_HOME=/mnt/c/airflow-test

→ ESC → :wq 하여 저장

• 수정된 코드를 업데이트 하기 위해서는 아래와 같이 반영한다.

source ~/.bashrc

• 실제로 코드가 반영되었는지 확인하기 위해서는 다음과 같이 확인해본다.

• 다시 가상환경에 접속하고 수행

source venv/bin/activate

echo $AIRFLOW_HOME

→ /mnt/c/airflow-test 출력되면 성공.

Step 4. Apache Airflow 설치

• PostgreSQL, Slack, Celery 패키지를 동시에 설치하는 코드를 작성한다.

sudo apt-get update && sudo apt-get upgrade

pip3 install 'apache-airflow[postgres, slack, celery]'

• airflow 실행을 위해 DB 초기화를 해줘야 한다.

airflow db init

• 실제로 잘 구현이 되었는지 확인하기 위해 webserver를 실행한다

airflow webserver -p 8081

→ port 번호 8081을 뜻한다.

• 그리고, 해당 링크 http://localhost:8081/login/ 에 접속하면 아래와 같은 화면이 나타난다.

Untitled

• 그런데, 여기에서 문제는 username을 생성하지 않았다. 따라서, username을 추가하도록 한다

→ ctrl + c 로 빠져나온다.

airflow users create --username airflow --password airflow --firstname evan --lastname airflow --role Admin --email your_email@some.com

• 다시 웹서버 실행

airflow webserver -p 8081

• 해당 링크 http://localhost:8081/login/ 에 접속

• 다음 정보로 로그인한다

→ id : airflow

password : airflow

→ 다음 화면이 나오면 성공.

Untitled

설정완료 후에 가상환경 키는 법

ubuntu

→ cd .. → cd .. → cd mnt/c → cd airflow-test

source venv/bin/activate

Airflow 재설치 및 데이터 파이프라인 구축

Apache Nifi Install

Apache NiFi

Apache NiFi 설치와 설정 in WSL2 - Data Science | DSChloe

설치

  • wsl2에서 JAVA 설치 한다.

관리자 권한으로 실행 : Ubuntu

lscd ..lscd ..ls // ls 하여 파일 출력 될 때까지

java --version

→ 설치 안 되어 있을 시 : sudo apt-get update && sudo apt-get upgrade

→ 설치 안 되어 있을 시 : sudo apt install openjdk-11-jdk

vi ~/.bash_profile

→ vi 편집기로 이동된다.

→ 내용 추가 : export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

→ esc + :wq 하여 저장

  • source 사용하여 상태 저장

source ~/.bash_profile

echo $JAVA_HOME

→ 다음 내용 출력 시 성공 : /usr/lib/jvm/java-11-openjdk-amd64

  • curl을 이용해서 NiFi를 현재 경로에 내려받는다. 오래 걸린다.

sudo wget https://downloads.apache.org/nifi/1.16.0/nifi-1.16.0-bin.tar.gz

ls

→ 현재 있는 기본 경로에 nifi 가 출력 됨을 알 수 있다.

Untitled

cp nifi-1.16.0-bin.tar.gz mnt/c/nifi-1.16.0-bin.tar.gz

cd mnt

cd c

ls

→ /mnt/c 경로에 nifi 가 생겼다.

Untitled

  • .tar.gz 파일의 압축을 푼다

sudo tar xvaf nifi 까지 타이핑하고 Tab 하여 다음 코드 작성

sudo tar xvzf nifi-1.16.0-bin.tar.gz

  • 압축파일을 푼 다음에는 cd nifi-1.16.0 폴더에 접속을 한다.

→ Tab 이용하여 다음 코드 작성하고 실행

cd nifi-1.16.0/bin

  • ls를 실행해서 nifi-env.sh 파일이 있는지 확인하고 있다면, vi 에디터로 연다.
  • bash_profile에서 한 것처럼 동일하게 자바 환경변수를 잡아준다

sudo vi nifi-env.sh

→ 내용 추가 : export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

→ esc + :wq 하여 저장하고 나온다.

sudo ./nifi.sh start

→ 몇 분간 새로고침한다. ( 계속 안될 경우 : stop하고 기록을 지운 다음 다시 start)

→ 비공개 화면 … 이라는 문구가 출력된다.

→ ‘고급’ 선택

→ 나타나는 주소를 클릭하여 들어간다.

→ 다음 화면이 출력된다.

Untitled

  • 종료

/mnt/c/nifi-1.16.0$ 상태에서 다음 명령 실행해야 한다.

cd ..

sudo ./bin/nifi.sh stop

  • 로그인 준비.
  • 아이디와 비밀번호를 설정한다. ( *비밀번호는 최소 13자리)

sudo ./bin/nifi.sh set-single-user-credentials human 1234567890123

  • 그리고, nifi-env.sh 파일을 실행
  • 단, /bin 경로에서 한다.

cd bin/

sudo ./nifi.sh start

→ 몇 분간 새로고침한다.

→ 다음 정보로 로그인

id : human

password : 1234567890123

→ 다음 화면이 출력되면 성공.

Untitled

  • 세팅은 끝났으니 일단 종료시켜놓자.
  • 종료
  • /mnt/c/nifi-1.16.0$ 상태에서 다음 명령 실행해야 한다.

cd ..

sudo ./bin/nifi.sh stop

기록 지우는 법

ubuntu에서 다음 명령 실행

cd..

cd..

cd mnt/c

ls

cd nifi-1/16/0/

ls

cd logs

ls

sudo rm -rf *

ls

→ 삭제 되어 아무것도 출력되지 않는다.

NiFi 사용법

  • Nifi 사용법을 익혀보자
  • 실무 예제로 배우는 데이터 공학 19p 부터 따라해본다.

메뉴바에서 process를 드래그하여 캔버스에 놓는다.

→ 다음 그림의 우측 상단에서 검색한다.

→ 검색 : GenerateFlowFile

→ ADD 버튼 클릭

Untitled

→ 같은 방법으로 검색

→ 검색 : putfile

→ ADD

나타난 박스를 우클릭 → configure

→ properties

→ field 를 설정할 수 있다.

설정 후에는 박스끼리 연결할 수 있다.

→ 박스 하나의 중앙을 드래그하여 다른 박스에 놓는다.

→ 연결된다.

→ 이 상태에서 GenerateFlowFile에서 파일을 생성하여 PutFile에 옮길 수 있다.

Untitled

  • Reference : 실무 예제로 배우는 데이터 공학

WSL2 install

WSL2 and Linux

다음 링크 참고 :

Microsoft Store → windows terminal 설치

→ windows powershell 관리자 권한으로 설치

[Windows 10] WSL2 설치 및 사용법 - LainyZine 내용 참고하여 명령.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

→ 재부팅

→ wsl2 Linux 커널 업데이트 패키지 설치 ( 위 링크 참고)

설치 실패 : ( This update only applies to machines with the windows subsystem for Linux)

   ㄴ [https://goaloflife.tistory.com/192](https://goaloflife.tistory.com/192) 로 해결해본다.

→ windows Terminal

wsl --set-default-version 2

→ Microsoft Store → Ubuntu 설치

→ Ubuntu → 설치되기까지 기다린다

→ 이름 / 패스워드 입력

( 이름 : kmk3593 / password : 2016***** )

→ windows terminal

wsl -l -v

→ Ubuntu Running 2 가 출력되면 성공.

Linux Shell 프롬프트

windows terminal

wsl bash

→ Bash 셸이 실행됨. 프롬프트 형태가 바뀌면 성공

저자 주: 여기서부터 WSL2 리눅스 셸 프롬프트

→ 즉, Windows 10 메인 디스크가 리눅스와 연결되어있으며,

WSL2 Linux에서 Windows의 파일을 사용하는 것도 가능한 상태.

setting 순서

  • Nifi → Airflow → Elasticsearch → postgreSQL → VSCord 순으로 세팅을 진행했다.
  1. Apache NiFi 설치와 설정 in WSL2 - Data Science | DSChloe
  2. Setting up Apache-Airflow in Windows using WSL2 - Data Science | DSChloe
  3. ElasticSearch & Kibana 설치 in WSL2 - Data Science | DSChloe
  4. PostgreSQL Installation on WSL2 and Windows - Data Science | DSChloe
  5. VSCode Remote WLS 연동 - Data Science | DSChloe

Anaconda install

Anaconda

아나콘다 설치

  • 주소 : Anaconda | Individual Edition

    → download → 관리자 권한으로 실행

    → install직전에 Add Anaconda 3 to the system path…에 체크 → install

    → anaconda individual edition tutorial 을 체크 해제 → finish

  • anaconda navigator 열기

    → JupyterLab

    → 왼쪽 목록에서 ‘Desktop’으로 이동 → 폴더 생성 ‘AI’ → ‘AI’로 이동

    → Notebook 클릭 → 파이썬 편집기 사용하면 됨.

pycharm 설치

  • 구글링 : pycharm

    → ‘Community’ 버전 다운로드

    → 관리자 권한으로 실행 → 옵션의 체크 박스를 전부 체크 → install

    → finish

  • 시스템 환경 변수 편집 → 환경 변수 → 시스템 변수 : path → 편집

    → anaconda3\library, anaconda3\script 등이 있는지 확인

    Untitled

    → 설정 완료

  • /code 단축키로 코드 입력 창 생성
1
$ git clone 주소
  • 캡처 단축키 : window + shift + s → 캡쳐 → ctrl+v (붙여넣기)

chapter_9_3

LSTM 신경망 훈련하기

  • RNN은 실무에서 안씀!!!!!!!!!!!
  • 나온 배경
    • 문장이 길면, 학습 능력이 떨어짐
    • Long Short-Term Memory
  • 단기 기억을 오래 기억하기 위해 고안됨.

데이터 불러오기

1
2
3
4
5
6
7
8
from tensorflow.keras.datasets import imdb
from sklearn.model_selection import train_test_split

(train_input, train_target), (test_input, test_target) = imdb.load_data(
num_words=500)

train_input, val_input, train_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step
17473536/17464789 [==============================] - 0s 0us/step

padding

1
2
3
4
from tensorflow.keras.preprocessing.sequence import pad_sequences

train_seq = pad_sequences(train_input, maxlen=100)
val_seq = pad_sequences(val_input, maxlen=100)

모형 만들기

1
2
3
4
5
6
7
from tensorflow import keras
model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length = 100))
model.add(keras.layers.LSTM(8)) # SimpleRNN
model.add(keras.layers.Dense(1, activation='sigmoid'))

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                /images/chapter_9_3/output Shape              Param #   
=================================================================
 embedding (Embedding)       (None, 100, 16)           8000      
                                                                 
 lstm (LSTM)                 (None, 8)                 800       
                                                                 
 dense (Dense)               (None, 1)                 9         
                                                                 
=================================================================
Total params: 8,809
Trainable params: 8,809
Non-trainable params: 0
_________________________________________________________________
1
2
3
4
5
6
7
8
9
10
11
12
13
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-lstm-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)

# epochs = 100
history = model.fit(train_seq, train_target, epochs=10, batch_size=64,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
Epoch 1/10
313/313 [==============================] - 13s 36ms/step - loss: 0.6922 - accuracy: 0.5400 - val_loss: 0.6909 - val_accuracy: 0.5952
Epoch 2/10
313/313 [==============================] - 12s 39ms/step - loss: 0.6886 - accuracy: 0.6219 - val_loss: 0.6855 - val_accuracy: 0.6436
Epoch 3/10
313/313 [==============================] - 10s 33ms/step - loss: 0.6778 - accuracy: 0.6671 - val_loss: 0.6655 - val_accuracy: 0.6896
Epoch 4/10
313/313 [==============================] - 11s 35ms/step - loss: 0.6173 - accuracy: 0.7113 - val_loss: 0.5780 - val_accuracy: 0.7118
Epoch 5/10
313/313 [==============================] - 11s 34ms/step - loss: 0.5591 - accuracy: 0.7294 - val_loss: 0.5511 - val_accuracy: 0.7362
Epoch 6/10
313/313 [==============================] - 13s 43ms/step - loss: 0.5346 - accuracy: 0.7499 - val_loss: 0.5300 - val_accuracy: 0.7488
Epoch 7/10
313/313 [==============================] - 10s 33ms/step - loss: 0.5143 - accuracy: 0.7640 - val_loss: 0.5139 - val_accuracy: 0.7618
Epoch 8/10
313/313 [==============================] - 10s 33ms/step - loss: 0.4964 - accuracy: 0.7748 - val_loss: 0.4970 - val_accuracy: 0.7722
Epoch 9/10
313/313 [==============================] - 10s 33ms/step - loss: 0.4816 - accuracy: 0.7828 - val_loss: 0.4844 - val_accuracy: 0.7806
Epoch 10/10
313/313 [==============================] - 11s 35ms/step - loss: 0.4691 - accuracy: 0.7908 - val_loss: 0.4739 - val_accuracy: 0.7808

손실 곡선 추가

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

png

순환층에 드롭아웃 적용하기

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
model2 = keras.Sequential()

model2.add(keras.layers.Embedding(500, 16, input_length=100))
# 드롭아웃 추가
model2.add(keras.layers.LSTM(8, dropout=0.3))
model2.add(keras.layers.Dense(1, activation='sigmoid'))

rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model2.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-dropout-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)

# epcohs = 100
history = model2.fit(train_seq, train_target, epochs=10, batch_size=64,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
Epoch 1/10
313/313 [==============================] - 14s 37ms/step - loss: 0.6929 - accuracy: 0.5109 - val_loss: 0.6926 - val_accuracy: 0.5336
Epoch 2/10
313/313 [==============================] - 11s 34ms/step - loss: 0.6915 - accuracy: 0.5725 - val_loss: 0.6908 - val_accuracy: 0.5904
Epoch 3/10
313/313 [==============================] - 11s 34ms/step - loss: 0.6887 - accuracy: 0.6108 - val_loss: 0.6868 - val_accuracy: 0.6312
Epoch 4/10
313/313 [==============================] - 13s 40ms/step - loss: 0.6818 - accuracy: 0.6508 - val_loss: 0.6774 - val_accuracy: 0.6510
Epoch 5/10
313/313 [==============================] - 11s 35ms/step - loss: 0.6623 - accuracy: 0.6740 - val_loss: 0.6441 - val_accuracy: 0.6678
Epoch 6/10
313/313 [==============================] - 11s 35ms/step - loss: 0.6024 - accuracy: 0.7145 - val_loss: 0.5710 - val_accuracy: 0.7374
Epoch 7/10
313/313 [==============================] - 12s 38ms/step - loss: 0.5601 - accuracy: 0.7370 - val_loss: 0.5479 - val_accuracy: 0.7512
Epoch 8/10
313/313 [==============================] - 11s 35ms/step - loss: 0.5387 - accuracy: 0.7502 - val_loss: 0.5285 - val_accuracy: 0.7600
Epoch 9/10
313/313 [==============================] - 11s 34ms/step - loss: 0.5189 - accuracy: 0.7624 - val_loss: 0.5089 - val_accuracy: 0.7714
Epoch 10/10
313/313 [==============================] - 11s 35ms/step - loss: 0.5008 - accuracy: 0.7746 - val_loss: 0.4928 - val_accuracy: 0.7758

png

  • Reference : 혼자 공부하는 머신러닝 + 딥러닝

chapter_9_2

순환 신경망으로 IMDB 리뷰 분류

  • 혹시, 자연어 처리, 감정분석 관심 있으면 강사님께 개인적으로 연락!

  • 주제 : 긍정리뷰 부정리뷰 분류

  • 501p

    • 텍스트 자체가 신경망에 전달하지 않는다! (문자열 –> 수식에 적용 X)

    • 문자열을 수식으로 정하는 규칙이 매우 가변적임. (토근화, Tokenizing)

    • He follows the cat. He loves the cat.
      10 11 12 13 10 14 12 13

    • 고양이를 따라간다. He follows the cat.
      10 11 12 13 14 15

  • RNN, LSTM 알고리즘

    • 영어권 사람들이 만들었어요.
    • 자연어처리와 관련된 많은 알고리즘
      • 영어권 사람들이 만듬
  • 한글 != 영어

    • 성과 내려면 제품(=돈) (네이버)
1
2
from tensorflow.keras.datasets import imdb
(train_input, train_target), (test_input, test_target) = imdb.load_data(num_words = 500)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step
17473536/17464789 [==============================] - 0s 0us/step
  • 데이터 크기 확인 (1차원 배열)
  • 텍스트의 길이가 다 다르기 때문에 1차원 배열로 정리 가능
1
print(train_input.shape, test_input.shape)
(25000,) (25000,)
  • 문장의 길이가 다 다르다!
1
2
3
print(len(train_input[0]))
print(len(train_input[1]))
print(len(train_input[2]))
218
189
141
  • Raw 데이터 전처리 -> 토큰화 작업이 끝난 상황 (문자열 –> 숫자로 바뀜)
1
print(train_input[0])
[1, 14, 22, 16, 43, 2, 2, 2, 2, 65, 458, 2, 66, 2, 4, 173, 36, 256, 5, 25, 100, 43, 2, 112, 50, 2, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 2, 2, 17, 2, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2, 19, 14, 22, 4, 2, 2, 469, 4, 22, 71, 87, 12, 16, 43, 2, 38, 76, 15, 13, 2, 4, 22, 17, 2, 17, 12, 16, 2, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2, 2, 16, 480, 66, 2, 33, 4, 130, 12, 16, 38, 2, 5, 25, 124, 51, 36, 135, 48, 25, 2, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 2, 15, 256, 4, 2, 7, 2, 5, 2, 36, 71, 43, 2, 476, 26, 400, 317, 46, 7, 4, 2, 2, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2, 56, 26, 141, 6, 194, 2, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 2, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 2, 88, 12, 16, 283, 5, 16, 2, 113, 103, 32, 15, 16, 2, 19, 178, 32]
  • Target 데이터 출력
    • 0은 부정리뷰
    • 1은 긍정리뷰
1
print(train_target[:20])
[1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1]

데이터셋 분리

1
2
3
4
5
6
from sklearn.model_selection import train_test_split 
train_input, val_input, train_target, val_target = train_test_split(
train_input, train_target, test_size = 0.2, random_state=42
)

train_input.shape, val_input.shape, train_target.shape, val_target.shape
((20000,), (5000,), (20000,), (5000,))

데이터 시각화

  • 각 리뷰의 평균단어의 갯수
1
2
3
4
5
import numpy as np
#temp_list = [len(x) for x in train_input]
# print(temp_list)
lengths = np.array([len(x) for x in train_input])
print(np.mean(lengths), np.median(lengths))
239.00925 178.0
1
2
3
4
5
import matplotlib.pyplot as plt 
plt.hist(lengths)
plt.xlabel('length')
plt.ylabel('frequency')
plt.show()

png

  • 짧은 단어 100개만 사용
  • 모든 길이를 100에 맞춘다.
    • “패딩”
  • 데이터의 갯수는 20000, 전체 길이는 100으로 맞춤
1
2
3
4
from tensorflow.keras.preprocessing.sequence import pad_sequences 
train_seq = pad_sequences(train_input, maxlen = 100)

print(train_seq.shape)
(20000, 100)
1
print(train_seq[5])
[  0   0   0   0   1   2 195  19  49   2   2 190   4   2 352   2 183  10
  10  13  82  79   4   2  36  71 269   8   2  25  19  49   7   4   2   2
   2   2   2  10  10  48  25  40   2  11   2   2  40   2   2   5   4   2
   2  95  14 238  56 129   2  10  10  21   2  94 364 352   2   2  11 190
  24 484   2   7  94 205 405  10  10  87   2  34  49   2   7   2   2   2
   2   2 290   2  46  48  64  18   4   2]
1
2
print(train_input[0][-10:])
print(train_seq[0])
[6, 2, 46, 7, 14, 20, 10, 10, 470, 158]
[ 10   4  20   9   2 364 352   5  45   6   2   2  33 269   8   2 142   2
   5   2  17  73  17 204   5   2  19  55   2   2  92  66 104  14  20  93
  76   2 151  33   4  58  12 188   2 151  12 215  69 224 142  73 237   6
   2   7   2   2 188   2 103  14  31  10  10 451   7   2   5   2  80  91
   2  30   2  34  14  20 151  50  26 131  49   2  84  46  50  37  80  79
   6   2  46   7  14  20  10  10 470 158]
1
val_seq = pad_sequences(val_input, maxlen = 100)

순환 신경망 만들기

1
2
3
4
from tensorflow import keras
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(8, input_shape=(100, 500)))
model.add(keras.layers.Dense(1, activation='sigmoid'))
  • 원핫 인코딩 적용
    • 매칭이 성공하면 1을 출력
1
2
train_oh = keras.utils.to_categorical(train_seq)
print(train_oh.shape)
(20000, 100, 500)
1
print(train_oh[0][0][:12])
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
1
print(np.sum(train_oh[0][0]))
1.0
  • 1이 출력되었으므로 성공
  • 이제 검증데이터에 적용한다.
1
val_oh = keras.utils.to_categorical(val_seq)
1
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn (SimpleRNN)      (None, 8)                 4072      
                                                                 
 dense (Dense)               (None, 1)                 9         
                                                                 
=================================================================
Total params: 4,081
Trainable params: 4,081
Non-trainable params: 0
_________________________________________________________________
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"""
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-simplernn-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)

history = model.fit(train_oh, train_target, epochs=100, batch_size=64,
validation_data=(val_oh, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
"""
"\nrmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)\nmodel.compile(optimizer=rmsprop, loss='binary_crossentropy', \n              metrics=['accuracy'])\n\ncheckpoint_cb = keras.callbacks.ModelCheckpoint('best-simplernn-model.h5', \n                                                save_best_only=True)\nearly_stopping_cb = keras.callbacks.EarlyStopping(patience=3,\n                                                  restore_best_weights=True)\n\nhistory = model.fit(train_oh, train_target, epochs=100, batch_size=64,\n                    validation_data=(val_oh, val_target),\n                    callbacks=[checkpoint_cb, early_stopping_cb])\n"
  • 514p
    • 문제점 발생: 토큰 1개를 500차원으로 늘림.. –> 데이터 크기가 500배 커짐
1
2
3
4
5
6
7
from tensorflow import keras
model2 = keras.Sequential()
model2.add(keras.layers.Embedding(500, 16, input_length = 100))
model2.add(keras.layers.SimpleRNN(8))
model2.add(keras.layers.Dense(1, activation='sigmoid'))

model2.summary()
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding (Embedding)       (None, 100, 16)           8000      
                                                                 
 simple_rnn_1 (SimpleRNN)    (None, 8)                 200       
                                                                 
 dense_1 (Dense)             (None, 1)                 9         
                                                                 
=================================================================
Total params: 8,209
Trainable params: 8,209
Non-trainable params: 0
_________________________________________________________________
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model2.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-embedding-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)

history = model2.fit(train_seq, train_target, epochs=100, batch_size=64,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
'''
"\nrmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)\nmodel2.compile(optimizer=rmsprop, loss='binary_crossentropy', \n               metrics=['accuracy'])\n\ncheckpoint_cb = keras.callbacks.ModelCheckpoint('best-embedding-model.h5', \n                                                save_best_only=True)\nearly_stopping_cb = keras.callbacks.EarlyStopping(patience=3,\n                                                  restore_best_weights=True)\n\nhistory = model2.fit(train_seq, train_target, epochs=100, batch_size=64,\n                     validation_data=(val_seq, val_target),\n                     callbacks=[checkpoint_cb, early_stopping_cb])\n "
  • Reference : 혼자 공부하는 머신러닝 + 딥러닝

chapter_9_1

순차 데이터와 순환 신경망

통계

  • 초급 레벨 : 기초통계 (t.test, 분산분석, 회귀분석 등)
  • 중급 레벨 : 시계열 분석 / 베이지안 / 비모수검정
  • 시계열 데이터 : 주식/ 날씨 / 매장 매출
    • R로 공부할 것

텍스트

  • 텍스트 마이닝 (데이터 분석가)
    • 대표 적으로 감정분석 (긍정 / 부정 분류)
    • 문자열 : 인코딩하는 방법론이 존재
  • 자연어 처리 (개발자에 해당)
    • 챗봇
    • 자동 번역
  • 기본 딥러닝 알고리즘 / RNN & LSTM
    • 현실에서 쓸까? 안쓴다!
  • 자료
  • 분야 선정
    • 영상인식, 이미지 분류, 음성, 자연어

순환 신경망

  • 이미지는 픽셀값이 어느정도 고정이 되어 있음

    • 28x28로 정의 / 모든 데이터는 28x28 맞출 수 있음
  • 텍스트

    • 값이 고정이 불가함
  • 494p

  • I am a boy(1, 4, 3)

  • I am a handsome boy(1, 4, 1, 2)

  • Reference : 혼자 공부하는 머신러닝 + 딥러닝

Scikitlearn_pipeline_tutorial

데이터 누수 방지 위한 모델링 기법 : 파이프라인 구축

  • 수능 시험 = 최종 테스트 데이터
  • 모의고사 또는 과거 기출문제 = 검증데이터
  • 교과서 문제지 = 훈련 데이터
  • 머신러닝 엔지니어 : MLOps (선행되어야 하는 코드 조건, Pipeline 형태로 구축)
    • 머신러닝 코드 자동화 가능! 운영 가능!
    • 개발업계의 최상위 연봉자!

데이터 불러오기

1
2
3
4
import pandas as pd
import numpy as np
data = pd.read_csv('https://raw.githubusercontent.com/MicrosoftDocs/ml-basics/master/data/daily-bike-share.csv')
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 731 entries, 0 to 730
Data columns (total 14 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   instant     731 non-null    int64  
 1   dteday      731 non-null    object 
 2   season      731 non-null    int64  
 3   yr          731 non-null    int64  
 4   mnth        731 non-null    int64  
 5   holiday     731 non-null    int64  
 6   weekday     731 non-null    int64  
 7   workingday  731 non-null    int64  
 8   weathersit  731 non-null    int64  
 9   temp        731 non-null    float64
 10  atemp       731 non-null    float64
 11  hum         731 non-null    float64
 12  windspeed   731 non-null    float64
 13  rentals     731 non-null    int64  
dtypes: float64(4), int64(9), object(1)
memory usage: 80.1+ KB

데이터 추출

1
2
3
4
cols = ['season', 'mnth', 'holiday', 'weekday', 'workingday', 'weathersit', 'temp', 'atemp', 'hum', 'windspeed', 'rentals']
data = data[cols]
data.info()
# data['mnth'].value_counts()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 731 entries, 0 to 730
Data columns (total 11 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   season      731 non-null    int64  
 1   mnth        731 non-null    int64  
 2   holiday     731 non-null    int64  
 3   weekday     731 non-null    int64  
 4   workingday  731 non-null    int64  
 5   weathersit  731 non-null    int64  
 6   temp        731 non-null    float64
 7   atemp       731 non-null    float64
 8   hum         731 non-null    float64
 9   windspeed   731 non-null    float64
 10  rentals     731 non-null    int64  
dtypes: float64(4), int64(7)
memory usage: 62.9 KB
  • Data Preprocessing
    • 결측치 수동으로 채우거나
    • 불필요한 변수를 제거하거나
    • 이상치를 제거하거나
    • 파생변수를 만들거나 등

기본 : 데이터 불러오기 -> 데이터 전처리 -> 피처공학(원핫-인코딩) -> 데이터셋 분리 -> 모델링 코드 -> 모델평가

파이프라인 : 데이터 불러오기 -> 데이터 전처리 -> 데이터셋 분리 -> 파이프라인 구축(피처공학, 모델링 코드) -> 모델 평가

데이터 셋 분리

1
2
3
4
5
from sklearn.model_selection import train_test_split
X = data.drop('rentals',axis=1)
y = data['rentals']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)
  • Feature Engineering
    • 기존 : 개별적으로 코드 작성
    • 현재 : Pipeline 코드로 추가할 것

Pipeline 구축

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
34
35
36
37
38
from sklearn.preprocessing import StandardScaler, OrdinalEncoder, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 데이터 타입 3가지
# 수치형 데이터, 문자열 데이터
# 문자열 데이터 : 범주형(명목형, 서열형 데이터로 구분됨)
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean'))
,('scaler', StandardScaler())
])

ordinal_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant'))
,('ordEncoder', OrdinalEncoder())
])

onehot_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant'))
,('oheEncoder', OneHotEncoder())
])

# 수치형 데이터 및 Categorical 데이터 컬럼 분리

numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
ordinal_features = ['holiday', 'weekday', 'workingday', 'weathersit']
onehot_features = ['season', 'mnth']

# numeric_features = data.select_dtypes(include=['int64', 'float64']).columns
# categorical_features = data.select_dtypes(include=['object']).drop(['Loan_Status'], axis=1).columns

preprocessor = ColumnTransformer(
transformers=[
('numeric', numeric_transformer, numeric_features)
, ('ord_categorical', ordinal_transformer, ordinal_features)
, ('ohe_categorical', onehot_transformer, onehot_features)
])

모델 적용

  • 전처리가 끝났으니 모델을 적용한다.
1
2
3
4
5
6
7
8
9
from sklearn.ensemble import RandomForestRegressor

pipeline = Pipeline(steps = [
('preprocessor', preprocessor)
,('regressor', RandomForestRegressor())
])

rf_model = pipeline.fit(X_train, y_train)
print(rf_model)
Pipeline(steps=[('preprocessor',
                 ColumnTransformer(transformers=[('numeric',
                                                  Pipeline(steps=[('imputer',
                                                                   SimpleImputer()),
                                                                  ('scaler',
                                                                   StandardScaler())]),
                                                  ['temp', 'atemp', 'hum',
                                                   'windspeed']),
                                                 ('ord_categorical',
                                                  Pipeline(steps=[('imputer',
                                                                   SimpleImputer(strategy='constant')),
                                                                  ('ordEncoder',
                                                                   OrdinalEncoder())]),
                                                  ['holiday', 'weekday',
                                                   'workingday',
                                                   'weathersit']),
                                                 ('ohe_categorical',
                                                  Pipeline(steps=[('imputer',
                                                                   SimpleImputer(strategy='constant')),
                                                                  ('oheEncoder',
                                                                   OneHotEncoder())]),
                                                  ['season', 'mnth'])])),
                ('regressor', RandomForestRegressor())])
  • 파이프라인끼리 연결시켜서 길게 늘이는 원리
    • 데이터가 라인을 따라 흐르게 된다. 자동화

모델 평가

1
2
3
from sklearn.metrics import r2_score
predictions = rf_model.predict(X_test)
print (r2_score(y_test, predictions))
0.7728368422640097

다중 모형 개발

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor

regressors = [
RandomForestRegressor()
,DecisionTreeRegressor()
]

# regressors = [pipe_rf, pipe_dt]
for regressor in regressors:
pipeline = Pipeline(steps = [
('preprocessor', preprocessor)
,('regressor',regressor)
])
model = pipeline.fit(X_train, y_train)
predictions = model.predict(X_test)
print(regressor)
print(f'Model r2 score:{r2_score(predictions, y_test)}')
RandomForestRegressor()
Model r2 score:0.74544998600902
DecisionTreeRegressor()
Model r2 score:0.6365934810580942

chapter_8_1

합성곱 신경망

  • 코드보다는 용어 정리가 중요하다

  • 더 나은 정확도를 위한 발전 과정

    • 로지스틱 회귀 (일반 ML 모형) : 81%
    • 인공신경망 (딥러닝 초기 모형) : 87%
    • 합성곱 (Convolution, CNN)
  • 합성곱 (CNN)

    • 이미지의 특성을 뽑아내는 과정
    • 합성곱에서는 뉴런이 입력층 위를 이동하면서 출력을 만든다. = 도장을 연상하라
    • 합성곱 층의 뉴런에 있는 가중치 개수는 하이퍼 파라미터이다.
      • 발전사 : alexnet -> resnet -> efficientnet
      • 채널, 이미지의 너비, 크기 (파라미터 튜닝)
      • Vision Transformer
    • 비디오
      • 객체인식(Object Detection)
      • Yolo 논문
  • RNN / LSTM (자연어 처리)

    • 구글 2017년 Transformer (논문)
  • 필터 (filter)

    • 합성곱에서의 뉴런
      • 뉴런 개수를 이야기할 때 필터라 칭한다.
      • 합성곱에서는 완전 연결 신경망과 달리 뉴런을 필터라 부른다.
    • 혹은 커널(kernel)이라 부른다.
      • 입력에 곱해지는 가중치를의미할 때 커널이라 부른다.

합성곱의 장점

  • 기존 : 1차원 배열에서만 연산이 가능
  • 2차원 배열에도 연산을 할 수 있도록 구현
    • 입력이 2차원 배열이 되므로 필터도 2차원이다.
    • 선형대수를 공부해야 하나요??
1
2
3
4
from tensorflow import keras
keras.layers.Conv2D(10, # 필터(즉, 도장)의 개수
kernel_size=(3,3), # 필터에 사용할 커널의 크기
activation = 'relu') # 활성화 함수 지정
<keras.layers.convolutional.Conv2D at 0x7f6c99df5c90>

패딩 (padding)

  • 입력 배열의 주위를 가상의 원소로 채우는 것.
  • 실제 입력값이 아니기 때문에 패딩은 0으로 채운다.
  • 실제 값은 0으로 채워져 있기에 계산에 영향을 미치지 않는다.
    • 세임 패딩 (same padding) : 입력 주위에 0으로 패딩 하는 것
    • 밸리드 패딩 (valid padding) : 패딩 없이 순수한 입력 배열에서만 합성곱하여 특성 맵을 마드는 것

패딩의 목적

  • 배열의 크기를 조정하더라도 이미지 원 특성이 손실되는 것을 방지하는 것

스트라이드 (stride)

  • 기존에 합성곱 연산은 좌우, 위아래로 한 칸씩 이동했다.
    • 두 칸씩 건너뛸 수도 있다.
    • 이런 이동의 크기를 ‘스트라이드’라고 한다.
  • 두 칸씩 이동하면 특성 맵의 크기가 더 작아진다.
    • 커널 도장을 찍는 횟수가 줄어들기 때문.
  • 디폴트는 1칸 이동이다.
1
2
3
4
5
keras.layers.Conv2D(10,                         # 필터(즉, 도장)의 개수
kernel_size=(3,3), # 필터에 사용할 커널의 크기
activation='relu', # 활성화 함수 지정
padding = 'same', # 세임 패딩
strides = 1) # 1칸씩 이동
<keras.layers.convolutional.Conv2D at 0x7f6c992ba8d0>

풀링 (pooling)

  • 값을 추출
  • 100 x 100 이미지 –> (수치로) 주요 이미지의 특성만 뽑은 후, 원 이미지와 같게 만듬 (50 x 50)
  • 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 수행한다.
    • 특성맵의 크기를 줄이지는 않는다.
  • 합성곱처럼 입력 위를 지나가면서 도장을 찍는다.
    • 하지만, 풀링에는 가중치가 없다.
  • 최대 풀링 (max pooling)
    • 도장을 찍은 영역에서 가장 큰 값을 고른다.
  • 평균 풀링 (average pooling)
    • 도장을 찍은 영역에서 평균값을 계산한다.
  • 특성 맵이 여러 개라면 동일한 작업을 반복한다.
    • 즉, 10개의 특성 맵이 있다면 풀링을 거친 특성맵도 10개가 된다.
  • 풀링 영역은 풀링의 크기만큼 이동한다.
    • 즉, 겹치지 않고 이동한다.
    • 풀링의 크기가 (2,2)이면 가로세로 두 칸씩 이동한다.
    • 풀링은 가중치가 없고 풀링 크기와 스트라이드가 같다.
1
2
3
keras.layers.MaxPooling2D(2,                 # 풀링의 크기. 대부분은 2로 둔다.
strides=2, # 2칸씩 이동. 풀링의 크기와 같게 설정된다.
padding='valid') # 풀링은 패딩을 하지 않으므로 'valid'로 지정.
<keras.layers.pooling.MaxPooling2D at 0x7f6c99253e90>
  • 기억할 점
    • 풀링은 가로세로 방향으로만 진행한다.
    • 특성 맵의 개수는 변하지 않고 그대로이다.

합성곱 신경망의 전체 구조

  • p437
  • 1단계 : 이미지 데이터 입력
  • 2단계 : 합성곱 층
    • (1) kernel_size + padding
    • (2) 활성화 함수 적용
    • (3) 각각의 특성맵을 산출
  • 3단계 : 풀링층
    • (1) Max Pooling : 최댓값 추출
    • (2) 최종 특성맵
  • 위 과정을 계속 반복하는 것이 CNN 알고리즘
  • 4단계 : 밀집층 (Fully Connected Layer)
    • Chapter 7장
    • 3차원 배열을 1차원으로 펼친다. (Flatten 클래스)
    • 출력층의 입력이 된다.
  • 5단계 : 분류 예측값을 산출 (Softmax 활성화 함수)
    • 지정한 활성화 함수를 거쳐 최종 예측 확률이 된다.

주요 키워드 : 사전학습(Pretrained) / 전이학습 (Transfer Learning) / 파인 튜닝(Fine Tuning)

  • 다른 사람이 작성한 학습 코드를 사용한다.

  • 파인 튜닝 : 미세 조정하는 것이다.

    • 캐글 경진대회에서 주로 사용.
  • Reference : 혼자 공부하는 머신러닝 + 딥러닝