Data Traveler
Tantum videmus quantum scimus

2022-01-31

Author: 98hyun

Published: 2022-02-01

Tags: 마케팅 개발 딥러닝 개발환경

Share :


  마케팅 KPI

검색광고마케터를 공부하며 배웠던 kpi를 공유한다. 계산 문제는 천천히 영어는 외워서 느낌으로.

KPI


CPS = 총광고비 / 구매건수 => 하나 파는데 드는 광고비용. ( CPA, CPI, CPC 등 같은 뜻)
ROI = 광고수익 / 광고비 * 100
ROAS = 광고매출 / 광고비 * 100 ( ROAS * CPS = 객단가 )
CVR = 전환율 
CTR = 클릭수 / 노출수 * 100 
최대허용 CPC = 객단가 * 이익률 * 전환율


  django

개인 프로젝트로 응급실 빈 병상을 미리 데이터베이스화하여 현재위치에 따라 가장 가까운 응급실을 알려주는 웹 어플리케이션을 django로 만드는 작업을 하던 도중 개발환경설정이 중요해서 글로 남긴다. 코드 위주로 설명을 한다.

django는 웹 개발 프레임워크로 모든 기능을 제공한다. 모든 기능에는 대충 프론트하는데 백 다루는데 정해진 규칙만 지키면 쉽게 다른 언어와 호환이 된다는 얘기다. 다음코드는 개발환경 세팅이다.

code


0. virtualenv {venv:가상환경 이름} -> cd venv/scripts -> activate.bat -> (after change env) pip install django
1. django-admin startproject {projName} -> cd {projName}
2. (in projName forder) python manage.py runserver -> start
3. python manage.py startapp {appName} -> create urls.py and make views.py -> edit projName urls.py using 'include' -> settings.py(templates,installed_apps)


  GA

GAIQ 자격증은 구글에서 공부 후 오픈북으로도 풀기 때문에 쉽게 딸 수 있다.

이 사이트는 문제가 다 있고, 공부할 수 있는 좋은 사이트다.


  DNN

카테고리 임베딩 nn

dacon에서 잡케어 추천알고리즘 경진대회에서 상위 17%의 성적으로 아쉽게 메달권은 밖이지만, 좋은 결과를 얻었다고 생각한다. 개인적으로 부스트 알고리즘과 앙상블을 했더라면 하는 아쉬움도 있다. 사용 알고리즘은 카테고리 임베딩 NN 방법이고, 아래 코드는 kaggle에서 영감을 받았던 코드다. 이 알고리즘을 선택한 이유는 모두 카테고리 변수여서 그렇고. 경험적으로 DNN이 잘먹혔다. 실제로 알고리즘으로 인한 결과또한 private leader board에서 public leader board와의 점수차가 없었다. 안정했다는 뜻이다.

same old entity embeddings라는 제목의 카테고리 인코딩 방법은 그랜드마스터 thakur가 keras 를 통해 구현한 방법이다.

code


def create_model(data, catcols):    
    inputs = []
    outputs = []
    for c in catcols:
        ## categorical columns를 하나씩 긁어와서 종류를 unique value에 담는다.
        num_unique_values = int(data[c].nunique())
        ## 만약 그 종류가 50개를 넘기면 50개로 하고, 아니면 나누기 2해서 올림으로 처리한다.
        embed_dim = int(min(np.ceil((num_unique_values)/2), 50))
        ## input의 의미는 tabular에서 열 하나하나를 넣으려는거다. 그래서 shape를 한줄 즉, 예를 들어, 첫번째 열이 35개 종류의 카테고리 열이라서 (1,) 다음 열도 (1,) 종류에 상관없이 한줄의 array가 input으로 가게 된다. 
        inp = layers.Input(shape=(1,))
        ## 0부터치기 때문에 +1 하고, 아까정한 embed_dim으로 임베딩한다. 
        out = layers.Embedding(num_unique_values + 1, embed_dim, name=c)(inp)
        ## spatialDropout1D의 의미가 헷갈렸는데 stackoverflow에서 이해한 바를 써보면 기존 dropout과 차이점은 독립적으로 어떤 input의 element를 0으로 두는 것이 아닌 한 채널 즉, 우리가 말하는 (2,2,4)에서 axis=1 (2,0,4) 로 모든 축을 0 으로 만드는 방법이라고 한다. 이게 좋은 이유는 채널들간의 독립성을 유지해주기 위함이라고 한다. 
        out = layers.SpatialDropout1D(0.3)(out)
        out = layers.Reshape(target_shape=(embed_dim, ))(out)
        inputs.append(inp)
        outputs.append(out)

    ## 그리고 여기서 합친다. 각각의 열이 4개의 종류, 50개의 종류 등 여러가지를 합친후
    x = layers.Concatenate()(outputs)
    ## batch 정규화돌리고 - 여기서 batch는 세로, layer정규화는 가가라고 기억하면 쉽다.
    ## 어렵게 말하면 batch는 특성단위 정규화, layer는 샘플단위 정규화.
    x = layers.BatchNormalization()(x)

    x = layers.Dense(300, activation="relu")(x)
    x = layers.Dropout(0.3)(x)
    x = layers.BatchNormalization()(x)

    x = layers.Dense(300, activation="relu")(x)
    x = layers.Dropout(0.3)(x)
    x = layers.BatchNormalization()(x)

    ## 그리고 softmax 뿌려주기
    y = layers.Dense(2, activation="softmax")(x)

    model = Model(inputs=inputs, outputs=y)
    return model


  image regression with fastai

전기뱀장어 이미지들을 통해서 평균중량을 예측하는 문제를 제공하고 있다. 본인은 머신러닝 모델은 "When Less is More"이 중요하다고 생각한다. 가볍게 만들면서 최대효율을 뽑는게 멋있다고 생각하기 때문이다. 이번 문제를 위해 deeplearn.org를 찾아가서 최신 기술을 눈여겨 보고 관련 대회를 찾아서 사람들의 코드를 분석하며 빌려왔다. 그리고 Swin transformer 기술을 구현하여 image regression을 하는 코드를 빌려와서 mae 3.82로 며칠 1위를 하고 있었다. ( 다시뺏겼지만 ) 그리고 아래는 fastai를 통해 구현한 플로우를 설명하고자 한다.

우선, 이해한 바로는 swin transformer는 object detection 관련 논문이다. 구역을 나누는 것이 중요하다. text에 사용되는 transformer와 같은 transformer 용어다. 그리고 patch를 처음 아주작게부터 시작해 크게 병합하는 과정을 계층적으로 진행한다. 그래서 작은 객체부터 큰객체까지 잘 검출할 수 있다는 것이 논문 주장이다. 그리고 patch를 경험적으로 합치고 학습을 진행할 때, window(patch를 합친)는 padding을 추가하지 않고 넘어간 경우는 다시 옆에 붙여서진행하는것 같다. (이부분이 어려워서 위 링크를 참고할 것.) 또한 계산량의 이점이 있다고 한다.

아래는 fastai로 구현한 코드다. 2021년 늦게 나온 논문같은데 벌써 구현 코드가 있다. 신기하다. 구현코드는 이 링크를 통해 자세히 볼 수 있다.

code


# fastai를 통해서 각각은 resize를 통해 224x224로, 계산의 복잡도를 낮추기 위해서
# batch transforms에는 세개의 basic transform을 적용한다.
dls = ImageDataLoaders.from_df(train_df, #pass in train DataFrame
                               path='/content/dataset',
                               valid_pct=0.2, #80-20 train-validation random split
                               seed=999, #seed
                               fn_col='path', #filename/path is in the second column of the DataFrame
                               label_col='norm_AvgWeight', #label is in the first column of the DataFrame
                               y_block=RegressionBlock, #The type of target
                               bs=8, #pass in batch size
                               num_workers=8,
                               item_tfms=Resize(224), #pass in item_tfms
                               batch_tfms=setup_aug_tfms([Dihedral(),Zoom(),Warp()])) #pass in batch_tfms

# Swin Transformer 모델을 기본으로 훈련한다. 그에 필요한 파일을 load한다. 
model = create_model('swin_large_patch4_window7_224', pretrained=True, num_classes=dls.c)

# metric은 120을 곱한 mae로 한다. 
def eel_mae(input,target):
    return 120*(F.l1_loss(F.sigmoid(input.flatten()), target))

# 분류문제로 치환한다.
# AccumMetric은 메트릭을 계산하기 위해 유효성 검사에서 모든 배치의 누적 예측값을 사용한다.
learn = Learner(dls, model, loss_func=BCEWithLogitsLossFlat(), metrics=AccumMetric(eel_mae))


  Colab Template

aifactory에서 전기뱀장어 이미지를 통한 중량 예측 대회를 진행하고 있다. 이미지데이터는 항상 용량이 크기 때문에 코랩에서 기본으로 주는 용량으로 안될 때도 있고, 다운받아서 다시 올리는것도 일이되고 그렇다.

그런데, 만약 드라이브 링크로 데이터를 제공한다면 본인 드라이브에서 바로가기추가를 하면 드라이브에서 엑세스가 가능하다. 아래는 드라이브에서 편하게 엑세스할 수 있는 api 코드들을 제공한다.

code


## 엑세스
from google.colab import drive
drive.mount('/content/drive/')

## zipfile 압축해제 
import zipfile

zip_ref = zipfile.ZipFile("/content/drive/MyDrive/colab/dataset.zip", 'r')
zip_ref.extractall("/content")
zip_ref.close()

## 번외 - 개발중 오래켜두기 위한 

function ClickConnect(){
    console.log("코랩 연결 끊김 방지");
    document.querySelector("colab-toolbar-button#connect").click()
}
setInterval(ClickConnect, 60 * 1000)

## submit 파일 접근
from google.colab import files
files.download('submission04.csv')


  Flutter

side project로 flutter led project를 진행했다.

주문에 소극적인 사람들을 위해, 그리고 연예인을 응원하고 싶은 사람들을 위해 만들었다. 친구들한테 보여줬을 때 즐거워했고 본인또한 처음만드는 어플리케이션을 처음사용하는 flutter 스택을 이용하여 개발했고, 라이브러리를 찾으며 밤낮으로 몰두하며 만들었다. 코드는 github에 있다.

code


## open
open -a simulator

## develop
flutter create {app name}
flutter run -> press R in order to reload hot

## after connecting iphone
flutte run -d {device name} --release


Contact Form