데이터 인사이트 스터디 내용을 관리하는 블로그 입니다.

Data Insight Study Blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

[공지] 스터디 3차 모임 후기

이번 3차 모임에서는 추운 날씨 탓인지 시작 이래 가장 적은 인원이 참석하셨습니다.(총 6명) 그렇지만 내용은 회를 거듭할 수록 충실해 지고 있다는 느낌입니다. 꼼꼼하게 내용을 챙겨서 설명해 주신 한석진 부장님, 정말 감사드립니다!
우선 지난 시간까지의 주요 내용들을 LAB 1을 통해 간단히 복습하고, 본격적인 데이터의 탐색과 시각화 작업들에 대한 설명과 시연이 이어졌습니다. 뉴욕시의 맨해튼 지역의 6개월간의 옐로우캡 택시 운행 정보에 대하여, 분석 포인트를 바꾸어 가면서 단계별로 필요한 factor를 정리해 가면서 차분하게 RevoScaleR에서의 데이터 가공 방법을 단계적으로 제대로 볼 수 있었던 기회 였습니다.
개인적으로는 독습으로 진행할 때 어렴풋하게 두리뭉실 넘어갔던 내용들을 질문 및 토의를 통하면서 명확하게 할 수 있었던 점이 좋았던 것 같습니다.
차주는 설연휴 주간으로 스터디가 없으며, 모든 일정을 1주일씩 뒤로 조정하기로 하였습니다. 다음 모임에서 발표는 이주경님(Clustering))과 김은정님(Predictive Modeling)이 수고해 주시기로 하였습니다.

해당 챕터는 Machine Learning의 핵심 내용이므로 놓치지 마시기 바랍니다.

DI Study는 열린 스터디로 누구나 참여하실 수 있습니다.
오늘도 수고 많으셨습니다.

[공지] 스터디 2차 모임 후기

안녕하세요,
이번 2차 모임에서는 모두 10분(오프라인 6명 온라인 4명)이 참석하여 주셨습니다. 갑작스러운 추위에도 시간을 내어 참석하여 주신 분들께 진심으로 감사드립니다. 1회 모임과 마찬가지로 온라인 1시간 진행 이후에, 오프라인에서도 역시 1시간 정도 발표 내용 및 실무 연계에 대한 주제로 추가 토의가 이루어 졌습니다.

데이터 분석에서 데이터의 준비 및 가공 과정에는 가장 많은 노력과 시간이 들어갑니다. 오늘 살펴본 내용은 RevoScaleR 패키지의 rx 함수들을 사용하여, 어떻게 이러한 처리들을 진행하는 지에 대하여 개념을 잡아갈 수 있었던 시간이었던 것 같습니다.

안정적이고 충실하게 준비해 오신 이주경 님의 발표 덕분으로 스터디 진행에 대한 틀이 어느 정도 잡혀가는 느낌이며, 온라인 발표 이후에 최고의 R 강사이신 이후선 대표님의 소중한 즉석 강의도 무척 좋은 시간이었습니다.

차주 발표는 마이크로소프트의 한석진 부장님께서 'Examining the Data' 파트를 맡아 주시기로 하였고, 나머지 'Visualizing the Data' 부분은 발표하실 지원자를 찾는중입니다.  발표 의사가 있으신 분은 저에게 알려 주십시요. eDX 해당 내용을 30분 정도로 요약하여 주시면 됩니다. ^^;

오늘 발표된 내용에 대한 질문은 본 후기 게시판의 댓글 또는 저에게 이메일로 알려주시면, 정리하여 블로그에 반영하도록 하겠습니다.

차차주는 설연휴여서 스터디 모임 일정에 변경이 있을 수 있습니다. 이 부분은 다음 모임에서 결정하여 공지 드리도록 하겠습니다.

모두 수고 많으셨습니다.

[스크랩] Process Mining

간밤에 수신된 이메일 정리하다가 흥미있는 내용이 있어서 스크랩.
 
"프로세스 마이닝"에 대한 내용인데요, 데이터 사이언티스트는 데이터 자체를 운영 프로세스와 연관시켜서, 이에 대한 올바른 질문을 할 수 있어야 한다(A data scientist also needs to relate data to operational processes and be able to ask the right questions)라는 책의 서문의 내용이 마음에 와 닿습니다. 분량이 꽤 되는데, 올해 읽을 수 있었으면 하는 희망입니다. ^^;
 

Concept:  

Process mining 

Main community page http://www.processmining.org/ 

Main/recent reference literature http://www.springer.com/gp/book/9783662498507 

Process Mining

Data Science in Action

Authors: van der Aalst, Wil M.P.  

From <http://www.springer.com/gp/book/9783662498507 

Potential Tools: 

Microsoft/Azure availble: 

Process Discovery 

·        Sequence Mining / Markov Chains 

§  Closest approximate match = Sequence Cluster Model (Microsoft Analysis Services, SQL Server 2016) 

·        Sequence clustering based on n-order Markov Chains

·        Use of Markov Chains cannot handle concurrency and need additional post processing

·        Sequence Mining requires to determine the max length of a sequence

·        Algorithm may be very compute intensive

·        Designed for

·        Clickstream analysis 

 

·        Neural Networks 

§  Azure Machine Learning:

·        Two-Class Neural Networks: only usefull for two-class classification

 

·        Visualisation: PowerBI (see KPMG)

§  https://powerbi.microsoft.com/en-us/partner-showcase/kpmg-processmining/ 

 

PROM 

Open source reference implementation (interactive) 

http://www.promtools.org/doku.php 

Support for:

§  Heuristic Mining

§  Genetic Mining

§  Fuzzy Mining

§  Region Mining

§  Inductive Mining

 

IMPORTANT REMARK

§  Some logic seems executable from CLI

·        https://dirksmetric.wordpress.com/2015/03/11/tutorial-automating-process-mining-with-proms-command-line-interface/

·        CLI facility used for unit testing

·        Should be same subset as exposed via RapidMiner 

 

RapidPROM 

Plugin for RapidMiner (Visual, allows to design process mining activity flows)  

giving access to PROM functionality from within Rapidminer 

Installation: http://www.promtools.org/doku.php?id=rapidprom:installation

Userguide: http://www.win.tue.nl/~abolt/userfiles/downloads/RapidProM/RapidProM_user_guide.pdf

 

IMPORTANT REMARK:

·        RapidMiner is expensive and seems to be one of the best tools around

·        https://rapidminer.com/pricing/

·        https://1xltkxylmzx3z8gd647akcdvov-wpengine.netdna-ssl.com/wp-content/uploads/2016/12/rm-platform-fact-sheet-12-2.pdf

·        RapidMiner with RapidProm seems heavely promoted to chain activities by Technische Universiteit Eindhoven (TU/e)

§  Avaiability

·        Commercial free download limitted to 10000 lines

·        Via https://my.rapidminer.com/nexus/account/index.html#downloads at http://go.rapidminer.com/rm-studio-download-windows-64bit

·        Unlimitted older open source versions available

·        via http://www.rapidprom.org/ at http://www.promtools.org/rapidprom/downloads/rapidminer-5.3.015x64-install.exe 

 

PMLAB 

Script driven process mining, not up to par with PROM in terms of algorithms 

https://github.com/josepcarmona/PMLAB 

Paper: http://ceur-ws.org/Vol-1295/paper4.pdf 

 

CRAN-R pMineR package 

https://cran.r-project.org/web/packages/pMineR/pMineR.pdf 

Supports (less advanced/evolved)

·        Alpha-Miner Model

·        First Order Markov Model

[공지] 스터디 1차 모임 후기

안녕하세요,
이번 1차 모임에서는 모두 23분(오프라인 8명 온라인 15명)이 참석하여 주셨습니다. 온라인 1시간 진행 이후에, 오프라인에서도 1시간 정도 더 토의가 이루어 졌습니다. eDX 내용 이외에 실무적인 주제와 몇가지 Power BI와  연계된 시각화 및 데이터 검증 방안 등이 논의되었습니다. 이번에는 진행이 미숙하여 스터디로 얻을 수 있는 네트워킹 시간이 미흡했는데, 다음 모임에서는 보완될 수 있도록 고민중입니다.
 
아래 모임이후 논의되었던 몇 가지 내용들을 정리하여 공유 드립니다.
 
1. Microsoft R 의 가격은 어떻게 되는지?
  • 설치형 (On-Premise)
    - SQL Server R Services : SQL Server 라이센스에 포함되며, 코어 단위로 구매(최소 4코어 구매. 이후 2코어씩 구매가능)
    - Hadoop/Suse/redhat/teradata를 지원하는 R Server : Hadoop 워커노드에 설치되는 R Server는 노드 기준, 스탠드얼론 리눅스, 테라데이터 등은 코어 기준
    - 단위 가격은 총판 또는 영업 담당자에게 문의 필요
  • 클라우드 (Azure)
    - R Server for HDInsight : HDInsight 가격과 거의 동일하나 약간의 추가 비용 있음 (https://azure.microsoft.com/ko-kr/pricing/details/hdinsight/)
    - R Server Virtual Machines : VM 옵션에 따라 상이(https://azure.microsoft.com/ko-kr/pricing/details/virtual-machines/r-server/)
2. 개발 및 테스트를 위힌 Azure 클라우드상의 환경 셋팅 방법은?
3. 기존 작성하였던 Base R 코드에서 ScaleR로  변경해야 할 때, 어느 정도 작업이 필요한지?
  • 상황에 따라 다르며, 대용량 빅데이터 처리 또는 기존 R 프로그램의 성능 향상을 위한 목적일 경우, 데이터 ingest 및 조작, 처리, 모델링 단계별로 병렬 처리가 가능한 ScaleR의 rx로 시작되는 Function들이 Base R 대비 향상된 Function 적용을 검토될 수 있으며, 특정 Function들은 입력 및 출력으로 data.frame이 아닌 .xdf 파일로 변경이 필요할 수도 있음
  • Comparison of Base R and ScaleR Functions : 기존 R 코드를 기반으로 ScaleR로 전환시 참조 (영문)
1월 12일 다음 스터디에서 뵙겠습니다!
 
김환태

[공지] 스터디 모임 1차

2017년도 1차 스터디 모임을 다음과 같이 진행합니다. 공지 드린 바와 같이 온라인 중계를 겸하여 진행되므로 아래 참석 링크를 통하여 동일한 시간에 참석 가능합니다. 저는 당일 19시 부터 현장에 대기하고 있을 예정이므로, 오프 라인으로 참석 하실 분들은 12층에 오셔서 저에게 전화 주시면 됩니다. (010-8957-8041 / 김환태)

  •  제목 : 스터디 1차 미팅 / DAT213x Analyzing Big Data with Microsoft R Server 
  • 일시 : 2017년 1월 5일(목) 20:00
  • 장소 : 마이크로소프트 광화문 본사 12층 Vancouver 회의실 / 위치
  • 온라인 참석 링크 : Join Skype Meeting (클릭!하시면 브라우저에 Webapp이 설치됩니다.)
  • 범위 : 1. Introduction / 프로그램 설치 / 예제 파일 및 데이터 설치 등

온라인 중계 내용의 녹화는 지난 테스트 미팅에서 별 문제 없이 진행되었으나, 강의가 아닌 스터디인 성격상 그대로 공개 하기에는 내용에 군더더기 부분들이 많아서, 스터디 동영상 공유는 진행하지 않을 계획입니다. 발표 자료 및 기타 유용한 동영상은 스터디 종료 이후에 블로그를 통해서 공유하도록 하겠습니다.

그럼, 목요일 저녁에 뵙겠습니다.

3. Examining and Visualizing Data > Examining the Data > Examining Neighborhoods

지역(neighborhoods) 조사

"~ ." 파라미터를 rxSummary 함수에 전달하여, 데이터 상의 모든 컬럼에 대한 요약 정보를 얻을 수 있습니다.

system.time(
rxs_all <- rxSummary( ~ ., nyc_xdf)
)
Rows Processed: 69406520 
   user  system elapsed 
   0.05    0.02   85.16 

예를 들자면, 데이터에서 숫자와 관련된 열에 대한 요약은 rxs_all의 sDataFrame이라는 항목 아래의  저장됩니다.

head(rxs_all$sDataFrame)
                   Name       Mean      StdDev           Min           Max ValidObs
1              VendorID         NA          NA            NA            NA 69406520
2  tpep_pickup_datetime         NA          NA            NA            NA        0
3 tpep_dropoff_datetime         NA          NA            NA            NA        0
4       passenger_count   1.660674    1.310478        0.0000        9.0000 69406520
5         trip_distance   4.850022 4044.503422 -3390583.8000 19072628.8000 69406520
6      pickup_longitude -72.920469    8.763351     -165.0819      118.4089 69406520
  MissingObs
1          0
2          0
3          0
4          0
5          0
6          0

만약 우리가 데이터의 각 factor 열에 대한 level 수를 보여 주는 단방향 테이블을 원한다면, rxs_all을 참조하여 얻을 수 있지만, 특정 factor 열과 다른 factor열의 조합 별로 집계한 수를 보여주는 두방향의 테이블을 보려고 한다면, 올바른 수식을 요약 함수에 전달하는 것이 필요합니다. 여기에서는 rxCrossTabs 함수를 사용하여 한 지역에서 다른 지역으로 이동하는 횟수를 구합니다.

nhoods_by_borough <- rxCrossTabs( ~ pickup_nhood:pickup_borough, nyc_xdf)
nhoods_by_borough <- nhoods_by_borough$counts[[1]]
nhoods_by_borough <- as.data.frame(nhoods_by_borough)

# get the neighborhoods by borough
lnbs <- lapply(names(nhoods_by_borough), function(vv) subset(nhoods_by_borough, nhoods_by_borough[ , vv] > 0, select = vv, drop = FALSE))
lapply(lnbs, head)
[[1]]
[1] Albany
<0 rows> (or 0-length row.names)

[[2]]
[1] Buffalo
<0 rows> (or 0-length row.names)

[[3]]
             New York City-Bronx
Baychester                   125
Bedford Park                1413
City Island                   52
Country Club                 354
Eastchester                   98
Fordham                     1243

[[4]]
                   New York City-Brooklyn
Bay Ridge                            3378
Bedford-Stuyvesant                  54269
Bensonhurst                          1159
Boerum Hill                         76404
Borough Park                         8762
Brownsville                          2757

[[5]]
              New York City-Manhattan
Battery Park                   643283
Carnegie Hill                  807204
Central Park                   936840
Chelsea                       4599098
Chinatown                      211229
Clinton                       2050545

[[6]]
                         New York City-Queens
Astoria-Long Island City               303231
Auburndale                                464
Clearview                                 152
College Point                               1
Corona                                   1496
Douglastown-Little Neck                   937

[[7]]
                            New York City-Staten Island
Annandale                                             6
Ardon Heights                                        22
Bloomfield-Chelsea-Travis                            26
Charlestown-Richmond Valley                           7
Clifton                                             525
Ettingville                                          13

[[8]]
[1] Rochester
<0 rows> (or 0-length row.names)

[[9]]
[1] Syracuse
<0 rows> (or 0-length row.names)

4. Clustering and Modeling > Predictive Modelling > Judging Predictive Performance

예측 성능의 판정

이제 모델을 테스트 데이터에 적용하여 각 모델의 예측 성능을 비교할 수 있습니다. 의사 결정 트리 모델이 과다 적합(over-fitting)되어 만들어 진 것이 맞다면, 다른 두 모델과 비교하여 테스트 데이터에서도 예측 결과가 잘못 형성되는 것을 확인할 수 있어야 합니다. 랜덤 포리스트가 선형 모델에서는 누락되어 있는 데이터의 일부 고유 신호를 포착한다고 생각된다면, 테스트 데이터에서 선형 모델보다 성능이 우수한 모습을 확인할 수 있어야 합니다.

살펴볼 첫 번째 측정 기준은 제곱된 잔차의 평균(the average of the squared residuals)입니다. 이 값을 통하여 예측값이 관측값과 얼마나 가까운 지를 알 수 있습니다. 일반적으로 0% ~ 20%의 좁은 범위에 있는 팁 비율을 예측하기 때문에, 좋은 모델은 잔차가 평균 2 ~ 3 % 포인트를 넘지 않아야 할 것으로 예상해야 합니다.

rxPredict(trained.models$linmod, data = mht_split$test, outData = mht_split$test, predVarNames = "tip_percent_pred_linmod", overwrite = TRUE)
rxPredict(trained.models$dtree, data = mht_split$test, outData = mht_split$test, predVarNames = "tip_percent_pred_dtree", overwrite = TRUE)
rxPredict(trained.models$dforest, data = mht_split$test, outData = mht_split$test, predVarNames = "tip_percent_pred_dforest", overwrite = TRUE)

rxSummary(~ SE_linmod + SE_dtree + SE_dforest, data = mht_split$test,
          transforms = list(SE_linmod = (tip_percent - tip_percent_pred_linmod)^2,
                            SE_dtree = (tip_percent - tip_percent_pred_dtree)^2,
                            SE_dforest = (tip_percent - tip_percent_pred_dforest)^2))
Call:
rxSummary(formula = ~ SE_linmod + SE_dtree + SE_dforest, data = mht_split$test, 
    transforms = list(SE_linmod = (tip_percent - tip_percent_pred_linmod)^2, 
        SE_dtree = (tip_percent - tip_percent_pred_dtree)^2, 
        SE_dforest = (tip_percent - tip_percent_pred_dforest)^2))

Summary Statistics Results for: ~SSE_linmod + SSE_dtree + SSE_dforest
Data: mht_split$test (RxXdfData Data Source)
File name: C:\Data\NYC_taxi\output\split\train.split.train.xdf
Number of valid observations: 43118543 
 
 Name        Mean     StdDev   Min                 Max      ValidObs MissingObs
 SE_linmod  82.66458 108.9904 0.00000000005739206 9034.665 43118542 1         
 SE_dtree   82.40040 109.1038 0.00000251589457986 8940.693 43118542 1         
 SE_dforest 82.47107 108.0416 0.00000000001590368 8606.201 43118542 1        

살펴볼 가치가 있는 또 다른 측정 기준은 상관 행렬(correlation matrix)입니다. 이는 서로 다른 모델의 예측이 어느 정도 서로 가깝고 어느 정도까지 실제 또는 관찰된 팁 비율에 근접하는지를 판단하는 데 도움이 될 수 있습니다.

rxc <- rxCor( ~ tip_percent + tip_percent_pred_linmod + tip_percent_pred_dtree + tip_percent_pred_dforest, data = mht_split$test)
print(rxc)
                          tip_percent pred_linmod pred_dtree pred_dforest
tip_percent               1.0000000   0.1391751   0.1500126  0.1499031
tip_percent_pred_linmod   0.1391751   1.0000000   0.8580617  0.9084119
tip_percent_pred_dtree    0.1500126   0.8580617   1.0000000  0.9404640
tip_percent_pred_dforest  0.1499031   0.9084119   0.9404640  1.0000000

4. Clustering and Modeling > Predictive Modelling > Comparing Predictions

예측 결과 비교

알고리즘을 테스트 데이터에 적용하기에 앞서서, 모든 범주형(categorical) 변수들의 조합으로 작은 데이터 세트에 알고리즘을 적용하고, 예측 결과를 시각화 합니다. 이것은 우리가 각각 알고리즘에 대한 직관을 발전시키는 것에 도움이 될 것입니다.

pred_df <- expand.grid(ll)
pred_df_1 <- rxPredict(trained.models$linmod, data = pred_df, predVarNames = "pred_linmod")
pred_df_2 <- rxPredict(trained.models$dtree, data = pred_df, predVarNames = "pred_dtree")
pred_df_3 <- rxPredict(trained.models$dforest, data = pred_df, predVarNames = "pred_dforest")
pred_df <- do.call(cbind, list(pred_df, pred_df_1, pred_df_2, pred_df_3))
head(pred_df)
           pickup_nb dropoff_nb pickup_hour pickup_dow pred_linmod pred_dtree pred_dforest
1          Chinatown  Chinatown     1AM-5AM        Sun 6.869645    5.772054   9.008643
2       Little Italy  Chinatown     1AM-5AM        Sun 10.627190   9.221250   10.634590
3            Tribeca  Chinatown     1AM-5AM        Sun 9.063741    9.221250   10.099731
4               Soho  Chinatown     1AM-5AM        Sun 10.107815   8.313437   10.162946
5    Lower East Side  Chinatown     1AM-5AM        Sun 9.728399    9.221250   10.525242
6 Financial District  Chinatown     1AM-5AM        Sun 8.248997    6.937500   8.674807
observed_df <- rxSummary(tip_percent ~ pickup_nb:dropoff_nb:pickup_dow:pickup_hour, mht_xdf)
observed_df <- observed_df$categorical[[1]][ , c(2:6)]
pred_df <- inner_join(pred_df, observed_df, by = names(pred_df)[1:4])
  
ggplot(data = pred_df) +
  geom_density(aes(x = Means, col = "observed average")) +
  geom_density(aes(x = pred_linmod, col = "linmod")) +
  geom_density(aes(x = pred_dtree, col = "dtree")) +
  geom_density(aes(x = pred_dforest, col = "dforest")) +
  xlim(-1, 30) + 
  xlab("tip percent")

Distribution of predictions for each model

선형 모델과 랜덤 포레스트 모델은 둘 모두 우리에게 부드러운 곡선의 예측을 제공합니다. 우리는 랜덤 포레스트 예측이 가장 중앙 집중되어 있음을 알 수 있습니다. 의사 결정 트리에 대한 예측은 아마도 과다 적합(overfitting)의 결과로 인한 들쭉날쭉 한 분포를 따르지만, 우리가 테스트 세트에 대하여 성능을 확인하기 이전까지는 정말 이런 모습인지를 알 수 없습니다. 전체적으로, 예측 결과들은 측정된 평균보다 폭이 더 좁습니다.

4. Clustering and Modeling > Predictive Modelling > Using Other Algorithms

다른 알고리즘 사용

지금까지 동일한 rxLinMod 알고리즘을 사용하는 두 모델을 살펴 보았습니다. 이 둘을 비교하면서, 우리는 모델을 만드는 데 사용된 변수들이 각각의 예측에 미치는 영향도를 포착하는 방법을 살펴 보았습니다. 이러한 비교를 위해서, 모델을 만드는 데 사용되는 모든 변수들의 조합을 사용하여 데이터 세트를 만들고, rxPredict를 사용하여 두 모델로 해당 데이터 세트에 대하여 스코어링을 수행하였습니다. 그렇게 함으로써 우리는 예측이 어떻게 분포되어 있는지를 알 수는 있습니다만 ,그러나 여전이 이러한 예측이 옳은지는 아직 알 수가 없습니다. 모델의 성능에 대한 진정한 테스트는 샘플 데이터 이외의 자료에 대하여 예측할 수 있는 능력에 있습니다. 따라서 우리는 데이터를 두 개로 나누고, 모델의 테스트를 위해 한 부분을 따로 보관 합니다.

데이터를 트레이닝과 테스트의 두 부분으로 나누기 위해, 먼저 rxDataStep을 사용하여 split이라는 새 factor 열을 작성하였습니다. 이 열에는 "train"또는 "test" 값이 부여되어, 이를 통하여 주어진 데이터 비율(여기서는 75 %)이 모델 트레이닝에,  나머지는 모델의 예측 능력을 테스트하는 데 사용됩니다. 이어서 rxSplit 함수를 사용하여 데이터를 두 부분으로 나눕니다. 여기에서 우리가 만드는 rx_split_xdf 함수는 앞서의 두 단계를 하나로 결합하고, 일부 인수들에 대하여 기본값을 설정합니다.

dir.create('output', showWarnings = FALSE)
rx_split_xdf <- function(xdf = mht_xdf,
                         split_perc = 0.75,
                         output_path = "output/split",
                         ...) {
  
  # first create a column to split by
  outFile <- tempfile(fileext = 'xdf')
  rxDataStep(inData = xdf,
             outFile = xdf,
             transforms = list(
               split = factor(ifelse(rbinom(.rxNumRows, size = 1, prob = splitperc), "train", "test"))),
             transformObjects = list(splitperc = split_perc),
             overwrite = TRUE, ...)

  # then split the data in two based on the column we just created
  splitDS <- rxSplit(inData = xdf,
                     outFilesBase = file.path(output_path, "train"),
                     splitByFactor = "split",
                     overwrite = TRUE)
  
  return(splitDS)
}

# we can now split to data in two
mht_split <- rx_split_xdf(xdf = mht_xdf, varsToKeep = c('payment_type', 'fare_amount', 'tip_amount', 'tip_percent', 'pickup_hour', 
                                                        'pickup_dow', 'pickup_nb', 'dropoff_nb'))
names(mht_split) <- c("train", "test")

이제 데이터에 대해 세 가지의 다른 알고리즘을 실행합니다.

  • rxLinMod, 앞서의 선형 모델이며 다음 인자를 사용 : tip_percent ~ pickup_nb:dropoff_nb + pickup_dow:pickup_hour
  • rxDTree, 의사 결정 트리 알고리즘 : tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour(factor간 조합 분석이 알고리즘 자체에 내장되어 있기 때문에 의사 결정 트리에는 조합 factor가 필요하지 않음)
  • rxDForest, 랜덤 포리스트 알고리즘은 의사 결정 트리와 같은 인자를 사용

우리 코스는 모델링 과정이 아니기 때문에, 알고리즘 구현 방법에 대해서는 다루지 않을 것입니다. 대신 우리는 알고리즘을 실행하고, 테스트 데이터의 팁 퍼센트를 예측하여,  어느 알고리즘이 더 효과적인지 알 수 있습니다.

system.time(linmod <- rxLinMod(tip_percent ~ pickup_nb:dropoff_nb + pickup_dow:pickup_hour, 
                               data = mht_split$train, reportProgress = 0))
system.time(dtree <- rxDTree(tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour, 
                             data = mht_split$train, pruneCp = "auto", reportProgress = 0))
system.time(dforest <- rxDForest(tip_percent ~ pickup_nb + dropoff_nb + pickup_dow + pickup_hour, 
                                 mht_split$train, nTree = 10, importance = TRUE, useSparseCube = TRUE, reportProgress = 0))
   user  system elapsed 
   0.00    0.00    1.62 

   user  system elapsed 
   0.03    0.00  778.00 

   user  system elapsed 
   0.02    0.00  644.17 

위의 알고리즘들은 실행하는 데 시간이 꽤 걸릴 수 있으므로, 각각의 반환된 모델을 저장하는 것이 좋습니다.

trained.models <- list(linmod = linmod, dtree = dtree, dforest = dforest)
save(trained.models, file = 'trained_models.Rdata')