기계 학습 의 결정 트 리 분석 Python 실현

환경 준비
공 부 를 시작 하기 전에 상응하는 환경 설정 을 준비 해 야 한다.여기 서 저 는 anaconda 를 선택 하여 기계 학습 을 위 한 전문 적 인 가상 환경 을 만 들 었 습 니 다.아 나 콘 다 의 설치 등에 대해 서 는 군더더기 없 이 어렵 지 않다.
2.결정 트 리 가 무엇 입 니까?
쉽게 말 하면 학습 을 독촉 하 는 방법 은 답 을 아 는 토대 에서 모형 훈련 을 하 는 라벨 이 필요 하 다 는 것 이다.결정 트 리 는 데이터 에서 특정한 특징 을 읽 고 이런 특징 에 따라 결정 규칙 을 정리 한 다음 에 나무 구 조 를 사용 하여 나타 내 는 것 이다.
3.빠 른 입문 분류 수
강력 한 sklearn 라 이브 러 리 덕분에 결정 트 리 를 사용 하 는 알고리즘 은 매우 간단 합 니 다.

여기 서 우 리 는 와인 데이터 세트 를 도입 했다.이것 은 아주 작은 데이터 세트 이다.

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()
그리고 우 리 는 데이터 세트 가 어떻게 생 겼 는 지 볼 수 있다.

wine.data.shape
(178, 13)
wine.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2])
하지만 이렇게 보면 직관 적 이지 않 은 것 같다.우 리 는 pandas 를 사용 하여 표 형식 으로 변환 합 니 다.

import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)

이 데이터 세트 는 178 줄,14 열 에 불과 하 다.데이터 양은 여전히 매우 적다.마지막 열 은 우리 의 태그 이 고 모든 숫자 는 구체 적 인 분류 에 대응 합 니 다.

wine.feature_names
['alcohol',
 'malic_acid',
 'ash',
 'alcalinity_of_ash',
 'magnesium',
 'total_phenols',
 'flavanoids',
 'nonflavanoid_phenols',
 'proanthocyanins',
 'color_intensity',
 'hue',
 'od280/od315_of_diluted_wines',
 'proline']
각 열 에 대응 하 는 특징 을 볼 수 있다.예 를 들 어 0 번 열 에 대응 하 는 것 은 바로 알코올 함량 이다.다른 것 은 이런 식 으로 유추 한다.
데이터 세트 를 다 본 후에 우 리 는 직접 훈련 모델 에 착수 하 자!

x_train,x_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test) #         accuracy
먼저 테스트 집합,즉 첫 번 째 줄 코드 를 나눈다.그리고 우 리 는 함 수 를 호출 하여 fit 로 훈련 하고 score 로 점 수 를 매 긴 다.이 코드 를 실행 하면 우 리 는 몇 점 을 얻 었 는 지 봅 시다.

90%의 정확도 가 여전히 매우 높다.
그 러 고 보 니 직관 적 이지 않 은 것 같 군.우 리 는 이 나 무 를 그 릴 수 있다.

feature_name = ['  ','   ',' ','    ',' ','  ','   ','      ','   ','    ','  ','od280/od315     ','   ']
import graphviz
# filled    rounded   
dot_data = tree.export_graphviz(clf
                                ,feature_names=feature_name
                                ,class_names=["  ","  ","    "]
                                ,filled=True
                                ,rounded=True
                               )
graph = graphviz.Source(dot_data)
graph
여기 서 우 리 는 graphviz 가방 을 도입 하여 우리 가 방금 결정 한 나 무 를 그 렸 다.

이곳 의 클 라 스 는 마음대로 쓴 것 이 니 너 도 다른 것 을 쓸 수 있다.
4.입문 사례 를 상세 하 게 분석한다.
우리 나 무 는 모든 특징 을 사용 하지 않 고 네 다섯 개의 모습 만 사용 한 것 으로 보인다.우 리 는 하나의 함 수 를 사용 하여 모든 특징의 백분율 을 볼 수 있다.

clf.feature_importances_
array([0.        , 0.        , 0.03388406, 0.        , 0.        ,
       0.        , 0.42702463, 0.        , 0.        , 0.24446215,
       0.        , 0.        , 0.29462916])
우 리 는 네 가지 특징 만 사용 해 나무 하 나 를 얻 었 다 는 것 을 알 수 있다.이렇게 보면 직관 적 이지 않 은 것 같 습 니 다.우 리 는 zip 함수 와 대응 하 는 특징 으로 연결 합 니 다.

[*zip(feature_name,clf.feature_importances_)]
[('  ', 0.0),
 ('   ', 0.0),
 (' ', 0.03388405728736582),
 ('    ', 0.0),
 (' ', 0.0),
 ('  ', 0.0),
 ('   ', 0.42702463433869187),
 ('      ', 0.0),
 ('   ', 0.0),
 ('    ', 0.24446214572197708),
 ('  ', 0.0),
 ('od280/od315     ', 0.0),
 ('   ', 0.29462916265196526)]
이렇게 하면 우 리 는 가장 큰 비례 를 차지 하 는 것 이 결정 나무의 뿌리 부분 을 구성 한 다음 에 이런 식 으로 유추 하 는 것 을 발견 할 수 있다.
5.분류 트 리 파라미터 해석
5.1、criterion
표를 나무 로 바 꾸 기 위해 서 는 결정 트 리 가 가장 좋 은 노드 와 가장 좋 은 가지 나 누 는 방법 을 찾 아야 한다.분류 트 리 에 있어 서 이'가장 좋 은'지 표를'순도 없 는'이 라 고 부른다.일반적으로 순도 가 낮 을 수록 결정 트 리 는 훈련 집 에 적합 하 다.현재 사용 하고 있 는 결정 트 리 알고리즘 은 가지 나 누 는 방법 에서 핵심 은 대부분이 순도 가 높 지 않 은 관련 기준 에 대한 최적화 에 중심 을 두 고 있다.
이른바 순도 가 없 는 개념 을 이해 하지 않 는 다.이 매개 변 수 는 우리 에 게 두 가지 수치 가 있다.entropy 와 gini.그렇다면 이 두 가지 알고리즘 은 어떤 차이 가 있 습 니까?
지 니 계수 에 비해 정보 엔 트로피 는 순도 에 민감 하고 순도 에 대한 징벌 이 가장 강하 다.그러나 실제 사용 에서 정보 엔트로피 와 지 니 계수 의 효 과 는 대체적으로 같다.정보 엔트로피 의 계산 은 비키니 계수 가 좀 느리다.왜냐하면 지 니 계수 의 계산 은 대수 와 관련 이 없 기 때문이다.또한 정보 엔트로피 는 순도 에 더욱 민감 하기 때문에 정보 엔트로피 를 기준 으로 할 때 결정 트 리 의 성장 이 더욱'정교 하 다'.따라서 고 차원 데이터 나 소음 이 너무 많은 데이터 에 대해 정보 엔트로피 는 쉽게 적합 하고 지 니 계 수 는 이런 상황 에서 효과 가 비교적 좋다.모델 의 적합 도가 부족 할 때 모델 이 훈련 집 과 테스트 집에 서 잘 표현 되 지 않 을 때 정보 엔트로피 를 사용한다.물론 이것 은 절대적 인 것 이 아니다.
간단하게 말 하면,우 리 는 인삼 을 조정 할 때 두 개 를 모두 시험 해 볼 수 있 으 며,기본 값 은 gini 이다.이 두 알고리즘 은 사실 어떤 것 을 사용 하 라 고 절대적 으로 말 하지 않 았 기 때문이다.
5.2、random_state & splitter
random_state 는 가지 에 있 는 랜 덤 모드 의 매개 변 수 를 설정 하 는 데 사 용 됩 니 다.기본 적 인 None 는 높 은 차원 에서 랜 덤 으로 나타 나 고 낮은 차원 의 데이터(예 를 들 어 아이 리 스 데이터 세트)는 랜 덤 성 이 거의 나타 나 지 않 습 니 다.임의의 정 수 를 입력 하면 같은 나무 가 계속 자라 모형 을 안정 시 킵 니 다.
splitter 도 결정 트 리 의 무 작위 옵션 을 제어 하 는 데 사 용 됩 니 다.두 가지 입력 값 이 있 습 니 다.'best'를 입력 하 십시오.결정 트 리 는 가 지 를 나 눌 때 무 작위 이지 만 더 중요 한 특징 을 우선 선택 하여 가 지 를 나 눌 수 있 습 니 다.(중요성 은 속성 featureimportances_보기)'random'을 입력 하면 의사 결정 트 리 가 가 지 를 나 눌 때 더욱 무 작위 로 되 고 나 무 는 불필요 한 정 보 를 더 많이 포함 하기 때문에 더욱 깊 고 더 크 며 이런 불필요 한 정보 로 인해 훈련 집 에 대한 적합 도 를 낮 출 수 있 습 니 다.이것 도 역시 의합 을 방지 하 는 한 방식 이다.
이 두 개의 매개 변 수 는 나무의 모형 을 안정 시 키 고 모형 을 더욱 잘 사용 할 수 있다.

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=0
                                  ,splitter="random"
                                 )
clf = clf.fit(x_train, y_train)
score = clf.score(x_test, y_test)
score
예 를 들 어 우리 가 인 자 를 추가 한 후에 다시 실행 합 니 다.

정확도 가 98%까지 날 아 간 것 을 발견 할 수 있다.이것 은 우리 의 매개 변수의 조정 이 여전히 매우 유용 하 다 는 것 을 설명 한다.
5.3,가지치기 파라미터
제한 없 이 결정 나 무 는 순도 가 높 지 않 은 지 표를 평가 하 는 것 이 가장 좋 거나 더 많은 특징 이 없 을 때 까지 자란 다.이런 결정 트 리 는 종종 적합 하 다.훈련 집에 서 는 잘 하고 테스트 집에 서 는 엉망 이 된다 는 것 이다.우리 가 수집 한 견본 데 이 터 는 전체적인 상황 과 완전히 일치 할 수 없 기 때문에 결정 트 리 가 훈련 데이터 에 대해 너무 우수한 해석 성 을 가지 면 그 가 찾 아 낸 규칙 은 반드시 훈련 견본 중의 소음 을 포함 하고 알 수 없 는 데이터 에 대한 적합 도가 부족 하 다.
쉽게 말 하면 우 리 는 결정 트 리 에 대해 제한 을 해 야 한다.그 가 무제 한 성장 하 게 해 서 는 안 된다.그렇지 않 으 면 모델 이 너무 적합 하 게 만 들 뿐이다.
max_depth:
나무의 최대 깊이 를 제한 하고 깊이 를 설정 한 나 뭇 가 지 를 모두 잘라 낸다.이것 은 가장 광범 위 하 게 사용 되 는 가지치기 매개 변수 로 실제 사용 은 3 부터 시도 하 는 것 을 권장 합 니 다.
min_samples_leaf & min_samples_split:
min_samples_leaf 한정,한 노드 가 가 지 를 나 눈 후의 모든 하위 노드 는 최소 min 을 포함해 야 합 니 다.samples_leaf 개 훈련 샘플,그렇지 않 으 면 가지 가 발생 하지 않 거나,가 지 는 모든 하위 노드 에 min 을 포함 합 니 다.samples_leaf 개 견본 의 방향 으로 발생 합 니 다.
min_samples_split 한정,한 노드 에 최소 min 이 포함 되 어야 합 니 다.samples_split 개 훈련 샘플 입 니 다.이 노드 는 가지 로 나 눌 수 있 습 니 다.그렇지 않 으 면 가지 가 나 누 어 지지 않 습 니 다.
이 말 은 보기에 매우 빙빙 돌려 보인다.우 리 는 코드 를 결합 한다.

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 ,max_depth=4
                                #,min_samples_leaf=12
                                  #,min_samples_split=10
                                  ,
                                 )
clf = clf.fit(x_train, y_train)
dot_data = tree.export_graphviz(clf
                                ,feature_names= feature_name
                                ,class_names=["  ","  ","    "]
                                ,filled=True
                                ,rounded=True
                               )
graph = graphviz.Source(dot_data)
graph
혼자 뛰 어 다 닐 수 있어.이해 해.
max_features & min_impurity_decrease:
max_features 가 가 지 를 제한 할 때 고려 하 는 특징 개 수 는 제한 개 수 를 초과 하 는 특징 이 모두 버 려 집 니 다.maxdepth 이 곡 동공,maxfeatures 는 고 차원 데이터 의 과 의합 을 제한 하 는 가지치기 매개 변수 이지 만 그 방법 은 비교적 폭력 적 이 고 사용 할 수 있 는 특징 수량 을 직접 제한 하여 결정 트 리 를 강제로 멈 추 게 하 는 매개 변수 이다.결정 트 리 의 각 특징의 중요성 을 모 르 는 상황 에서 이 매개 변 수 를 강제로 설정 하면 모델 학습 이 부족 할 수 있다.만약 에 차원 을 낮 추 는 방식 으로 의합 을 방지 하려 면 PCA,ICA 또는 특징 선택 모듈 의 차원 을 낮 추 는 알고리즘 을 사용 하 는 것 을 권장 합 니 다.
그러나 우 리 는 어떻게 매개 변수 가 가장 좋 은 것 이 라 고 확정 합 니까?우 리 는 그림 을 그 리 는 방식 으로 볼 수 있다.

import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
test = []
for i in range(50):
    clf = tree.DecisionTreeClassifier(max_depth=4
                                      ,criterion="entropy"
                                      ,random_state=30
                                      ,splitter="random"
                                      ,min_samples_leaf=i+5
                                     )
    clf = clf.fit(x_train, y_train)
    score = clf.score(x_test, y_test)
    test.append(score)

x_major_locator=MultipleLocator(2)
plt.plot(range(1,51),test,color="green",label="min_samples_leaf")
ax=plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.legend()
plt.show()

우 리 는 최고점 이 어디 에 나타 나 더 나 아가 더 좋 은 인삼 을 볼 수 있다.
5.4,목표 가중치 파라미터:classweight & min_weight_fraction_leaf
샘플 라벨 의 균형 적 인 매개 변 수 를 완성 합 니 다.견본 의 불 균형 은 한 조 의 데이터 가 집중 되 고 라벨 의 유형 이 천성적으로 큰 비례 를 차지 하 는 것 을 말한다.예 를 들 어 은행 에서'신용 카드 를 만 든 사람 이 계약 을 위반 할 수 있 는 지'를 판단 해 야 한다.바로 vs 여부(1%:99%)의 비율 이다.이런 분류 상황 에서 모델 이 아무것도 하지 않 더 라 도 결 과 를 모두'아니오'로 예측 하면 정 답 률 은 99%가 될 수 있다.그래서 우 리 는 class 를 사용 해 야 한다.weight 매개 변 수 는 견본 라벨 에 대해 일정한 균형 을 이 루 고 소량의 라벨 에 더 많은 가중치 를 주 며 모델 을 소수 류 로 편향 시 켜 소수 류 를 포획 하 는 방향 으로 모델 링 을 한다.이 매개 변 수 는 기본 None 입 니 다.이 모드 는 데이터 가 집 중 된 모든 탭 과 같은 가중치 를 자동 으로 줍 니 다.
가중치 가 생기 면 견본 의 양 은 단순히 수량 을 기록 하 는 것 이 아니 라 입력 의 가중치 의 영향 을 받 기 때문에 이 럴 때 가 지 를 자 르 려 면 min 을 조합 해 야 합 니 다.weight_fraction_leaf 는 가중치 의 가지치기 매개 변 수 를 기반 으로 사용 합 니 다.또한 가중치 기반 가지치기 매개 변수(예:minweight_fraction_leaf)는 견본 의 가중치 기준 을 모 르 는 것 보다(예 를 들 어 minsamples_leaf)주도 류 에 치 우 치지 않 는 다.만약 에 견본 이 가중 되 었 다 면 가중치 의 예비 가지치기 기준 을 바탕 으로 나무 구 조 를 최적화 시 키 기 쉬 워 서 잎 노드 가 적어도 견본 의 가중치 의 일부분 을 포함 하도록 확보한다.
이상 은 기계 학습 의 결정 트 리 Python 이 실현 하 는 상세 한 내용 을 분석 하 는 것 입 니 다.Python 이 결정 트 리 를 실현 하 는 데 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기