Sunday, March 29, 2020

(Zoom) Skype과 비교해보자!

지난 post에서는 Zoom만의 특징에 대해서 알아보았습니다.

그런데, Zoom과 비슷한 프로그램으로 Skype이 존재합니다. 그러면 Skype와 Zoom을 비교해보아 어떤게 더 좋을지 한번 생각해서 더 좋은 것을 택하는게 제일 합리적이겠죠? 그래서 이번 post에서는 Zoom과 아주 비슷한 Skype과 네 가지 측면에서 비교를 해 볼 예정입니다.

첫 번째로 비교해 볼 측면은 이용자 측면에서 한번 해보도록 하겠습니다. 
일단, Google Play Store에서 2020년 3월 30일을 기준으로 비교해보자면 각각 이렇습니다.

 그리고 Capterra에서 2020년 3월 30일 기준으로 비교해보자면 각각 이렇습니다.
  • Zoom:
    • 평점: 4.6/5 (전체: 4168명)
    • 편의성: 4.5/5
      • "The biggest thing with video conferencing tools is the quality and ease to use and Zoom is at the top of both of those in our eyes. We highly recommend Zoom for our video conferencing tool."
  • Skype:
    • 평점: 4.3/5 (전체: 9805명)
    • 편의성: 4.4/5
      • "It is very straightforward forward and easy to use. Not only is the instant messaging feature wonderful, but the ability to have group meetings and presentations is great."
 마지막으로 저도 둘 다 사용해보았으므로 첨언을 하자면 아래와 같습니다.
  • Zoom: 
    • 여러 유저가 카메라를 키고 수업을 들었을 때에 비교적 다 같이 보기가 편한점이 아주 좋았습니다. 특히나 UI가 발표자의 얼굴만 보던가, 여러명을 한 번에 보던가, 유저들의 얼굴들을 bar에서 몇 명씩만 볼 수 있도록 지원한다는 점이 진짜 좋았습니다.
    • Screen-sharing 시에 특정 창만 지정해서 screen을 공유할 수 있다는 점이 저도 좋았습니다. 불필요한 창들까지 share할 필요가 없어서 발표시에 미리 창들을 준비할 필요가 없고 남의 사생활을 볼 가능성이 줄어들어 좋았습니다.
  • Skype:
    • 카메라에서 얼굴 부분만 제외하고 나머지 부분을 blur 처리를 지원해주는게 전 좋았습니다.
    • 굳이 Premium을 안 사더라도 시간 제약이 없다는 점에서도 좋은 것 같습니다.
    • Zoom에 비교하면 압도적으로 유저들이 많다는 점도 장점이 되겠습니다.
두 번째로는 UI 측면에서 살펴보도록 하겠습니다.
  • Zoom
    • 시작화면



    • 화상통화 화면
  • Skype

    • 시작화면 (Messenger) 
    • 화상통화 화면
세 번째로는 개발자 측면에서 이를 살펴보도록 하겠습니다.
Capterra에 나와있는 정보와 제 경험을 같이 참고해서 주요 기능적인 면들은 아래와 같습니다. (Capterra에 나와있는건 생각보다 outdated 되었더라구요...)

  • Zoom
    • Annotations / Drawing Tools
    • Desktop / Browser Sharing
    • Mobile Screen Sharing
    • Screen Recording
    • Targeted / Locked Screen Sharing
    • Messenger
  • Skype
    • Desktop / Browser Sharing
    • Screen Recording
    • Targeted Face Camera
    • Messenger
그리고 두 프로그램이 설치될 수 있는 platform을 비교하자면 전부 다 아래에 platform에 설치가 가능합니다.
  • Windows
  • Mac
  • Cloud
  • IOS
  • Android
  • Linux // Zoom 같은 경우는 command-line을 사용해야합니다.

마지막으로, 경영자 측면으로 비교해보겠습니다.
  • Premium과 관련된 가격은 따로 찾을 수가 없었습니다.
  • 다만, 국제전화 요금 대신에 credit을 충전해서 사용하는 방법으로 credit을 구매할 수 있습니다.

Zoom 같은 경우는... (출처: https://zoom.us/pricing)
  • 무료로도 사용할 수 있지만 Premium 혜택이 존재합니다.
    • 각각 등급마다 가능한 feature들의 범위가 다릅니다.
    • 혜택들은 아래와 같습니다.
유저 사용량 측면에서는 위에 Google Play Store의 기록에 따르면 Skype가 훨씬 더 많다고 합니다.

자 그러면 오늘 여러 방면으로 Skype과 Zoom을 비교했는데 이걸로 마치도록 하겠습니다!

(Zoom) Zoom의 특징은?

지난 post에 Zoom을 설명하게된 계기를 알려드렸는데요, 이번에는 본격적으로 Zoom의 특징에 대해서 설명드리도록 하겠습니다.

Zoom은 온라인 화상 프로그램으로 온라인 통화나 회의를 할때에 주로 사용하는데요, 여러명과 동시에 통화할 수 있고, Screen-share 및 여러가지 기능 등을 지원합니다.

대략 제가 지금까지 사용해 본 경험으로 있는 특징들은...

  1. Screen-sharing 기능: 특정 창에서만 screen-sharing할 수 있는 기능이 있습니다.
  2. 캠 및 마이크 사용 설정 기능: 회의 중간에 필요하면 마이크를 끄고 킬 수가 있습니다.
  3. 기록 기능: 호스트가 현재 회의를 녹화해서 기록할 수가 있습니다.
  4. 채팅 기능: 마이크를 사용할 수 없을때에 채팅으로 전체에게 메세지를 보낼수도 있고 특정 유저와 만 메세지를 주고받고 할 수 있습니다.
이외에도 반응 및 손들기 기능, 유저 초대 기능 등등 여러가지 기능들이 많습니다.

그리고 이번 코로나 사태를 위해서 Zoom은 이러한 면으로 사용될 수 있다고 합니다.
  1. 원격 근무용: 개별 직원과 팀이 안전하고 성공적으로 원격 근무 환경으로 전환하도록 도와줌.
  2. 교육용: 교사와 관리자, 학생들이 Zoom을 통해 모여 온라인 수업을 실행하도록 도와줌.
  3. 가상 이벤트용: 대면 이벤트를 가상으로 전환 가능하도록 도와줌.
  4. 원격 의료용: 의사와 전문의, 기타 의료진이 Zoom을 이용해 원격으로 환자를 진단 및 치료할 수 있도록 도와줌.
이상입니다!

(Zoom) 이 주제를 고른 이유

이번 포스트에서는 Zoom에 대해서 설명하게된 계기를 알려드리려고 합니다.

이번 2019년부터 시작한 코로나19 사태가 COVID-19가 팬더믹으로 지정될만큼 너무 심각한 가운데 대학교들은 오프라인 개강을 할 수 없는 상황에 이르렀습니다. 그래서 전 세계적으로 대학교들이 개강하고 몇 주동안은 온라인으로 수업을 진행하게 되었는데요, 온라인 수업에 사용하는 플랫폼 여러개가 그러면서 등장했습니다.

제가 다니는 대학교 같은 경우는 LMS, Zoom을 주로 사용합니다. LMS는 교수님이 영상을 올리고 이를 학생들이 보는 형식이고, Zoom은 실시간으로 온라인 수업에 사용합니다. 그런데, 저 같은 경우는 Zoom을 이번 사태 전에 들어보지도 못 했어서 궁금증이 생기더라구요. 그래서 이번에 Zoom에 대해서 한 번 알아보도록 하겠습니다.

Monday, March 9, 2020

(PyCox) 세 번째, 활용 및 후기

안녕하세요?
이번에는 활용방법 및 후기를 작성해보도록 하겠습니다.

일단 활용방법은 모델들마다 조금씩 차이는 있습니다. 그렇지만 지금은 Cox-PH (DeepSurv)를 기준으로 설명드리겠습니다.
(참고: https://nbviewer.jupyter.org/github/havakv/pycox/blob/master/examples/cox-ph.ipynb)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn_pandas import DataFrameMapper

import torch
import torchtuples as tt

from pycox.datasets import metabric
from pycox.models import CoxPH
from pycox.evaluation import EvalSurv
대략 이 예시에서 사용된 것들입니다. 이를 참고하면 좋을 것 같습니다.

df_train = metabric.read_df()
df_test = df_train.sample(frac=0.2)
df_train = df_train.drop(df_test.index)
df_val = df_train.sample(frac=0.2)
df_train = df_train.drop(df_val.index)
예시 데이터로 METABRIC dataset을 사용했다고 합니다.
데이터 셋중에서 20%는 Test dataset으로, 16%는 Validation dataset으로 (80%의 20%이므로!) 그리고 나머지 64%는 Train dataset으로 사용했군요.


Dataset은 다음과 같이 생겼습니다.
x0~x8이 input으로 들어가고 duration 및 event가 label들에 해당한다고 보시면 아주 편하겠죠?
물론 정확한 설명은 아니지만 저는 survival dataset을 이미 안다는 전제하에 이를 설명하는 것입니다.

정확히 이해하시고 싶으시다면, DeepSurv논문을 한번 보시는 것을 추천드립니다. (https://bmcmedresmethodol.biomedcentral.com/articles/10.1186/s12874-018-0482-1에서 읽을 수 있으며 읽기에 어려운 논문은 아닙니다.)

cols_standardize = ['x0', 'x1', 'x2', 'x3', 'x8']
cols_leave = ['x4', 'x5', 'x6', 'x7']

standardize = [([col], StandardScaler()) for col in cols_standardize]
leave = [(col, None) for col in cols_leave]

x_mapper = DataFrameMapper(standardize + leave)

x_train = x_mapper.fit_transform(df_train).astype('float32')
x_val = x_mapper.transform(df_val).astype('float32')
x_test = x_mapper.transform(df_test).astype('float32')

get_target = lambda df: (df['duration'].values, df['event'].values)
y_train = get_target(df_train)
y_val = get_target(df_val)
durations_test, events_test = get_target(df_test)
val = x_val, y_val


Standardization을 하는 방법입니다. cols_standardize는 standardize를 할 column들이고 나머지는 안하는 column들입니다.
label같은 경우는 standardize가 필요도 없고 그냥 가져오기만 하면 됩니다.

in_features = x_train.shape[1]
num_nodes = [32, 32]
out_features = 1
batch_norm = True
dropout = 0.1
output_bias = False

net = tt.practical.MLPVanilla(in_features, num_nodes, out_features, batch_norm,
                              dropout, output_bias=output_bias)
# net = torch.nn.Sequential(
#     torch.nn.Linear(in_features, 32),
#     torch.nn.ReLU(),
#     torch.nn.BatchNorm1d(32),
#     torch.nn.Dropout(0.1),
    
#     torch.nn.Linear(32, 32),
#     torch.nn.ReLU(),
#     torch.nn.BatchNorm1d(32),
#     torch.nn.Dropout(0.1),
    
#     torch.nn.Linear(32, out_features)
# )
안에 들어가는 network를 결정해주는 것인데, 여기서 tt는 torchtuple으로 이 오픈소스 제작자가 만든 PyTorch기반의 package입니다. 저렇게 작성하면 net은 다음과 같이 생성됩니다.

torch.nn.Sequential로 PyTorch의 MLP 하나가 만들어지죠?
그래서 MLP를 자기가 직접 설계한것을 사용하고 싶으면 net에 torch.nn.Sequential로 설계한 것을 집어넣어도 됩니다.

model = CoxPH(net, tt.optim.Adam)
model.optimizer.set_lr(0.01)
epochs = 512
callbacks = [tt.callbacks.EarlyStopping()]
verbose = True
%%time
log = model.fit(x_train, y_train, batch_size, epochs, callbacks, verbose,
                val_data=val, val_batch_size=batch_size)
model.partial_log_likelihood(*val).mean()
일단 모델은 이렇게 Training을 시킵니다.
Constructor에 optimizer와 net으로 instance를 만든후에 learning rate를 지정해줍니다.
이후에 fit이라는 method로 training을 시켜줄수 있습니다.
fit method의 내부는 torchtuples 패키지에 자세히 적혀져 있으므로 이를 확인해주셨으면 합니다. (여기서는 주제를 벗어나므로 설명하지 않습니다.)

_ = model.compute_baseline_hazards()
surv = model.predict_surv_df(x_test)
ev = EvalSurv(surv, durations_test, events_test, censor_surv='km')
ev.concordance_td()
ev.integrated_brier_score(time_grid)
ev.integrated_nbll(time_grid)
Prediction + Evaluation 방법입니다.
baseline_hazards를 계후에 predict_surv_df method 통해서 prediction 값들이 나옵니다.
이를 EvalSurv에 실제 값들과 같이 넣으면은 evaluation을 직접 할수가 있습니다.

이정도까지 활용방법을 대략 설명드렸습니다.

자 그러면 이제 후기를 설명드리도록 하겠습니다.
저는 이제 METABRIC dataset이 아니라 산학프로젝트로 받은 데이터셋을 사용했는데 (공개하면 안되어 그냥 Dataset이라고만 해두겠습니다.) 저도 이것을 활용했습니다.
이제 계속 활용하면서 느낀 장단점을 설명해두겠습니다.


  • 장점
    • PyTorch로부터 나와서 PyTorch를 사용해 본 사람들에겐 편하다.
      • network도 PyTorch기반이고 많은 요소들이 PyTorch 기반을 해서 PyTorch에서 사용하던 요소들도 pycox에 활용할 수 있습니다.
    • 여러 모델들을 제공하여 상황에 따라서 다른 모델들을 사용하기도 편하며 training+prediction 구조가 모델마다 거의 비슷하다.
      • 위에 설명드린 사용법은 CoxPH로만 설명드렸지만 다른 모델들도 비슷합니다.
      • 그리고 또한 Deep-learning 기반의 survival model들을 지원하는 package들이 별로 없는데, 여기서는 여러가지 model들을 지원합니다.
    • torchtuples에서 제공하는 편리한 기능들도 사용가능하다.
      • 예: fit method, make_dataset method(여기서는 설명 안했지만)
  • 단점
    • 지나치게 torchtuples에서 의존하여 내부적으로 어떻게 구현했는지를 보려면 torchtuples package도 꼭 살펴봐야한다.
      • 제가 제일 크게 느낀 단점으로 거의 모든게 torchtuples에서 상속받아 활용해서 torchtuples package를 이해하는게 필수적입니다.
    • 자유도가 그렇게 높지 않다.
      • PyTorch기반인데, fit method로 training이 된다는 것은 그렇게 자유도가 높지 않다는 뜻입니다. PyTorch를 사용해보았다면 DataLoader를 만드는 것이 필수적이란 것을 알겁니다.
      • 그렇지만 fit method를 통해서 내부적으로 DataLoader를 만들고 사용하는데, 찾아보시면 sampler는 사용할수 없게 됩니다.
      • 그래서 sampler 등등을 포기할수 밖에 없는데, 사용하려면 torchtuples에 구현된 fit method를 보고 직접 따로 구현해야합니다. 
    • Gradient-based model이라서 그런지 covariates(공분산)를 계산하여 training-prediction하는 모델들보다 결과가 비교적 안 좋게 나옵니다.
      • sksurv가 covariates를 계산해서 prediction하는 package인데, 아직까지 더 좋은 결과를 보인적이 없습니다.
이 정도로 후기를 작성하고 마치도록 하겠습니다.
감사합니다!

(PyCox) 두 번째, 설치 방법?

안녕하세요?
이번 시간에는 pycox를 설치하는 방법에 대해서 설명드리도록 하겠습니다.
설치방법은 아주 간단하므로 설명이 그렇게 길지는 않을 것 같습니다.


먼저 PyTorch를 기본적으로 설치해야합니다.
conda 기준으로 PyTorch는 아래와 같이 설치합니다.

    conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

더 자세히 알고 싶으시다면 https://pytorch.org/로 들어가시면 됩니다.
이후에 자신이 원하는 버젼과 OS, 설치방법, 언어, CUDA 사용유무를 알맞게 고르신 후에 설치하시면 됩니다.

이후에 

     pip install pycox

이 명령어 한 줄로 설치할 수 있습니다.

이걸로 설치는 다 되었고 테스트 하거나 연습하려면 https://github.com/havakv/pycox에서 Get Started를 참고하시면 좋을 것 같습니다.
입문자들을 위해서 Jupyter용 ipynb 파일들이 있으니 설명과 같이 연습하실 수 있습니다!

이번에는 여기서 마치고 다음번에는 활용 및 후기를 설명드리도록 하겠습니다.
감사합니다.

(PyCox) 첫 번째, Pycox는 무엇인가?

안녕하세요?
이번에 수업 일환으로 pycox 강의를 올리게 되었습니다.
우선 pycox에 대해서 무엇인지 간략하게 설명하도록 하겠습니다.

pycox는 'havakv'라는 유저가 개발한 python package 중에 하나로서 PyTorch로 survival analysis 및 time-to-event prediction을 하기위해서 만들어졌습니다.

이 패키지 안에는 survival model들과 evaluation metrics 그리고 event-time 데이터셋들이 기본적으로 들어가있고, Pre-processing tool들도 존재합니다.

그리고 이 패키지는 동일 유저가 개발한 torchtuples를 기반으로 하기 때문에 소스 코드를 살펴보실 때에 같이 보는게 편합니다. (torchtuples는 또 PyTorch를 기반으로 해서 결국엔 PyTorch를 기반으로 한 패키지가 됩니다.)

이제 지원하는 Survival model들을 알려드리겠습니다.

  • Continuous-Time Models:
    • CoxTime
    • CoxCC
    • CoxPH (DeepSurv)
      • DeepSurv의 layer가 1개면 CoxPH가 되므로 같이 적어둔것 같습니다.
    • PCHazard
  • Discrete-Time Models:
    • LogisticHazard
    • PMF
    • DeepHit, DeepHitSingle
    • MTLR
    • BCESurv
Evaluation Criteria는 다음과 같이 지원합니다.
  • concordance_td
    • C-index라고도 합니다.
  • brier_score
  • nbll
  • integrated_brier_score
  • integrated_nbll
  • brier_score_admin / integrated_brier_score_admin
  • nbll_admin / integrated_nbll_admin
오늘은 이정도로만 설명하고 다음에는 어떻게 설치하는지를 설명드리도록 하겠습니다! 
감사합니다!