Hong의 모든 글

Go언어 cron 처럼 스케줄링 하기

cron과 같은 유형의 스케줄러는 데이터 처리를 할 때 반드시 필요합니다.

데이터과학자들은 주로 젠킨스(Jenkins)나 airflow를 사용하겠지만 Python이나 Go로 직접 작성해야 하는 경우도 종종 생깁니다.

패키지 “github.com/jasonlvhit/gocron” 를 사용하는 방법입니다.

package main

import (
	"fmt"
	"github.com/jasonlvhit/gocron"
	"time"
)

func task() {
	fmt.Println("태스크를 실행합니다.")
}

func taskWithParams(a int, b string) {
	fmt.Println(a, b)
}

func main() {
	// 파라미터 없이 잡을 실행
	gocron.Every(2).Seconds().Do(task)
	gocron.Every(1).Minute().Do(task)
	gocron.Every(2).Minutes().Do(task)
	gocron.Every(1).Hour().Do(task)
	gocron.Every(2).Hours().Do(task)
	gocron.Every(1).Day().Do(task)
	gocron.Every(2).Days().Do(task)
	gocron.Every(1).Week().Do(task)
	gocron.Every(2).Weeks().Do(task)

	// 파라미터를 지정해서 잡을 실행
	gocron.Every(1).Second().Do(taskWithParams, 1, "hello")

	// 지정한 요일에 잡을 실행
	gocron.Every(1).Monday().Do(task)
	gocron.Every(1).Thursday().Do(task)

	// 지정한 시각에 잡을 실행 - 'hour:min:sec' - seconds optional
	gocron.Every(1).Day().At("10:30").Do(task)
	gocron.Every(1).Monday().At("18:30").Do(task)
	gocron.Every(1).Tuesday().At("18:30:59").Do(task)

	// Begin job immediately upon start
	gocron.Every(1).Hour().From(gocron.NextTick()).Do(task)

	// Begin job at a specific date/time
	t := time.Date(2019, time.November, 10, 15, 0, 0, 0, time.Local)
	gocron.Every(1).Hour().From(&t).Do(task)

	// NextRun은 다음번 실행될 시간을 알려줌
	_, time := gocron.NextRun()
	fmt.Println(time)

	// 지정한 태스크 제거
	gocron.Remove(task)

	// 모든 스케줄 작업을 제거
	gocron.Clear()

	// 모든 펜딩잡을 시작
	<-gocron.Start()

	// 새 스케줄러를 생성해서 동시에 2개의 스케줄러를 실행
	s := gocron.NewScheduler()
	s.Every(3).Seconds().Do(task)
	<-s.Start()
}

sudo에서 http_proxy 환경변수 적용받기su

일반 계정에서 http_proxy 환경변수를 설정해서 작업을 하다가 sudo를 사용해서 root 권한을 사용할 때 http_proxy 설정이 적용되지 않아 힘들때가 있습니다.

sudo visudo를 하거나 sudo vim /etc/sudoers을 해서 sudoers 파일에 다음의 줄을 추가해 주면 됩니다.

http_proxy 뿐만 아니라 다른 환경변수도 동일한 방법으로 넘겨주는 것이 가능합니다.

Defaults  env_keep +="http_proxy"
Defaults  env_keep +="https_proxy"
Defaults  env_keep +="HTTP_PROXY"
Defaults  env_keep +="HTTPS_PROXY"

혼동행렬 Confusion Matrix

기계학습 모델 평가지표

기계학습으로 생성한 분류 모델, 예측 모델에서 빠지지 않고 나오는 혼동 행렬 (confusion matrix) 입니다.

이름이 혼동행렬(Confusion matrix)인 이유?

기계가 얼마나 참과 거짓을 혼동하는지 확인하는데 사용하는 표이기 때문입니다.

간단하죠.

5개의 주요 성능 지표

혼동행렬에서는 특이도, 정확도, 민감도, 정밀도, 재현율 다섯개의 값은 외워야 합니다.

이중에서 가장 많이 쓰는 것은 정밀도(precision)재현율(recall)입니다.

기계학습 모델의 성능을 한 지표로만 설명하라고 할 때 쓰는 것은 정확도(Accuracy)와 혼동행렬에는 없지만 F1-measure (F1 값)이 있습니다.

F1값은 정밀도화 재현율의 조화평균입니다.

AUROC와 Precision-Recall 그래프

여기서 특이도와 민감도는 ROC 및 AUC 를 계산할 때 쓰고

정밀도와 재현율은 AP 와 Precision-Recall 그래프를 계산할 때 씁니다.

혼동행렬 confusion matrix

아래는 혼동행렬(Confusion Matrix)입니다. 표가 좀 안 이쁘지만 힘들게 그렸으니 알아서 잘 봐주세요.

예측값 Forecast
참 TRUE거짓 FALSE
실제값 Actual참 TRUETP (True Positive)FN (False Negative)
거짓 FALSE FP (False Positive)TN (True Negative)

지표 설명 및 계산법

각 지표값의 정의적 설명과 계산법입니다.

민감도 (Sensitivity)(TP / (TP + FN)) 양성 중 맞춘 양성의 수
특이도 (Specificity)(TN / (FP + TN)) 음성 중 맞춘 음성의 수
정밀도 (Precision)(TP / (TP + FP)) 양성이라고 판정 한 것 중에 실제 양성 수
재현율 (Recall)(TP / (TP + FN)) 전체 양성 수에서 검출 양성 수
정확도 (accuracy)((TP + TN) / (TP + FN + FP + TN)) 전체 개수 중에서 양성과 음성을 맞춘 수

풀어쓴 설명

민감도: 기계가 양성. 즉, positive를 얼마나 잘 꺼내서 맞췄는가를 봅니다.

특이도: 기계가 음성. 즉, Negative인 것을 양성이 아니라고 했는지를 봅니다.

민감도와 특이도는 보통 질병이나 의료에서 많이 쓰는 평가 지표입니다.

정밀도: 기계가 참이라고 했는데 실제 참인 것의 비율입니다. 기계가 얼마나 참을 순도 높게 찍어 내는지 보는 것입니다. 많이 맞추고 아니고는 별로 의미가 없이 기계가 참이라고 한 것 중에 참을 본 것이기 때문에 민감도와 헷갈리면 안됩니다.

재현율: 전체의 실제 참들 중에서 얼마나 기계가 참이라고 골라낸 비율입니다.

정확도: 전체 개수 중에서 기계가 실제 참을 참이라고 하고 실제 거짓을 거짓이라고 한 비율입니다.

습득 요령

처음에 보면 무척 헷갈리는데 외우는 것 보다는 이름과 계산법을 잘 기억하고 의미와 용도를 기억하는 것이 좋습니다. 기억이 안나면 그때 그때 찾아봐도 되지만 매우 빈번하게 쓰이는 것이므로 데이터과학을 공부한다면 그냥 암기해버리는 것이 효율적입니다.

Go언어 csv.gz 한줄씩 읽어오기

Go언어로 CSV파일을 한줄씩 읽어오는 방법입니다.

파일을 메모리에 올려서 한 번에 처리하면 파일이 큰 경우에는 메모리를 다 쓰기 때문에 스왑을 사용해서 문제를 만듭니다.

조금 느리더라도 파일은 1줄씩 읽거나 조금씩 읽어야 합니다.

// csv.gz 파일에서 데이터를 한 줄씩 읽어오는 방법
package main

import (
	"compress/gzip"
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
)

func main() {
	file, err := os.Open("product_titles.csv.gz")

	if err != nil {
		log.Fatal(err)
	}

	defer file.Close()

	gzipReader, err := gzip.NewReader(file)

	if err != nil {
		log.Fatal(err)
	}

	defer gzipReader.Close()

	csvReader := csv.NewReader(gzipReader)
	csvReader.Comma = '\t'
	csvReader.FieldsPerRecord = -1

	for {
		record, err := csvReader.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}

		// 첫번째 필드만 꺼내오기
		fmt.Println("record count:", len(record))
		if len(record) < 1 {
			log.Println("record is empty")
			continue
		}
		field1 := strings.Trim(record[0], " ")
		if len(field1) < 1 {
			log.Println("field1 is empty")
			continue
		}

		fmt.Println("field1:", field1)
	}
}

Nvidia의 각종 AI 데모 사이트 – Nvidia AI demo site

Nvidia의 AI 데모를 볼 수 있는 사이트입니다.

굉장히 재밌는 것들이 많습니다.

사이트주소: https://www.nvidia.com/en-us/research/ai-demos/

NVIDIA GAUGAN2

텍스트를 입력받아서 사진을 생성해줍니다.

단순한 그래픽이 아닌 실사와 다름없는 사실상 실사인 사진를 생성해줍니다.

NVIDIA AI Playground GAUGAN2

LYRICSTUDIO

노래의 가사를 만들어줍니다.

몇개의 단어와 노래를 입력받아 쓸만한 가사를 만들어줍니다.

LyricStudio

NVIDIA VID2VID CAMEO

2D사진을 넣으면 3D 동영상으로 가상의 아바타를 만들어줍니다.

NVIDIA Vid2Vid Cameo

NVIDIA IMAGE INPAINTING

이미지를 강화합니다. 이미지에서 피사체 중 하나를 지우거나 배경을 지울 수 있습니다.

이미지 강화는 여러 용도로 이용할 수 있습니다. 특히 상업용으로 사진을 사용하기 위해서 사진에서 상표나 인물 보기 싫은 대상체를 제거할 수 있습니다.

Image Inpainting

NVIDIA GANIMAL

애완동물의 표정을 다른 동물에게 입힙니다.

재미삼아 만든 것으로 보입니다만 어떤 용도로 쓸 수 있을지 고민을 해봐야 겠습니다.

NVIDIA AI Playground Ganimal

NVIDIA GAMEGAN

스스로 게임하는 인공지능을 만듭니다.

강화학습이라고 부르는 이 인공지능으로 유명한 것은 알파고가 있습니다.

NVIDIA AI Playground GameGAN