English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 결정 트리 분류 알고리즘 학습

이 장부터는 공식적인 알고리즘 학습에 접근합니다.

먼저, 표준적이고 효과적인 분류 알고리즘을 배웁니다: 결정 트리 분류 알고리즘.

1와 결정 트리 알고리즘

결정 트리는 트리 구조를 사용하여 샘플의 속성을 분류합니다. 이는 가장 직관적인 분류 알고리즘 중 하나로, 회귀에도 사용할 수 있습니다. 그러나 특정 논리 분류에 대해서는 어려울 수 있습니다. 유형적인 예로는 XOR 논리, 결정 트리는 이러한 문제를 해결하는 데 능숙하지 않습니다.
결정 트리 구축은 유일하지 않으며, 가장 좋은 결정 트리 구축은 NP 문제입니다. 따라서 좋은 결정 트리를 어떻게 구축하는지는 연구의 중점입니다.
J. Ross Quinlan이1975는 정보 엔트로피 개념을 결정 트리 구축에 도입하였습니다. 이는 유명한 ID3알고리즘. 이후의 C4.5, C5.0, CART 등은 이 방법의 개선입니다.

엔트로피는 "무질서, 혼란"의 정도입니다. 이 개념을 처음 접했을 때는 혼란스러울 수 있습니다. 정보 엔트로피 증가를 사용하여 속성을 구분하는 방법을 빠르게 이해하려면, 이 분자의 글을 참고하세요: Python 머신러닝의 결정 트리 알고리즘

아직 이해가 안 되는 경우, 아래의 예제를 참고하세요.

이렇게 자동으로 좋은 사과를 선택하는 결정 트리를 구축하려면, 간단하게만 해서 저는 아래와 같은 것만 학습시키도록 했습니다.4개의 샘플:
샘플    홍     대      좋은 사과 
0         1        1         1 
1         1        0         1 
2         0        1         0 
3         0        0         0 

샘플에2개의 속성이 있습니다. A0은 대형 사과인지 여부를 나타냅니다. A1대형 사과인지 여부를 나타냅니다.

따라서 이 샘플이 분류 전의 정보 엔트로피는 S = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1입니다.

정보 엔트로피는1최대混乱, 최소 정리된 상태를 나타냅니다.

이 예제에서는 단지2개의 속성이 있습니다. 따라서 자연스럽게 총으로는2그림으로 표시된 결정 트리를 사용합니다:

명백히 왼쪽이 A0(빨간색)을 구분 기준으로 사용하는 결정 트리가 오른쪽 A1결정 트리를 구분 기준으로 사용하는 (크기)
물론 이는 직관적인 인식입니다. 정량적인 검토는 각 구분 상황의 정보 엔트로피 증가를 계산해야 합니다.
먼저 A0을 구분 기준으로 선택하고, 각 서브 노드 정보 엔트로피 계산은 다음과 같습니다:
0,1leaf node에2개의 양성 예제, 0개의 음성 예제. 정보 엔트로피는: e1 = -(2/2 * log(2/2) + 0/2 * log(0/2)) = 0。
2,3leaf node에 0개의 양성 예제가 있습니다.2개의 음성 사례. 정보熵는: e2 = -(0/2 * log(0/2) + 2/2 * log(2/2)) = 0。

따라서 A0 구분 후의 정보 엔트로피는 각 서브 노드 정보 엔트로피의 비율을 더한 가중평균으로 선택됩니다: E = e1*2/4 + e2*2/4 = 0。
A0를 선택하여 구분하는 정보熵 증가 G(S, A0) = S - E = 1 - 0 = 1.

사실, 결정 트리의 잎 노드는 모두 동일한 카테고리에 속해 있으므로 정보熵은 항상 0입니다.

동일하게, A를 먼저 선택하면1구분을 하여 각 서브 노드의 정보熵 계산은 다음과 같습니다:
0,2서브 노드가1개의 긍정 사례,1개의 음성 사례. 정보熵는: e1 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1입니다.
1,3서브 노드가1개의 긍정 사례,1개의 음성 사례. 정보熵는: e2 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1입니다.
따라서 A를 선택합니다1구분 후의 정보熵은 각 서브 노드의 정보熵의 비율을 가진 가중 평균입니다: E = e1*2/4 + e2*2/4 = 1也就是说分了跟没分一样!
A를 선택합니다1구분을 하는 정보熵 증가 G(S, A1)=S - E = 1 - 1 = 0.
따라서, 각각의 구분 전에 정보�� 증가가 가장 큰 구분을 계산할 필요가 있습니다.

2데이터 세트

설명과 이해를 위해 매우 간단한 테스트 데이터 세트를 사용합니다:
1.5 50 thin 
1.5 60 fat 
1.6 40 thin 
1.6 60 fat 
1.7 60 thin 
1.7 80 fat 
1.8 60 thin 
1.8 90 fat 
1.9 70 thin 
1.9 80 fat 

이 데이터는 총10개의 샘플이 있으며, 각 샘플은2개의 속성이 있으며, 각각 높이와 체중입니다. 세 번째 열은 카테고리 태그로, 'fat' 또는 'thin'을 나타냅니다. 이 데이터는 다음에 저장되어 있습니다:1.txt에 있습니다.

우리의 작업은 결정 트리 분류기를 훈련시키는 것입니다. 높이와 체중을 입력하면, 분류기가 이 사람이 풀지 않은 사람인지 판단할 수 있습니다.
(데이터는 저의 주관적인 추측이며 일정한 논리가 있지만, 그 합리성을 무시해 주세요)

결정 트리는 '는지아니지' 이진 논리 분기가 매우 자연스럽습니다. 그러나 이 데이터 집합에서 높이와 체중이 연속 값을 가지면 어떻게 될까요?

잘못되었지만 문제가 아니라, 이 연속 값을 다른 구간으로 나누는 중간 점을 찾으면 이진 논리 문제로 변환됩니다.
이 예제에서는 높이와 체중의 일부 경계 값을 찾아, 이 경계 값보다 크거나 작은 논리로 샘플을 두둥이로 분류하여 결정 트리를 상단에서 하단으로 구축하는 작업입니다.

Python의 기계 학습 라이브러리를 사용하여 매우 간단하고 우아하게 구현할 수 있습니다.

3Python 구현

아래는 Python 코드 구현입니다:

# -*- coding: utf-8 -*- 
import numpy as np 
import scipy as sp 
from sklearn import tree 
from sklearn.metrics import precision_recall_curve 
from sklearn.metrics import classification_report 
from sklearn.cross_validation import train_test_split 
''''' 데이터 입력 ''' 
data  = [] 
labels = [] 
with open("data\\1.txt)을 ifile로 사용합니다: 
    for line in ifile: 
      tokens = line.strip().split(' ') 
      data.append([float(tk) for tk in tokens[:-1]) 
      labels.append(tokens[-1]) 
x = np.array(data) 
labels = np.array(labels) 
y = np.zeros(labels.shape) 
'''라벨을 0으로 변환합니다'''/1 ''' 
y[labels=='fat'] =1 
'''훈련 데이터와 테스트 데이터를 분할합니다''' 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2) 
'''정보 엔트로피를 사용하여 결정 트리를 훈련합니다''' 
clf = tree.DecisionTreeClassifier(criterion='entropy') 
print(clf) 
clf.fit(x_train, y_train) 
'''결정 트리 구조를 파일에 쓰기''' 
with open("tree.dot", 'w') as f: 
  f = tree.export_graphviz(clf, out_file=f) 
'''계수는 각 특징의 영향력을 반영합니다. 더 크면 해당 특징이 분류에서更大的 역할을 한다는 의미입니다''' 
print(clf.feature_importances_) 
'''테스트 결과 출력''' 
answer = clf.predict(x_train) 
print(x_train) 
print(answer) 
print(y_train) 
print(np.mean(answer == y_train)) 
'''정확도와召回률''' 
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train)) 
answer = clf.predict_proba(x)[:,1] 
print(classification_report(y, answer, target_names = ['slender', 'fat'])) 

출력 결과는 아래와 같이 보일 것입니다:
[ 0.2488562  0.7511438]
array([[  1.6,  60. ],
       [  1.7,  60. ],
       [  1.9,  80. ],
       [  1.5,  50. ],
       [  1.6,  40. ],
       [  1.7,  80. ],
       [  1.8,  90. ],
       [  1.5,  60. ])
array([ 1, 0.,  1, 0., 0.,  1,  1,  1.])
array([ 1, 0.,  1, 0., 0.,  1,  1,  1.])
1.0
             precision    recall  f1-score   support
       thin       0.83      1.00      0.91         5
        fat        1.00      0.80      0.89         5
avg / total       1.00      1.00      1.00         8
array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0., 0.])
array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0.,  1.])

에서, 훈련된 데이터에 대한 테스트에서 정확률은100%입니다. 그러나 모든 데이터를 테스트한 마지막에는1개의 테스트 샘플이 분류되지 않았습니다.
이 예제의 결정 트리는 훈련 집합의 규칙을 잘 흡수했지만, 예측성은 약간 떨어졌습니다.
이 있습니다.3점을 설명드리겠습니다. 이는 이후의 기계 학습에서도 사용됩니다.

1로 훈련 데이터와 테스트 데이터를 분할.

이를 통해 교차 검증을 쉽게 할 수 있습니다. 교차 검증은 분류기의 안정성을 충분히 테스트하기 위해 사용됩니다.
코드에서의 0.2은 무작위로 선택된 것을 의미합니다20%의 데이터를 테스트용으로 사용했습니다. 나머지80%를 훈련 결정 트리에 사용했습니다.
즉10개의 샘플에서 무작위로 선택8번의 훈련을 수행했습니다. 이 데이터 셋은 작기 때문에, 훈련 데이터를 무작위로 선택하면 각 번째에 대해 다른 결정 트리가 생성된다는 것을 볼 수 있습니다.

2와 특성의 다른 영향 요인.

샘플의 다른 특성이 분류에 미치는 영향 가중치는 매우 다릅니다. 분류가 끝난 후 각 샘플이 분류에 미치는 영향을 볼 것도 중요합니다.
이 예제에서는 높이의 가중치가 0.25으로, 체중은 0.75에서, 무게의 중요성이 훨씬 높다는 것을 볼 수 있습니다. 비만도를 판단하는 데 있어 이는 매우 논리적입니다.

3와 정확률 및召回률.

이2개의 값은 분류 정확률을 평가하는 중요한 기준입니다. 예를 들어 코드의 마지막에 모든10개의 샘플을 분류기에 테스트한 결과:
테스트 결과: array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0., 0.])
실제 결과: array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0.,  1.])
thin으로 분류된 정확률이 0.83이유는 분류기가6개의 thin이 있었고, 그 중 올바른 것이5개가 있었기 때문에 thin으로 분류된 정확률이5/6=0.83입니다.
thin으로 분류된召回률이1.00입니다. 데이터 셋에5개의 thin이 있었지만, 분류기는 모두를 올바르게 분류했습니다(하지만 한 개의 fat를 thin으로 나눈 것!),召回률5/5=1입니다.
fat로 분류된 정확률이1.00입니다. 더 설명하지 않겠습니다.
fat로 분류된召回률이 0.80이기 때문에 데이터 셋에5개의 fat가 있었지만, 분류기는4개(한 개의 fat를 thin으로 나눈 것!),召回률4/5=0.80.
때로는 특히 데이터 분류가 어려운 경우, 정확도와召回율은 대립적입니다. 필요에 따라 최적의 균형점을 찾아야 할 수 있습니다.
예를 들어, 이 예제에서, 목표는 찾아낸 두꺼운 사람이 진짜 두꺼운 사람인지(정확도) 보장하는 것이 아니라, 가능한 많은 두꺼운 사람을 찾는 것이 되어야 합니다(召回율).

이 코드는 결정 트리 구조를 tree.dot에 기록했습니다. 이 파일을 엽니다. 결정 트리를 쉽게 그릴 수 있으며, 결정 트리의 더 많은 분류 정보도 볼 수 있습니다.
이 문서의 tree.dot는 다음과 같습니다:

digraph Tree { 
0 [label="X[1] <= 55.0000\nentropy = 0.954434002925\nsamples = 8", shape="box"] ; 
1 [label="entropy = 0.0000\nsamples = 2\nvalue = [ 2. 0.]", shape="box"] ; 
0 -> 1 ; 
2 [label="X[1] <= 70.0000\nentropy = 0.650022421648\nsamples = 6", shape="box"] ; 
0 -> 2 ; 
3 [label="X[0] <= 1.6500\nentropy = 0.918295834054\nsamples = 3", shape="box"] ; 
2 -> 3 ; 
4 [label="entropy = 0.0000\nsamples = 2\nvalue = [ 0. 2.]", shape="box"] ; 
3 -> 4 ; 
5 [label="entropy = 0.0000\nsamples = 1\nvalue = [ 1. 0.]", shape="box"] ; 
3 -> 5 ; 
6 [label="entropy = 0.0000\nsamples = 3\nvalue = [ 0. 3.]", shape="box"] ; 
2 -> 6 ; 
} 

이 정보에 따르면, 결정 트리는 다음과 같이 되어야 합니다:

이것이 이 문서의 전부입니다. 여러분의 학습에 도움이 되길 바라며, 다음에도 많이 지지해 주시길 바랍니다. 익사라 강의.

선언: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 모두입니다. 내용은 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용을 발견하면, 이메일을 보내 주시기 바랍니다: notice#oldtoolbag.com(메일을 보내면, #을 @으로 변경하십시오. 신고를 해 주시고 관련 증거를 제공하십시오. 사실을 확인하면, 이 사이트는 즉시 위반된 내용을 제거합니다。)

추천 합니다