機械学習-アリス分類(3)


「データの分割」(Decision Tree)


1、適合

  • 과적합(Overfitting):機械学習において学習データを過剰に学習していることを示す.一般に,学習データは実際のデータの部分集合であり,学習データに対しては誤差が減少し,実際のデータに対しては誤差が増加する.
  • 지도 학습:学習対象となったデータに答えを貼って学習し、モデルを取得して新しいデータに対する「答え」を得る
  • 学習・推論(学習したパターンを使用)
  • 前の記事で作成したDecision Treeを見ると、複雑なルールで構成されていることがわかります.
  • # decision tree 그래프
    from sklearn.tree import plot_tree
    
    plt.figure(figsize=(12, 8))
    plot_tree(iris_tree)
    plt.show()

  • mlxtend:sklearningにない機能.
  • # 결정나무 모델이 어떻게 데이터를 분류했는지 확인할 수 있다.
    from mlxtend.plotting import plot_decision_regions
    
    plt.figure(figsize=(14, 8))
    plot_decision_regions(X=iris.data[:, 2:], y=iris.target, clf=iris_tree, legend=2)
    plt.show()

  • 条件が複雑
  • 全てのIRISに境界線があるか?
  • この結果が私のデータから外れて一般化できるか
  • 得られたデータは限られており、得られたデータを利用して一般化を図る
  • 複雑なインターフェースは最終的にモデルの性能を劣化させる.
  • 2.データ分離(分割)

  • データ分離:研修、検証、テスト
  • 取得したデータから、学習モデルに使用されていないデータを用いてモデルテストを行う
  • import pandas as pd
    import numpy as np
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    
    iris = load_iris()
    
    features = iris.data[:, 2:]
    labels = iris.target
    
    # 랜덤으로 데이터를 선택하기 때문에 라벨간 비율이 맞지않을 수 있다.
    # X_train, X_test, Y_train, Y_test = train_test_split(features, labels, test_size=0.2, random_state=318)
    # 라벨간 비율을 맞추기 위해 stratify 옵션 사용
    X_train, X_test, Y_train, Y_test = train_test_split(features, labels, 
                                                        test_size=0.2, 
                                                        stratify=labels,
                                                        random_state=13)
    
    # train 데이터를 대상으로 결정 나무 모델 생성
    # 학습의 일관성을 위해 random_state 고정
    # 모델의 단순화를 위해 max_depth 조정 => 규제
    iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
    iris_tree.fit(X_train, Y_train)
    
    # 트리(모델) 확인
    import matplotlib.pyplot as plt
    from sklearn.tree import plot_tree
    
    plt.figure(figsize=(12, 10))
    plot_tree(iris_tree)
    plt.show()

    # 정확성 계산
    # iris 데이터가 단순해서 높은 정확성을 보인다.
    from sklearn.metrics import accuracy_score
    
    y_pred_tr = iris_tree.predict(X_train)
    accuracy_score(Y_train, y_pred_tr)

    # 결정 경계 확인
    import matplotlib.pyplot as plt
    from mlxtend.plotting import plot_decision_regions
    
    plt.figure(figsize=(12, 8))
    plot_decision_regions(X=X_train, y=Y_train, clf=iris_tree, legend=2)
    plt.show()

    # 테스트 데이터에 대한 accuracy
    y_pred_test = iris_tree.predict(X_test)
    accuracy_score(Y_test, y_pred_test)

    # 테스트 데이터 결정 경계 확인
    import matplotlib.pyplot as plt
    from mlxtend.plotting import plot_decision_regions
    
    scatter_highlight_kwargs = {'s' : 150, 'label' : 'Test data', 'alpha' : 0.9}
    scatter_kwargs = {'s' : 120, 'edgecolor' : None, 'alpha' : 0.9}
    
    plt.figure(figsize=(12, 8))
    plot_decision_regions(X=features, y=labels,
                          X_highlight=X_test, clf=iris_tree, legend=2,
                          scatter_highlight_kwargs = scatter_highlight_kwargs,
                          scatter_kwargs = scatter_kwargs,
                          contourf_kwargs={'alpha' : 0.2}
                          )
    plt.show()

    # feature 4개 사용
    features = iris.data
    labels = iris.target
    
    x_train, x_test, y_train, y_test = train_test_split(features, labels,
                                                        test_size = 0.2,
                                                        stratify = labels,
                                                        random_state=13)
    
    iris_tree = DecisionTreeClassifier(max_depth = 2, random_state = 13)
    iris_tree.fit(x_train, y_train)
    
    # 결정 트리 확인
    plt.figure(figsize=(12, 10))
    plot_tree(iris_tree)
    plt.show()

  • 実施したモデルテスト
  • 実施形態の特性