간단한 의사 결정 트리 기반의 식별 코드

원칙

핵심 아이디어 : 비슷한 입력과 유사한 출력을 생성합니다.

원리 : 먼저, 상기 트레이닝 샘플 매트릭스에서 제 기능을 선택하는 분할되고, 각각의 서브 테이블의 특성 값은 모두 동일 함 (제 1 특징은 남성과 여성 등, 두 개의 서브 - 테이블 수컷 형과 암컷 형으로 나눌 수있다) 다음 미만이고, 물론 상황에 따라 달라질 수의 난) (세 개의 서브 테이블들로 분할 될 수있는 동일한 규칙에 따라 각각의 서브 - 테이블에 다음의 기능을 같은 세 번째 기능으로 작은 서브 표 (계속 분열 선택 18 이하, 다음 표에서 남성과 여성을위한 세 개의 하위 테이블이있는 18 60 이상, 이상 60보다, 각각의 서브 테이블의 특성 값) 동일, 그들은 하위 잎의 무대가되는 시간까지 사용 된 모든의 기능, 모든 때까지 반복된다 테이블에있는 모든 샘플의 특징 값은 모두 동일합니다.

설명 : 의사 결정 트리 분류에있어서, 상기 샘플 분류입니다. 분류가 완료 얻어진 결과를 후 (또는 표라고 함)와 동일한 수준의 실질적으로 모든 기능과 동일하며, 다음의 출력 (리턴)를 평균화하여 얻어지는 (분류) 또는 모든 샘플들에 기초하여 특정 카테고리를 투표. 새로운 샘플 요구가 예측 결과를 예상 할 때, 난 그냥 (테이블) 샘플이 속한 클래스를 알 필요가있다.

엔지니어링 최적화 (자두)의 모든 기능을하여 허용 주어진 정도의 비용으로, 나무의 층의 수를 감소, 자식 테이블 잎은 서로 다른 특성 값을 혼합 수, 소모 할 필요가 없다, 모델의 성능을 향상시킬 수 있습니다. 일반적으로, 선호도는 양을 줄일 수있는 특징 서브 테이블 분할의 기준으로 최대 엔트로피있다. (인기있는 이야기는 구분하지 않습니다 일부 특성 값, 예를 들어, 첫 번째 장편 남성과 여성, 나는 두 개의 테이블로 분할하지 않지만, 테이블에이 일반적으로 남성과 여성의 출력 특성에 거의 영향을 미치지 ), 어떻게 그것의 특성에 쓸모없는 기능이나 거의 영향의 유용한 기능을 구별? 정보 엔트로피 또는 지니 계수에 의해 구별. 이 같은 PCA와 ICA와 함께 작동하는 기능의 차원을 줄일 수 있습니다.

sklearn API를

클래스 sklearn.tree.DecisionTreeClassifier ()
参数

  • 기준 : 아지 값 { "지니", "엔트로피"}, 즉 엔트로피 지니 인덱스, 기본 '지니'
  • 스플리터 : overfitting 방지하기 위해 무작위로 선별 값 { '최고', '랜덤'} 기본 '최고'
  • MAX_DEPTH : 트리의 최대 깊이는, 모든 기능은 트리로 구성 될 경우 지정되지 않았거나 매개 변수 정지 min_samples_split를 충족하기 위해
  • min_samples_split : 샘플들의 최소 수에 노드 및 INT 플로트 될 수있다, 플로트를 나타내는 CEIL (min_samples_split N_SAMPLES *), 즉, 전체 샘플의 소수 비율
  • min_samples_leaf 각 노드에 대한 샘플들의 최소 수, INT 플로트 수도
  • min_weight_fraction_leaf : 플로트 기본값 = 0.0, 가중 점수에 가중치 최소 합 모든 잎 노드 (모든 입력 샘플들) 무게. 동일한 가중치 샘플없이 sample_weight하면 오른쪽
  • max_features : 간주 기능 INT 플로트 또는 최대 번호 { "자동", "SQRT", "Iog2"}
    상기 각 분할 INT하는 max_features 고려하면 1.
    2. 만약 플로트, max_features는 소수이고, 각 분할의 요소를 고려한다. INT (* max_features의 n_features)
    3.이 "자동", 다음 max_features = SQRT (n_features).
    4. 만약 "SQRT"는 max_features = SQRT (n_features).
    5. "LOG2는"이었다면 max_features = LOG2 (n_features).
    제 경우는, max_features = n_features 것도 없다.
  • random_state : 무작위 씨, INT 또는 RandomState. 오버 피팅을 방지하기 위해의 원리를 모른다
  • max_leaf_nodes : 최대 리프 노드, 디버깅 환경의 특정 값에 따라
  • min_impurity_decrease : 이득 사이즈 제한 정보, 정보 이득 이하 M.가 발생하지 않는 설정 값보다 길다.
  • min_impurity_split : 사용하기 전에 0.19, min_impurity_decrease로 대체
  • class_weight : 샘플 무게
  • ccp_alpha : 읽을 수없는
    속성을
  • classes_ : 태그 어레이
  • feature_importances_ : 특성 중요성 (정보 엔트로피와 지니 지수 기준)
  • max_features_ : 추정 모델은 고유의 최대 번호를 사용
  • n_classes_ : 샘플 수
  • n_features_ : 특성 수
  • n_outputs_ :
  • tree_ : 나무 개체
    방법
  • 적용 (X [, CHECK_INPUT]) : 반환 잎의 인덱스가 예상되는 X
  • cost_complexity_pruning_path (X, Y [...]) : 이해하지 못했다
  • decision_path (X [, CHECK_INPUT는]) : 경로 의사 결정 트리를 돌려줍니다
  • 피트 (X, Y [sample_weight, ...]) 훈련
  • get_depth는 () : 깊이 모델을 가져옵니다
  • get_n_leaves는 () : 잎 모델의 수를 가져옵니다
  • get_params ([깊은]) : 얻기 모델 파라미터
  • 예측 (X [CHECK_INPUT]) : 예측
  • predict_log_proba (X) : 예측의 X 로그 확률
  • predict_proba (X [CHECK_INPUT]) : X의 예측 가능성
  • 점 (X, Y [sample_weight]) 반환 예측 출력 Y 및 Y의 정확한 비율
  • set_params (PARAMS) : 모델 파라미터 설정

식별 코드

우리는 다른 인터페이스 코드를 선택할 수 있도록 및 기능에 따른 분류 코드는 이전에 즉, 70x25 크기, 같은 다음, 너무 명백한 사용 :
그림 삽입 설명 여기
같은 매우 간단하지만, 비록 문자가 추가되었습니다.
정규 코드로 전처리 및 디지털 코드로 -> 계조 -> 이진화 -> 절단 -> 라벨. 그러나, 테스트 후 그 나는 매개 변수를 조정하는 방법에 상관없이, 정확도 속도 상대적으로 낮은 발견했다. 모든 문자가 발견하지만 경사되지 캐릭터 이미지 왜곡하지만, 대담하고 얇은 몸을 차별화 읽고, 나는 엄격 그래서 표시되어 있지 않은 경우에 대담하고 섬세한 몸으로 샘플의 수. 그리고 문자의 위치는 사진의 중앙에 있지 않은 문자가 같은 크기, 어떤 부분 아래에 몇 가지 편견, 약간의 작은 일부도 너무 큰되지 않습니다. 심지어 재 라벨링 정확도는 내가 원하는 기준을 충족하기가 어렵습니다.

이 분할 라인과 명백한 문자 코드의 가장자리를 들어, 우리는 절단 후 사진과 문자를 추출 할 수있다, 즉, 같은 크기로 조정 한 후 빈의 바깥 쪽 가장자리를 제거합니다. 이러한 간섭을 제거하고 미세 굵은 체와 문자 위치 알고리즘의 크기만큼이 두 그것의 트레이닝 샘플의 동일한 번호. 다음과 같이 코드입니다 :

def img_preprocess(file):
    img1 = Image.open(file)
    pix = np.array(img1)
    pix = (pix > 180) * 255
    width, height = pix.shape
    for i in range(width):
        if np.sum(pix[i]==0):
            xstart = i
            break
    for i in range(width-1, 0, -1):
        if np.sum(pix[i]==0):
            xend = i + 1
            break
    for i in range(height):
        if np.sum(pix[:,i]==0):
            ystart = i
            break
    for i in range(height-1, 0, -1):
        if np.sum(pix[:,i]==0):
            yend = i + 1
            break
    new_pix = pix[xstart:xend, ystart:yend]
    img = Image.fromarray(new_pix).convert('L')
    if new_pix.size != (8, 10):
        img = img.resize((8, 10), resample=Image.NEAREST)
    img.save(file)

그럼 우리는 다음, 우리가 MAX_DEPTH이 매개 변수를 보면, 의사 결정 트리 훈련 시료를 다시 사용하고 매개 변수를 조정 :

from sklearn.tree import DecisionTreeClassifier
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as mp


def func(k):
    x = []
    y = []
    for label in os.listdir('train'):
        for file in os.listdir(f'train/{label}'):
            im = Image.open(f'train/{label}/{file}')
            pix = np.array(im)
            pix = (pix > 180) * 1
            pix = pix.ravel()
            x.append(list(pix))
            y.append(label)
    train_x = np.array(x)
    train_y = np.array(y)
    model = DecisionTreeClassifier(max_depth=k)
    model.fit(train_x, train_y)
    x = []
    y = []
    for label in os.listdir('test'):
        for file in os.listdir(f'test/{label}'):
            im = Image.open(f'test/{label}/{file}')
            pix = np.array(im)
            pix = (pix > 180) * 1
            pix = pix.ravel()
            x.append(list(pix))
            y.append(label)

    test_x = np.array(x)
    test_y = np.array(y)
    
    score = model.score(test_x, test_y)
    return score
    

if __name__ == "__main__":
    os.chdir('G:\\knn\\字符验证码\\')
    x = list(range(1, 15))
    y = [func(i) for i in x]
    mp.scatter(x, y)
    mp.show()

결과 :
그림 삽입 설명 여기
당신이 볼 수있을 때 MAX_DEPTH = 8, 우리가 직접 줄에 MAX_DEPTH 8 걸릴 것 때문에 정확도가 매우 가까운 일이다. 인식 정확도 비율이 1에 근접하기 때문에, 전송은 다른 매개 변수가 중요한 것 같지 않았다, 그러나 이것은 식별 코드 검증이기 때문에 쉽지 않다 착용감, 다른 경우에는, 경우 정확도 속도에 가까운 1의 경우가 있었다 조정하지 않습니다 더 방지 랜덤 조정 패러미터 (random_state 스플리터) 및 가지 치기 파라미터 (min_samples_leaf 등)을 통해가는 피팅. 나는 또한 다른 매개 변수 조금 뒤에, 우리는 모델, 기본의 정확성에 작은 변화를 발견 조정하려고합니다.

교육 테스트 데이터 세트 : https://www.lanzous.com/i8joo0f

마지막으로, 나는 블로그와 마이크로 채널 대중 번호 (파이썬 경로), 환영 관심을 공유하는 기록 I 필요 무언가에 대한 알고리즘을 학습 기계의 일부를 배우고있다. 일반적으로, 다음 일반 주 일부 콘텐츠 크롤러 또는 파이썬.
lUE1wd.jpg

추천

출처www.cnblogs.com/kanadeblisst/p/12170636.html