機械学習‐決定ツリー整理,モデル作成,キニー不一致度とエントロピー理論


線形回帰ではなくツリー構造のモデルをまとめ,モデルの動作原理を観察した.

意思決定ツリーとは?


従来学習した線形回帰とは異なり,決定ツリーは前述したように決定ツリーである.各特性はノードとなり,上流から相応の予測を行うモデルが重要である.枝が枝状に伸びていることから名付けられた.

画像ソース:https://www.youtube.com/watch?v=_L39rN6gz7Y
臍帯タスクの画像を用いて説明すると,最上位のルートノードから,指定された問題に対してTrueまたはFalseの答えを与え,その後他の問題に対して答え,最終的に決定を下して予測を行うモデルである.
上記の例によれば、41歳のとき、毎日5分間トレーニングしている人がサンプル(row)であると仮定すると、このモデルが適用される.
40歳以上と聞かれたとき、True>
1日の運動が20分未満だと聞かれたとき、True>
毎日10分も運動しないと聞かれたとき、True>
最終的な選択もあなたのConsiderがジムに参加することです!
このような結果が得られる.このように,質問(feature)に対する回答により最終結果を予測するのが決定木である.

Decision Treeモデルの用語


ノード(Node):各属性(featureを表す)
Edge)Edge:分岐を表す線
Gini Impurification(Gini Impurification):この特徴のデータからtargetを予測する場合、targetに関連しない答えの割合を決定します.
エントロピー:熱力学の用語、すなわち無秩序の程度.一般的には、キニーの不順度がより多く利用されます.

Decision Treeの動作原理、メリットとデメリット(特性インタラクション)


属性間の重要度を決定し、Rootノード(最上位ノード)として選択します.

決定ツリーモデルの作成

import seaborn as sns

#Decision Tree dataset 불러오기

df = sns.load_dataset('iris')
df
df['species'].value_counts()
[output]

virginica     50
versicolor    50
setosa        50
Name: species, dtype: int64
sebornのデータセットを読み込みました.ここで,カテゴリ型columnの種分布を決定すると,3つのカテゴリが各50サンプルからなることが確認され,ここで,「versicolor」を見つけたバイナリ分類に基づいてモデルをフィッティングする.
Target: species
versicolor: 1
setosa, virginica : 0
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import f1_score, roc_auc_score, confusion_matrix

# target 선정
target = 'species'
df['species']= [1 if i == 'versicolor' else 0 for i in df['species']]

train, test  = train_test_split(df, test_size  = 0.2, random_state = 2)
feature = df.drop(columns = target).columns
X_train = train[feature]
y_train = train[target]
X_test = test[feature]
y_test = test[target]


# 결정트리 모델 작성
decit = DecisionTreeClassifier()
decit.fit(X_train, y_train)

# train 셋에 먼저 적용
y_pred_train = decit.predict(X_train)
y_pred_proba_train = decit.predict_proba(X_train)[:,1]

# test 셋에 모델 적용
y_pred = decit.predict(X_test)
y_pred_proba = decit.predict_proba(X_test)[:,1]

# train 셋 적용 결과
print('[train] accuracy:',decit.score(X_train, y_train))
print('[train] f1:', f1_score(y_train, y_pred_train))
print('[train] auc:', roc_auc_score(y_train, y_pred_proba_train))

# test 셋 적용 결과
print('\n[test] accuracy:',decit.score(X_test, y_test))
print('[test] f1:', f1_score(y_test, y_pred))
print('[test] auc:', roc_auc_score(y_test, y_pred_proba))
[output]

[train] accuracy: 1.0
[train] f1: 1.0
[train] auc: 1.0

[test] accuracy: 0.9333333333333333
[test] f1: 0.875
[test] auc: 0.9147727272727273
モデルをX train setに学習した後,train setとtest setにそれぞれ予測を適用した場合の結果を比較した.
3つの評価指標で確認する場合、当然の結果であるが、列車群は「列車運行規範」に適応し、すべての指標は1である.
test setも実は優れた性能を有しており,このデータのtarget予測問題は比較的容易であると考えられる.

Feature重要度-属性重要度の表示

import pandas as pd
import matplotlib.pyplot as plt
# 특성 중요도 파악
# 특성 중요도 계산 후 X_test column으로 넣는다.
importance = pd.Series(decit.feature_importances_, X_test.columns)
importance.sort_values().plot.barh();

これは,予測モデルを構築した後,データセットに重要な役割を果たすウェブサイトを得るために,予測に重要な役割を果たす特徴を探す方法である.上記モデルではtargetを予測し,花弁長が最も重要な特性である.

重要な特性を理解しinsightを得る

# 상관계수분석
df_c = df.corr()
sns.heatmap(df_c, cmap = "YlGn");
plt.show();

# 타겟(species에 대한 상관계수 확인)
print(df.corr()[target].sort_values(ascending = False))

相関関係を把握して可視化と数値化を行うと,「花弁長」が0.2の相関係数が最も高く,「sepal width」が−0.46の負の相関係数が最も低いことが分かった.結論として、データセット上の「sepal width」が低いほど、「花びらlength」が高いほど、1に設定された我々のtarget(versicolor:1)に近づく.

ジニーはうまくいかない


G(S)=1−∑i=1jpi2G(S) = 1 -\sum_{i=1}^{j}p^2_iG(S)=1−∑i=1j​pi2​
キニー不純物(gini不純物)は、1つのfeature内の元素の目標値の分散度合いを決定するものであり、不純度が低いほど、より重要なfeatureと言える.

上図に示すように,左の場合は予測目標のより重要な特性と考えられる.
さて、今回は例題でGenie不順度を解きます.

上のdatasetで血液型がAとBの2つだと仮定した場合、病気なら1、なければ0と言います.血液型がAなのかBなのか、血液型がAなのかと聞かれると、True or Falseで表します.
以上のようにしてキニー不順度を求めることができ,Trueの不順度Falseの不順度を求めることに重点を置き,最後に重み付けとして乗算した値を1から減算する.
これを記載した理由は,キニー不順度の理解も重要であるが,特性のカテゴリが多ければ多いほど,この不順度が低くなり,相対的に重要な特性とされる可能性があることに留意されたい.

では、O型を追加して、3つのカテゴリであれば、不順度が減るかどうか見てみましょう.
キニーの不純度を決定するアルゴリズムはバイナリで分割されているため,A型やB型,その他/O型などの要因により不純度を測定した.また,これらの要素の中で最も不純度が小さいのが,この特徴の不純度である.したがって,カテゴリの多い高次機能では,重要でない特性でも重要な特性のようにRoot Nodeを占有することになるので注意が必要である.