Tools (130)

반응형

 

R - aggregate / separate_rows

 

데이터 처리 도중, 특정 key 를 기준으로, 문자를 리스트형태로 바꾸고 싶을 때가 있다. 

이 때, R 에서 사용할 수 있는 함수가 aggregate 와 separate_rows 이다. 

(hive 에서는 collect_set 과 explode 함수가 비슷한 기능을 함)

 

왼쪽 테이블 -> 오른쪽 테이블로: separate_rows

오른쪽 테이블 -> 왼쪽 테이블로: aggregate

library(tidyverse)
df <- data.frame(Family_ID = 1:2,
  name = c("Smith, John", "Walker, Mike"),
  stringsAsFactors = FALSE)
  
df2 <- df %>% separate_rows(name)
df2
#   Family_ID name  
#      1 Smith 
#      1 John  
#      2 Walker
#      2 Mike  

df3 <- aggregate(name ~ Family_ID, df2, toString)
df3
#  Family_ID name
#      1  Smith, John
#      2 Walker, Mike
반응형
반응형

R - 난수 생성을 일별로 변경하기

 

R 에서 난수를 생성 또는 랜덤 샘플링 작업의 결과가 일별로 바뀌도록 하고 싶을 때가 있다. 

방법은 간단하게 일별로 random seed 를 동일하게 맞춰주면 된다. 

특정 날짜 '01/06/2022' 를 integer 형으로 변환하면 일별로 동일한 숫자가 나오도록 구현할 수 있다. 

 

library(tidyverse)
dayYear <- as.Date(Sys.Date(),format='%d/%m/%Y') %>% lubridate::yday() %>% as.integer()
set.seed(dayYear)

sample(nrow(10)) # 같은 날에는 동일한 순서의 숫자 10개가 나온다.

 

주의할점은 값이 정수를 갖도록 as.integer 함수를 통해 변환해주어야한다.

(만약 double 인 경우, 실제 시드는 매번 달라진다. 이는 컴퓨터가 double 형을 메모리에 저장하는 방식 때문일듯하다.)

반응형
반응형

 

아나콘다 설치 이후 프로세스

ㄴ 파이썬 3.8 버전 설치 가정

 

1. python3.8 가상환경 생성

conda create -n py38 python=3.8

 

2. 가상환경 활성화

source activate py38

 

3. ipykernel 설치

pip install ipykernel

 

4. 가상환경을 ipykernel 에 등록

python -m ipykernel install --user --name py38 --display-name py38

 

5. 주피터 노트북 or 주피터랩 실행

conda install jupyter
jupyter lab

반응형
반응형

theme_bw(base_size = 12, base_family = "Kakao Regular") 또는

par("Kakao Regular") 를 적용해도 한글이 나오지 않는 이슈가 발생

library(showtext)
showtext_auto()

위 블록을 통해 해결할 수 있었음

반응형
반응형

Ubuntu 에 Python 새로운 버전 설치하기


sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

필요한 패키지를 받습니다. 


cd /tmp wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz


설치파일을 다운로드 받습니다. 


tar -xf Python-3.7.2.tar.xz cd Python-3.7.2 ./configure --enable-optimizations


설치 파일의 압축을 풀고, 인스톨 준비를 합니다. 


make -j 1
sudo make altinstall

-j 1 은 1 개의 CPU 를 이용해서 build 하겠다는 것입니다.포인트는 sudo make altinstall 을 통해 버전을 따로 관리하는 것입니다. sudo make install 을 하면, 기존 파이썬을 덮어써버리게 되므로 주의해야합니다. 이후, 커맨드 창에 python3.7 을 입력해 잘 설치되었는지 확인합니다. 


특정 버전에 pip 를 통해 패키지 설치하는 법 

예를 들어, beatifulsoup4 패키지를 설치하려면 아래와 같이 합니다. pip 자체가 파이썬 코드이기 때문에 이런식으로 원하는 파이썬 버전을 통해 pip 를 실행시켜주면 됩니다. 

python3.7 -m pip install beautifulsoup4

References
https://websiteforstudents.com/installing-the-latest-python-3-7-on-ubuntu-16-04-18-04/


반응형
반응형


R 에서 한글 파일 쉽게 읽어오는 팁


운영체제 별로 다른 파일 인코딩으로 저장되는 문제로 인해, R 에서 한글이 인코딩 된 파일을 읽어올 때 문제가 자주 생깁니다. 아예 읽어오지 못하는 경우도 있고, 읽어와도 프린트 했을 때, 한글이 깨져 있는 경우가 많은데요. 특히 EUC-KR 로 인코딩 된 파일의 경우, data.table의 fread 나 readr의 read_csv 를 이용하기가 힘듭니다. 


이런 상황에서 readAny 패키지의 read.any 함수를 이용하면 delimeter 로 구분된 text 파일이나, csv 파일 등을 쉽게 읽어올 수 있습니다 (또는 패키지 설치를 하지 않고 함수를 변수로 저장한 다음 사용하셔도 됩니다). 출처는 이곳입니다. readr 패키지의 guess_encoding 함수를 이용해 파일 인코딩을 알아낸 후, 이 정보를 이용해 read.table 로 읽어오는 방식입니다. 그리고 확장자에 맞게 delimter 를 지정하는 로직까지 있습니다. 

library(devtools)

install_github("plgrmr/readAny", force = TRUE)
library(readAny)

read.any("http://philogrammer.com/melon10_euc.csv", header = TRUE)

library(readr) read.any <- function(text, sep = "", ...) { encoding <- as.character(guess_encoding(text)[1,1]) setting <- as.character(tools::file_ext(text)) if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom" separate <- list(csv = ",", txt = "\n", custom = sep) result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, ...) return(result) }

philogrammer 님의 방법에 추가적으로, 한 함수를 통해 엑셀 파일까지 읽어오기 위해 아래와 같이 변형해서 사용하였습니다. 

read_any <- function(text, sep = "", ...) {
  encoding <- as.character(guess_encoding(text)[1,1])
  setting <- as.character(tools::file_ext(text))
  
  if(setting == 'xlsx'){
      result <- read_excel(text)
  }
  else {
      if(sep != "" | !(setting  %in% c("csv", "txt")) ) setting <- "custom"
      separate <- list(csv = ",", txt = "\n", custom = sep)
      result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, ...)
  }
  return(result)
}

참고자료

http://philogrammer.com/2017-03-15/encoding/

반응형
반응형




Cookiecutter 패키지는 프로젝트 템플릿을 쉽게 생성해주는 파이썬 패키지입니다. 1) 자신이 만든 템플릿을 저장해서 reproducible 하게 사용할 수 있고, 2) 이미 만들어져 있는 템플릿을 불러와서 거기서부터 새로 프로젝트를 생성할 수 있습니다. 특히, cookiecutter-pypackage/ 를 많이 사용하는듯합니다. 이 템플릿은 PyPI 등록을 위한 파이썬 패키지를 위한 템플릿을 제공합니다. 기본적인 PyPI 등록을 위한 패키지 구조와 기본 파일 (setup.py 등), nox, tox, Click, travis 등과 같은 파이썬 패키지 관련 코드를 담은 파일이 탑재되어 있기 때문에 패키지 개발의 start point 로서 유용하고 실제로 많이 사용하고 있는 패키지입니다. 


homepage

https://cookiecutter.readthedocs.io


tutorial

https://cookiecutter.readthedocs.io/en/latest/tutorial1.html

https://cookiecutter-pypackage.readthedocs.io/en/latest/tutorial.html

반응형
반응형


다른 컴퓨터로 conda 가상환경 옮기는 방법


참고

conda-cheatsheet.pdf


기존에 사용하던 컴퓨터 A 에서 컴퓨터 B 로 conda 가상환경을 옮겨야할 때가 있다. 


컴퓨터 A 에서 해야할 일 


1. 가상환경 켜기


source activate [이름]


2. 가상환경이 켜진 상태에서 아래 명령어로 dependency 를 export 할수 있다.


conda env export > environment.yaml

environment.yaml 파일을 열어보면 아래와 같이 잘 export 되었다는 것을 확인할 수 있다. 



3. 현재 환경의 python 버전 체크


현재 사용하고 있는 가상환경에서 사용하고 있는 python version 을 체크한다. 


python --version
Python 3.6.6


컴퓨터 B 에서 해야할 일 


Requirements! 

  • 컴퓨터 B 에서는 컴퓨터 A 에서와 같은 anaconda (python 2 또는 python3) 를 사용해야한다. 만약 anaconda 버전이 하위버전이면 잘 안돌아갈 수도 있을듯 하다. 

4. 가상환경 생성 


conda create --name [이름] python=3.6


5. prefix 변경


environment.yaml 을 열고 원하는 경우, 가상 환경의 이름을 바꾸고, prefix 를 경로에 맞게 바꾸어준다. 예를 들어, 


prefix: C:\Users\[사용자이름] \Anaconda3\envs\[가상환경이름]


5. yaml 파일을 통한 가상환경 생성 


conda env create --file environment.yaml


이 때, 


Solving environment: failed

ResolvePackageNotFound:


에러가 뜰 수 있다. 이것은 A 컴퓨터에서 설치된 라이브러리가 B 컴퓨터에서 설치가 불가능한 것인데, 컴퓨터의 운영체제가 다른 경우에 발생하는 것으로 보인다. 해결 방법은 수동으로 ResoevePackageNotFound 에서 출력된 리스트를 environment.yaml 파일에서 지운 후, 다시 시도하면 된다. (참고)



6. 주피터를 사용하는 경우, 커널에 가상환경 등록


source activate myenv python -m ipykernel install --user --name myenv --display-name "Python (myenv)"


반응형
반응형


Jupyter 유용한 확장기능 - lab_black


설치


pip install nb_black


사용법


notebook 사용자의 경우, 첫번째 셀에 아래 코드 실행 


%load_ext nb_black


lab 사용자의 경우, 첫번째 셀에 아래 코드 실행 


%load_ext lab_black


이후 코드를 실행하면, 자동으로 black format 으로 포매팅이 되는 것을 볼 수 있다. 따로 command 를 이용해서 formatting 을 하지 않아도 실행하는 즉시 formatting 이 되기 때문에 매우 유용하다!


링크 

https://github.com/dnanhkhoa/nb_black?source=your_stories_page

반응형
반응형

Early Stopping 이란 무엇인가? 


딥러닝을 비롯한 머신러닝 모델의 한 가지 중요한 딜레마는 다음과 같다. 


너무 많은 Epoch 은 overfitting 을 일으킨다. 하지만 너무 적은 Epoch 은 underfitting 을 일으킨다. 


이런 상황에서 Epoch 을 어떻게 설정해야하는가? 

Epoch 을 정하는데 많이 사용되는 Early stopping 은 무조건 Epoch 을 많이 돌린 후, 특정 시점에서 멈추는 것이다. 


그 특정시점을 어떻게 정하느냐가 Early stopping 의 핵심이라고 할 수 있다. 일반적으로 hold-out validation set 에서의 성능이 더이상 증가하지 않을 때 학습을 중지시키게 된다. 본 포스팅에서는 Keras 를 이용하여 Early stopping 을 구현하는 법과 성능이 더 이상 증가하지 않는다는 것은 어떤 기준으로 정하는 것인지를 중점으로 정리해보고자 한다.  


Early Stopping in Keras


Keras 의 Early stopping 을 구현하는 Early stopping 함수를 통해 구현할 수 있다. 


from keras.callbacks import EarlyStopping


Earlystopping 클래스의 구성 요소

  • Performance measure: 어떤 성능을 monitoring 할 것인가?
  • Trigger: 언제 training 을 멈출 것인가?

Earlystopping 객체는 초기화될 때 두개의 요소를 정의하게 된다. 


아래와 같이 지정하면 validation set 의 loss 를 monitoring 한다는 뜻이다. 


es = EarlyStopping(monitor='val_loss')


만약 performance measure가 최소화 시켜야하는 것이면 mode를 min 으로, 최대화 시켜야하는 것이면 mode를 max로 지정한다. loss 의 경우, 최소화 시키는 방향으로 training 이 진행되므로 min 을 지정한다. 


es = EarlyStopping(monitor='val_loss', mode='min')


mode 의 default 는 auto 인데, 이는 keras 에서 알아서 min, max 를 선택하게 된다. 여기까지가 가장 기본적인 Early stopping 의 사용법이다. performance measure를 정의하고, 이것을 최대화 할지, 최소화 할지를 지정하는 것이다. 그러면 keras 에서 알아서 적절한 epoch 에서 training 을 멈춘다. verbose=1 로 지정하면, 언제 keras 에서 training 을 멈추었는지를 화면에 출력할 수 있다. 


성능이 증가하지 않는다고, 그 순간 바로 멈추는 것은 효과적이지않을 수 있다. patience 는 성능이 증가하지 않는 epoch 을 몇 번이나 허용할 것인가를 정의한다. partience 는 다소 주관적인 기준이다. 사용한 데이터와 모델의 설계에 따라 최적의 값이 바뀔 수 있다. 


es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)


만약 performance measure 를 practical 하게 설정한 경우 성능의 증가의 기준을 직접 정의할 수 있다. 예를 들어 아래 코드는 validation accuracy 가 1% 증가하지 않는 경우, 성능의 증가가 없다고 정의한다. 


특정값에 도달했을 때, 더 이상 training 이 필요하지 않은 경우가 있다. 이 경우 baseline 파라미터를 통해 정의할 수 있다. 


es = EarlyStopping(monitor='val_loss', mode='min', baseline=0.4)


최종적으로 mode.fit 함수의 callback 으로 early stopping 객체를 넣어주면 early stopping 을 적용할 수 있다. 


hist = model.fit(train_x, train_y, nb_epoch=10,  

                 batch_size=10, verbose=2, validation_split=0.2,   

                 callbacks=[early_stopping])  


Model Choice


Early stopping 객체에 의해 트레이닝이 중지되었을 때, 그 상태는 이전 모델에 비해 일반적으로 validation error 가 높은 상태일 것이다. 따라서, Earlystopping 을 하는 것은 특정 시점에 모델의 트레이닝을 멈춤으로써, 모델의 validation error 가 더 이상 낮아지지 않도록 조절할 수는 있겠지만, 중지된 상태가 최고의 모델은 아닐 것이다. 따라서 가장 validation performance 가 좋은 모델을 저장하는 것이 필요한데, keras 에서는 이를 위해 ModelCheckpoint 라고 하는 객체를 존재한다. 이 객체는 validation error 를 모니터링하면서, 이전 epoch 에 비해 validation performance 가 좋은 경우, 무조건 이 때의 parameter 들을 저장한다. 이를 통해 트레이닝이 중지되었을 때, 가장 validation performance 가 높았던 모델을 반환할 수 있다. 


from keras.callbacks import ModelCheckpoint


mc = ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)


위 ModelCheckpoint instance를 callbacks 파라미터에 넣어줌으로써, 가장 validation performance 가 좋았던 모델을 저장할 수 있게된다.


hist = model.fit(train_x, train_y, nb_epoch=10,  

                 batch_size=10, verbose=2, validation_split=0.2,   

                 callbacks=[early_stopping, mc])  

참고

https://machinelearningmastery.com/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/

https://machinelearningmastery.com/early-stopping-to-avoid-overtraining-neural-network-models/

반응형