ChartKlas (2)

제목 없음

Demo

(1)편의 분류 모델에 4가지 차트 타입(map, scatter plot, pareto chart, venn diagram)을 추가했다. 정확도는 959개(각 차트 타입당 대략 100개)의 validation set에 대해서 91%이고, 아직 트레이닝이 끝나지 않았으므로 더 올라갈 수도 있다. 현재 95.2%의 정확도를 가지고 있다.

또한, 분류에 대한 restful API를 만들었다. http://wonjaekim.com:30000/classify 로 multipart-encoded file을 http post request로 보내면 json 형식으로 response를 준다.

<예제 python code>

import requests

url = 'http://wonjaekim.com:30000/classify'
files = {'file': open('area_chart/areaprofita.gif', 'rb')}
r = requests.post(url, files=files)
print r.text

<response 형식>

{
    "filename": "areaprofita.gif", 
    "result": [
        [
            "area chart", 
            99.3242
        ], 
        [
            "scatter plot", 
            0.2768
        ], 
        [
            "pie chart", 
            0.1326
        ], 
        [
            "bar chart", 
            0.0886
        ], 
        [
            "map", 
            0.0661
        ]
    ]
}

Beer Galaxy

beer-gal

Demo, Github

Beeradvocate에서 수집한 데이터로 맥주의 은하수를 그려보았다.

전처리 과정

1. doc2vec 알고리즘을 사용하여 117705개의 맥주 각각에 달린 리뷰들(1개의 리뷰가 달린 맥주부터 많게는 3701개의 리뷰가 달린 Dogfish Head Brewery의 90 Minute IPA까지 다양한 크기의 리뷰들이 있었다.)을 사용하여 해당 맥주를 300차원의 vector로 나타냈다.

2. 각각의 맥주 벡터를 t-SNE를 사용하여 2차원으로 folding(sparsity는 0.001225, iteration 1000번에 최종 에러는 6.149086)하였다.  리뷰 텍스트 이외의 정보를 이용한(예컨데 어느 나라 맥주인지 같은) 휴리스틱은 일절 사용하지 않았다.

시각화 요소

1. 각 원의 위치(x, y 좌표)는  2차원 평면에서 각 맥주의 리뷰의 평균적인 의미를 나타낸다. 두 맥주가 가깝다면, 두 맥주의 리뷰가 의미상으로 비슷하다는 뜻이다. 상대적인 값으로, 원들간의 거리에만 의미가 있지 절대적인 좌표에 의미는 없다.

2. 각 원의 색은 그 맥주의 스타일을 의미한다. Beeradvocate가 정의하는 104가지나 되는 맥주 스타일을 color coding 할 수는 없었으므로 가장 개체수가 많은 스타일 상위 20개를 추렸다. 이 20개의 스타일에 속하지 않는 맥주는 검은색으로 표시된다.

3. 각 원의 크기는 그 맥주의 리뷰 개수를 의미한다. 또한 크기가 클 수록 원은 투명해진다. 둘 다 선형 함수로 매핑되어있다.

4. 12만개의 노드를 d3로 그리면 느리기 때문에 리뷰 개수가 20개 이상인 12916개의 맥주에 대해서만 원을 그렸다. 추후에 WebGL을 공부해서 다시 그려볼 예정이다.

 

ChartKlas

chartklas

 

Demo

CNN(Convolutional Neural Network)을 사용해서 차트 분류 모델을 만들었다. 이미지를 업로드하면 Bar, Line, Pie, Area, Radar Chart와 Table. 6개의 차트 타입 중 어느 타입에 속하는지 분류해준다.

사용한 네트워크는 2014 이미지넷 우승에 빛나는 GoogLeNet

슬프게도 GPU가 달려있는 서버가 수중에 없는 관계로 60 epoch의 트레이닝을 무려 24시간동안 진행했다. 각 클래스별로 200개의 이미지, 총 1200개의 이미지에 대해서 75% training set, 25% validation set으로 나눠서 트레이닝을 진행했고. validation set에 대한 accuracy는 94.697%로 측정되었다. 클래스 수가 더 적긴 하지만 기존의 차트 타입 분류를 시도한 ReVision의 10-class 분류 정확도인 80%보다 꽤나 높게 나왔다.

Gtx Titan X 정도의 그래픽카드가 장착된 서버를 구할 수 있다면 다시 트레이닝을 시켜보고 싶지만, 현재로서는 위 결과에 만족.