-
Top 10 Machine Learning Algorithms for BeginnersMACHINE LEARNING 2017. 10. 26. 07:30반응형
이 문서는 영문으로된 내용을 구글 번역기를 활용하여 번역한 내용입니다.
개인적인 공부 및 추후 다시 볼 수 있도록 하기 위해 개인 블로그에 번역 내용을 옮겨 놓았습니다.
원문과 내용이 다를시 책임지지 않으며, 저작권 문제가 발생시 언제든 삭제 될 수 있습니다.원문보기 : https://www.kdnuggets.com/2017/10/top-10-machine-learning-algorithms-beginners.html/
Top 10 Machine Learning Algorithms for Beginners
I. Introduction
ML 알고리즘에 대한 연구는 '데이터 과학자'를 '21 세기의 가장 섹시한 직업'이라고 부르는 하버드 비즈니스 리뷰 (Harvard Business Review) 기사에 엄청난 견인력을 부여했습니다. 따라서 ML 분야에서 시작하는 사람들을 위해 Google은 기계 학습 엔지니어가 알아야 할 10 가지 알고리즘 인 Gold 블로그를 재부팅하기로 결정했습니다. 이 게시물은 초보자를 대상으로합니다.ML 알고리즘은 사람의 개입없이 데이터에서 배우고 경험을 향상시킬 수있는 알고리즘입니다. 학습 과제에는 입력을 출력에 매핑하는 함수를 학습하고, 레이블이없는 데이터에서 숨겨진 구조를 학습하고, 새로운 인스턴스 (행)를 메모리에 저장된 학습 데이터의 인스턴스와 비교하여 새 인스턴스에 대한 클래스 레이블이 생성되는 '인스턴스 기반 학습'을 제공합니다. '인스턴스 기반 학습'은 특정 인스턴스로부터 추상화를 생성하지 않습니다.II. Types of ML algorithms
ML 알고리즘에는 3 가지 유형이 있습니다.1. Supervised learning:감독 학습(supervised learning)은 다음과 같이 설명 할 수 있습니다. 입력 된 변수 (X)에서 출력 변수 (Y) 로의 매핑 함수를 학습하기 위해 레이블이있는 학습 데이터를 사용합니다.Y = f (X)감독 학습 문제는 두 가지 유형이 될 수 있습니다.- 분류(Classification) : 출력 변수가 범주의 형태 인 주어진 샘플의 결과를 예측합니다. 예로는 남성과 여성, 아프거나 건강한 레이블이 있습니다.
- 회귀 분석(Regression) : 출력 변수가 실제 값의 형태 인 주어진 샘플의 결과를 예측합니다. 예를 들어, 강우량, 사람의 신장을 나타내는 실제 값 라벨이 있습니다.
이 블로그에서 다루는 첫 번째 5 가지 알고리즘인 Linear Regression, Logistic Regression, CART, Naive Bayes, KNN 은 감독 학습의 예입니다.앙상블은 감독 학습의 한 유형입니다. 이는 여러 개의 서로 다른 약한 ML 모델의 예측을 결합하여 새로운 샘플을 예측하는 것을 의미합니다. 우리가 커버하는 알고리듬 9-10은 XGBoost로 부스트하는 랜덤 포레스트를 사용하여 앙상블 기법의 예입니다.2. Unsupervised learning:감독되지 않은 학습(unsupervised learning) 문제는 입력 변수 (X) 만 소유하지만 해당 출력 변수는 없습니다. 그것은 레이블이없는 훈련 데이터를 사용하여 데이터의 기본 구조를 모델링합니다.감독되지 않는 학습 문제는 두 가지 유형이 될 수 있습니다.- 연관성(Association) : 컬렉션에서 항목의 동시 발생 가능성을 발견합니다. 그것은 시장 바구니 분석에 광범위하게 사용됩니다. 예 : 고객이 빵을 구매할 경우 계란을 구입할 확률이 80 %입니다.
- 클러스터링(Clustering) : 동일한 클러스터 내의 개체가 다른 클러스터의 개체보다 서로 비슷하도록 샘플을 그룹화합니다.
- 차원축소(Dimensionality Reduction) : 차원축소는 중요한 정보가 전달되는 것을 보장하면서 데이터 집합의 변수 수를 줄이는 것을 의미합니다. 기능(Feature) 추출 방법 및 기능 선택 방법을 사용하여 차원축소를 수행 할 수 있습니다. 기능 선택은 원래 변수의 하위 집합을 선택합니다. 기능 추출은 고차원 공간에서 저 차원 공간으로 데이터 변환을 수행합니다. 예 : PCA 알고리즘은 기능 추출 접근법입니다.
우리가 여기서 다루는 6-8 알고리즘 - Apriori, K-means, PCA는 자율 학습의 예입니다.3. Reinforcement learning:강화 학습은 보상을 최대화하는 행동을 학습함으로써 에이전트가 현재 상태를 기반으로 최상의 다음 행동을 결정할 수있게 해주는 일종의 기계 학습 알고리즘입니다.강화학습 알고리즘은 일반적으로 시행 착오를 통해 최적의 동작을 학습합니다. 로봇은 일반적으로 장애물에 부딪힌 후에 부정적인 피드백을 받아 충돌을 피할 수있는 로봇과 시행 착오가 플레이어의 보상을 쏠 수있는 특정 동작을 나타내는 비디오 게임에서 사용됩니다. agent는 이러한 보상을 사용하여 게임 플레이의 최적 상태를 이해하고 다음 작업을 선택할 수 있습니다.III. Quantifying the popularity of ML algorithms
이와 같은 설문 조사 보고서는 가장 널리 사용되는 10 가지 데이터 마이닝 알고리즘을 계량화했습니다. 그러나 이러한 목록은 주관적이며 인용된 논문의 경우와 마찬가지로 투표 대상자의 표본 크기는 매우 좁으며 고급 데이터 마이닝 전문가로 구성됩니다. 설문 조사에 참여한 사람들은 ACM KDD Innovation Award, IEEE ICDM Research Contributions Award를 수상했습니다. KDD-06, ICDM'06 및 SDM'06의 프로그램 위원; 그리고 ICDM'06의 145 명의 참석자들.이 블로그의 상위 10 개 알고리즘은 초보자를위한 것이며 주로 뭄바이 대학의 컴퓨터 공학 학사 과정에서 '데이터웨어 하우징 및 마이닝'(DWM) 과정을 통해 배웠습니다. DWM 과정은 ML 알고리즘 분야에 대한 훌륭한 소개입니다. 나는 Kaggle 대회 우승을 위해 최근 2 가지 알고리즘 (앙상블 방법)을 보급했다. 당신이 기사를 즐기시기 바랍니다!IV. Supervised learning algorithms
1. Linear RegressionML에서는 출력 변수 (y)를 결정하는 데 사용되는 입력 변수 집합 (x)이 있습니다. 입력 변수와 출력 변수 사이에는 관계가 있습니다. ML의 목표는 이 관계를 계량화하는 것입니다.Figure 1: Linear Regression is represented as a line in the form of y = ax +b. Source선형 회귀 분석(Linear Regression)에서 입력 변수 (x)와 출력 변수 (y)의 관계는 y = ax + b 형식의 방정식으로 표현됩니다. 따라서 선형 회귀의 목표는 계수 a와 b의 값을 찾아내는 것입니다. 여기서 a는 절편이고 b는 선의 기울기입니다.Figure 1은 데이터 세트의 플롯 된 x 및 y 값을 보여줍니다. 목표는 대부분의 점에 가장 가까운 선을 맞추는 것입니다. 이렇게하면 데이터 요소의 y 값과 선 사이의 거리 ('오류')가 줄어 듭니다.2. Logistic Regression선형 회귀 예측은 연속 값 (강우량 cm 단위)이며, 로지스틱 회귀(Logistic regression) 예측은 변환 함수를 적용한 후 이산 값 (학생의 통과 / 실패 여부)입니다.로지스틱 회귀는 2 진 분류 (y = 0 또는 1 인 데이터 세트, 1은 기본 클래스를 나타냄)에 가장 적합합니다. 예 : 이벤트 발생 여부를 예측할 때 발생하는 이벤트는 1로 분류됩니다. 사람이 아플 것인가 아닌가, 아픈 인스턴스는 1)로 표시됩니다. 이것은 물체 함수 h(x) = 1 / (1 + e^x)라고 불리는 변환 함수의 이름을 딴 S 형 곡선입니다.로지스틱 회귀 분석에서 출력은 기본 클래스의 확률 형태입니다 (선형 회귀와는 달리 출력이 직접 생성됩니다). 확률이므로 출력은 0-1의 범위에 있습니다. 출력 (y 값)은 로지스틱 함수 h(x) = 1 / (1 + e^-x)를 사용하여 x 값을 변환하는 로그에 의해 생성됩니다. 이 확률을 2 진 분류로 강제하기 위해 임계 값이 적용됩니다.Figure 2: Logistic Regression to determine if a tumour is malignant or benign. Classified as malignant if the probability h(x)>= 0.5. SourceFigure 2에서 종양이 악성인지 아닌지를 확인하기 위해 기본 변수는 y = 1 (종양 = 악성 종양)입니다. x 변수는 종양의 크기와 같은 종양의 측정 일 수 있습니다. 그림에서 보듯이 Logistic 함수는 데이터 세트의 다양한 인스턴스의 x 값을 0에서 1의 범위로 변환합니다. 확률이 임계값인 0.5 (수평선으로 표시)를 넘어 서면 악성종양으로 분류됩니다.로지스틱 회귀 방정식 P(x) = e ^ (b0 +b1*x) / (1 + e^(b0 + b1*x)) 는 ln(p(x) / 1-p(x)) = b0 + b1*x 로 변환가능합니다.로지스틱 회귀의 목표는 예측 결과와 실제 결과 간의 오차를 최소화 할 수 있도록 계수 b0 및 b1의 값을 찾기 위해 학습 데이터를 사용하는 것입니다. 이 계수는 최대 우도 추정(Maximum Likelihood Estimation) 기술을 사용하여 추정됩니다.3. CART분류 및 회귀 트리 (CART)는 ID3, C4.5와 같은 다른 것들 중에서 의사 결정 트리를 구현 한 것입니다.비 종단 노드는 루트 노드와 내부 노드입니다. 종단 노드는 리프 노드입니다. 각 비 종단 노드는 단일 입력 변수 (x)와 해당 변수의 분할 점을 나타냅니다. 리프 노드는 출력 변수 (y)를 나타냅니다. 모델은 예측을하기 위해 다음과 같이 사용됩니다. 트리의 분할을 따라 리프 노드에 도달하고 리프 노드에있는 값을 출력합니다.Figure 3의 의사 결정 트리는 나이와 결혼 상태에 따라 사람이 스포츠카 또는 미니 밴을 살 것인지를 분류합니다. 그 사람이 30 년이 넘었고 결혼하지 않았다면 우리는 '30 년 이상?'-> 예 -> '결혼 했습니까?'-> 아니요 를 따라갑니다. 따라서 이 모델은 스포츠카를 출력합니다.Figure 3: Parts of a decision tree. Source4. Naïve Bayes다른 이벤트가 이미 발생 했으므로 이벤트가 발생할 확률을 계산하기 위해 Bayes 'Theorem을 사용합니다. 우리의 사전 지식(d)에 따라 가설(h)이 참이 될 확률을 계산하기 위해 Bayes 'Theorem을 다음과 같이 사용합니다.P(h|d)= (P(d|h) * P(h)) / P(d)- P(h|d) = 사후 확률. 데이터 d가 주어질 때 가설 h의 확률은 참이다. P(h|d)= P(d1| h)* P(d2| h)*....*P(dn| h)* P(d)
- P(d|h) = 있을 수 있는 일. 가설 h가 참인 데이터 d의 확률.
- P(h) = 클래스 사전 확률. 가설 h가 사실일 확률 (데이터에 관계없이)
- P(d) = 예측 확률 사전 확률. 데이터의 확률 (가설에 관계없이)
이 알고리즘은 모든 변수가 서로 독립적이라고 가정하기 때문에 ‘순진한(naive)’알고리즘 이라고 합니다. 이는 실제 사례에서 알 수있는 순진한 가정입니다.Figure 4: Using Naive Bayes to predict the status of ‘play’ using the variable ‘weather’.예를 들어 Figure 4를 사용하면 weather = 'sunny'인 경우 결과는 무엇입니까?To determine the outcome play= ‘yes’ or ‘no’ given the value of variable weather=’sunny’, calculate P(yes|sunny) and P(no|sunny) and choose the outcome with higher probability.변수 weather = 'sunny'의 값이 주어진 결과 play = 'yes'또는 'no'를 통해 결정하려면 P(yes|sunny) 및 P(no|sunny)를 계산하고 더 높은 확률로 결과를 선택하십시오.-> P(yes|sunny) = (P(sunny|yes) * P(yes)) / P(sunny)= (3/9 * 9/14 ) / (5/14)= 0.60-> P(no|sunny) = (P(sunny|no) * P(no)) / P(sunny)= (2/5 * 5/14 ) / (5/14)= 0.40따라서 weather = 'sunny'인 경우 결과는 play = 'yes'입니다.5. KNNk-nearest neighbours 알고리즘은 데이터 세트를 훈련 세트 및 시험 세트로 분할하는 대신 전체 데이터 세트를 훈련 세트로 사용합니다.새로운 데이터 인스턴스에 대한 결과가 필요할 때, KNN 알고리즘은 전체 데이터 세트를 통해 새로운 인스턴스에 대한 k-nearest 인스턴스 또는 새로운 레코드와 가장 유사한 인스턴스의 k 개의 인스턴스를 찾은 다음 분류 문제에 대한 결과 (회귀 문제) 또는 모드 (가장 빈번한 클래스)의 결과를 출력합니다. k 값은 사용자 지정입니다.인스턴스 간의 유사도는 유클리드 거리(Euclidean distance) 및 해밍 거리(Hamming distance)와 같은 측정 값을 사용하여 계산됩니다.V. Unsupervised learning algorithms:
6. AprioriApriori 알고리즘은 트랜잭션 데이터베이스에서 항목 집합을 마이닝 한 다음 연결 규칙을 생성하는 데 사용됩니다. 일반적으로 데이터베이스에서 동시에 발생하는 제품 조합을 확인하는 시장 바구니 분석에 널리 사용됩니다. 일반적으로 '아이템 X를 구매한 사람이 아이템 Y를 구매하면 X -> Y'라는 연관 규칙을 씁니다.예 : 우유와 설탕을 구입하면 커피 가루를 구매할 가능성이 있습니다. 이것은 "{우유, 설탕} -> 커피 가루"와 같은 연관 규칙의 형태로 작성 될 수 있습니다. 연결 규칙은 지원 및 신뢰를 위해 임계 값을 초과 한 후에 생성됩니다.Figure 5: Formulae for support, confidence and lift for the association rule X->Y. Source지원 척도는 빈번한 항목 집합 생성 중에 고려해야 할 후보 항목 집합 수를 잘라내는데 도움이됩니다. 이 지원 척도는 Apriori 원칙에 의거합니다. Apriori 원리는 항목 집합이 자주 발생하면 모든 하위 집합도 빈번히 발생해야한다고 규정합니다.7. K-meansK-means는 유사한 데이터를 클러스터로 그룹화하는 반복 알고리즘입니다. 이것은 k 클러스터의 중심을 계산하고 중심과 데이터 포인트 사이의 거리가 가장 짧은 클러스터에 데이터 포인트를 할당합니다.Figure 6: Steps of the K-means algorithm. SourceStep 1: k-means 초기화:- k 값을 선택하십시오. 여기에서 k = 3을 취합니다.
- 무작위로 각 데이터 포인트를 3 개의 클러스터 중 하나에 지정하십시오.
- 각 클러스터에 대해 클러스터 중심을 계산하십시오. 빨강, 파랑 및 녹색 별은 3 개의 클러스터 각각에 대한 중심을 나타냅니다.
Step 2: 각 관측치를 하나의 클러스터에 연관시키기:각 점을 가장 가까운 클러스터 중점으로 재 할당하십시오. 여기서 상위 5 점은 파란색의 중심이있는 클러스터에 할당되었습니다. 동일한 절차에 따라 적색 및 녹색 색상 중심을 포함하는 클러스터에 포인트를 지정하십시오.Step 3: 중심의 재 계산:새 클러스터의 중심을 계산하십시오. 이전 중심선은 회색 별으로 표시되고 새 중심선은 빨간색, 녹색 및 파란색 별입니다.Step 4: 변화가 없을때 까지 반복합니다.한 클러스터에서 다른 클러스터로 포인트가 전환되지 않을 때까지 2-3 단계를 반복하십시오. 2 개의 연속 단계에 대한 스위칭이 없으면 k-means 알고리즘을 종료합니다.8. PCAPCA (Principal Component Analysis)는 변수 수를 줄임으로써 데이터를 쉽게 탐색하고 시각화하는 데 사용됩니다. 이는 '주 구성 요소'라는 축이있는 새로운 좌표 시스템에 데이터의 최대 분산을 캡처하여 수행됩니다. 각 구성 요소는 원래 변수의 선형 조합이며 서로 직교합니다. 구성 요소 간의 직교 관계는 이러한 구성 요소 간의 상관 관계가 0임을 나타냅니다.첫 번째 주성분은 데이터의 최대 가변성의 방향을 포착합니다. 두 번째 주 구성 요소는 데이터의 나머지 분산을 캡처하지만 첫 번째 구성 요소와 상관 관계가없는 변수가 있습니다. 마찬가지로 모든 연속 주성분 (PC3, PC4 등)은 이전 구성 요소와 상관 관계가없는 동안 나머지 변이를 포착합니다.Figure 7: The 3 original variables (genes) are reduced to 2 new variables termed principal components (PC's). SourceVI. Ensemble learning techniques:
앙상블은 여러 명의 학습자(분류자)의 결과를 투표 또는 평균화하여 결과를 향상시키는 것을 의미합니다. 분류 과정에서 투표가 사용되며 회귀 중에는 평균이 사용됩니다. 아이디어는 학습자의 앙상블이 단일 학습자보다 잘 수행된다는 것입니다.앙상블 알고리즘에는 Bagging, Boosting 및 Stacking의 세 가지 유형이 있습니다. 여기에 '스태킹'을 다루지는 않겠지만, 자세한 설명이 필요하면 아래의 댓글 섹션에서 알려주십시오. 별도의 블로그를 작성할 수 있습니다.9. Bagging with Random ForestsRandom Forest(다중 학습자)는 포기된 의사 결정 트리(한 명의 학습자)에 비해 개선 된 기능입니다.Bagging : Bagging의 첫 번째 단계는 Bootstrap 샘플링 메서드를 사용하여 생성된 데이터 세트로 여러 모델을 만드는 것입니다. Bootstrap 샘플링에서 생성된 각 trainingset은 원본 데이터 세트의 무작위 하위 샘플로 구성됩니다. 이러한 각 트레이닝 세트는 원본 데이터 세트와 크기가 같지만 일부 레코드는 여러번 반복되고 일부 레코드는 전혀 나타나지 않습니다. 그런 다음 원본 데이터 집합 전체가 테스트 집합으로 사용됩니다. 따라서 원본 데이터 세트의 크기가 N이면 각 생성 된 trainingset의 크기는 N이며 고유 레코드 수가 약 (2N/3)입니다. testset의 크기도 N입니다.Bagging의 두 번째 단계는 서로 다르게 생성된 trainingsets에서 동일한 알고리즘을 사용하여 여러 모델을 만드는 것입니다. 이 경우, Random Forest에 대해 논의합시다. 각 노드가 오류를 최소화하는 최상의 기능으로 분할된 의사 결정 트리와 달리 Random Forest에서는 최상의 분할을 구성하기 위해 임의의 기능 선택을 선택합니다. 무작위성에 대한 이유는: Bagging을 사용하는 경우에도 결정 트리가 분리 할 수있는 최상의 기능을 선택할 때 유사한 구조와 상관 된 예측으로 끝납니다. 그러나 기능의 무작위 하위 집합에서 분할 한 후 포기한다는 것은 하위 트리의 예측 간의 상관 관계가 적다는 것을 의미합니다.각 분할 지점에서 검색할 기능의 수는 Random Forest 알고리즘에 대한 매개 변수로 지정됩니다.따라서 Random Forest로 포기할 때 각 트리는 임의의 레코드 샘플을 사용하여 구성되며 각 분할은 예측기의 무작위 샘플을 사용하여 구성됩니다.10. Boosting with AdaBoosta) 각 모델은 독립적으로 구성되기 때문에 bagging은 병렬 앙상블입니다. 반면, 부스팅은 각 모델이 이전 모델의 오분류를 수정하여 만들어지는 순차적 앙상블입니다.b) 대부분의 분류는 평행 모델의 대다수에 의해 결정되는 최종 결과를 얻기 위해 각 분류자가 투표하는 '단순 투표'를 주로 포함한다. 부스팅은 '가중 투표 (weighted voting)'를 포함하는데, 여기서 각 분류자는 다수결에 의해 결정되는 최종 결과를 얻기 위해 투표하지만 순차적 모델은 이전 모델의 오분류 된 인스턴스에 더 큰 가중치를 할당함으로써 구축되었습니다.Adaboost는 Adaptive Boosting의 약자입니다.Figure 9: Adaboost for a decision tree. SourceFigure 9에서 1, 2, 3 단계는 의사 결정 도형이라고 불리는 약한 학습자를 포함합니다 (단 하나의 입력 특징의 값을 기반으로 한 예측을하는 1- 레벨 의사 결정 트리, 루트에 바로 연결되는 의사 결정 트리) . 약한 학습자를 구성하는 과정은 사용자가 정의한 수의 약한 학습자가 구성되거나 교육을받는 동안 더 이상의 개선이 없을 때까지 계속됩니다. 4 단계는 이전 모델의 3 가지 결정 스텀프(stump)를 결합합니다 (따라서 의사 결정 트리에서 3 가지 분할 규칙이 있음).Step 1: 1 개의 결정 트리 스텀프에서 시작하여 1 개의 입력 변수에 대한 결정:데이터 포인트의 크기는 동등한 가중치를 적용하여 원 또는 삼각형으로 분류했음을 보여줍니다. 결정 스텀프는 이 점들을 분류하기 위해 상단에 수평선을 생성했습니다. 삼각형으로 잘못 예측된 2 개의 원이 있음을 알 수 있습니다. 따라서 우리는 이 두 원에 더 높은 가중치를 할당하고 다른 결정 스텀프를 적용 할 것입니다.Step 2: 다른 입력 변수에 대한 결정을 내리려면 다른 의사 결정 트리 스텀프로 이동하십시오.:우리는 이전 단계에서 잘못 분류된 2 개의 원의 크기가 나머지 점보다 큰 것을 관찰합니다. 자, 2차 결정 스텀프는 이 2 개의 동그라미를 올바르게 예측하려고 시도 할 것입니다.더 높은 가중치를 할당한 결과,이 두 원은 왼쪽의 수직선으로 올바르게 분류되었습니다. 그러나 이것이 결과적으로 상단의 3 개의 원을 잘못 분류하는 결과를 낳았습니다. 따라서 우리는 상단에있는 이 3 개의 원에 더 높은 가중치를 할당하고 다른 결정 스텀프를 적용 할 것입니다.Step 3: 또 다른 의사 결정 나무 스텀프를 훈련시켜 다른 입력 변수에 대한 결정을 내립니다.이전 단계에서 잘못 분류된 3 개의 원이 나머지 데이터 요소보다 큽니다. 이제 원형과 삼각형을 분류하기 위해 오른쪽 수직선이 생성되었습니다.Step 4: 결정 스텀프를 결합하십시오:세 개의 이전 모델의 분리 기호를 결합하여 이 모델의 복잡한 규칙이 개별 약자 학습자와 비교하여 데이터 포인트를 올바르게 분류한다는 것을 관찰했습니다.VII. Conclusion:
요약하면, 우리는 다음과 같은 것을 배웠습니다.- 5 supervised learning techniques- Linear Regression, Logistic Regression, CART, Naïve Bayes, KNN.
- 3 unsupervised learning techniques- Apriori, K-means, PCA.
- 2 ensembling techniques- Bagging with Random Forests, Boosting with XGBoost.
다음 블로그에서 우리는 Kaggle 대회에서 분노한 기술, XGBoost 알고리즘에 대해 배웁니다.반응형'MACHINE LEARNING' 카테고리의 다른 글
기계 학습 이론 및 그 응용에 대한 소개 : 예제를 포함한 시각적인 학습서 (0) 2017.10.31 딥 러닝 튜토리얼 : 퍼셉트론에서부터 딥 네트워크까지 (0) 2017.10.29 Tensorflow Text Classification – Python Deep Learning (0) 2017.10.20 Sigma - 처음부터 시스템 학습 프레임 워크 만들기 (고등학교 논문 조언 스레드 업데이트) (0) 2017.09.24 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다. from Yongho Ha (0) 2017.09.11