意思決定木の結果をより良くするための一つのステップ
意思決定木の結果をより良くするための一つの効果的なステップ
背景、実装、およびモデルの改善
決定木(DT)はあまりに早く捨てられています。
以下のような形で進行します:
DTが訓練されます。自然的なオーバーフィッティングが発生します。ハイパーパラメータが調整されます(不十分な結果)。最終的に、DTはランダムフォレストで置き換えられます。
パフォーマンスのための早い解決策かもしれませんが、置き換えは「ブラックボックス」アルゴリズムを優先します。これは理想的ではありません。直感的な結果を生み出すことができるのはDTだけであり、経営者にトレードオフを比較する能力を提供し、プロセス改善において重要な役割を果たすことができます。
理解や説明ができないものは、製品化されません。これは特に、小さな失敗でも極端なリスクがある医療などの産業において真実です。
(余談:人々はしばしば「ランダムフォレストは特徴の重要性を示すが、それはどの特徴が重要であるかを説明しているのですか?」と尋ねますね。それほどでもありません。特徴の重要性はほぼすぐに「因果関係のある」ドライバー(つまり、ターゲットへの依存性を持つ特徴)として解釈されますが、実際には単なる「モデル」ドライバーです。技術者にとって役立つかもしれませんが、特徴の重要性は一般的に:(1)弱いモデルでは無意味です(2)高次元の特徴においては膨張しますし、(3)相互関係のある特徴に偏ります。これは全く異なる研究テーマですが、それが基本的な事実です。)
決定木の意思決定方法
DTを使用することで、結果を適切に伝える能力を保持することができますが、どのようにして性能を向上させるのでしょうか?ハイパーパラメータの調整だけでは限界があります。そして、慎重な特徴エンジニアリングも必要です。
実際には、特徴データの具体的な構造によって、それが基礎となるDTアルゴリズムにより適応しやすくなり、結果としてDTがよりよい意思決定を行うことができます。
DTは、提供されたすべてのデータのクラスを直交する決定境界(垂直分割)で分割します。これは貪欲なアルゴリズム的な方法で行われます。最初に最もよく分割する特徴から始め、その後他の特徴でより最適でない分割に移ります。
直交な決定境界がどのようになるか、視覚的に特徴を検査できます。以下に公開されている乳がんデータセットの特徴を表示しましょう。上のプロットでは、「Worst Perimeter」と「Mean Perimeter」をプロットすることで、Malignant(悪性)とBenign(良性)のクラスをうまく分割する優れた直交な決定境界が得られます。したがって、これらはDTモデルに含めるのに適した特徴です。
上記の下のプロットは、「Mean Area」と「Mean Perimeter」についてDTが直交な決定境界を作ったものですが、これらは不必要に複雑です。おそらく、対角線での分割がここではより良かったかもしれませんが、DT分類器はそうは分割しません。さらに、DTは外れ値などの訓練データのわずかな変動に非常に敏感であり、大きく異なる決定木を生成することが知られています。
DTのユニークで基礎となるメカニズムを受け入れるために、パフォーマンスと汎化性能を向上させるために主成分分析(PCA)を適用することができます。
PCAは連続データに適しています。乳がんデータセットは完全に連続変数で構成されています。(もう1つの余談:PCAはカテゴリカル変数に使用されることがありますが、おすすめしません。名義レベルには暗黙の距離がなく、順序レベルも常に等間隔ではありません。そのため、離散特徴に距離表現を強制することは一般に変数を無意味なものに再構成することになります。別の時間に別の議論です)。
必要なパッケージをダウンロードし、乳がんデータセットを特徴量Xと目的変数yに変換しましょう。
import numpy as npfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.decomposition import PCAfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_scoreimport matplotlib.pyplot as pltimport seaborn as sns# 乳がんデータセットを読み込みdata = load_breast_cancer()X = data.datay = data.target
データフレームの先頭を表示して、データセットを確認できます。
cancer = load_breast_cancer()df = pd.DataFrame(np.c_[cancer['data'], cancer['target']], columns= np.append(cancer['feature_names'], ['target']))df.head()
まず、PCAを使用せずにDecisionTreeClassifierを訓練し、予測結果(original_predictions)を収集します。
# データをトレーニングセットとテストセットに分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# PCAを適用せずにDecision Tree Classifierを訓練original_tree = DecisionTreeClassifier(random_state=42)original_tree.fit(X_train, y_train)# 元のデータセット上での予測original_predictions = original_tree.predict(X_test)
次に、PCAを適用してトレーニングセットの分散を最も説明する最小の次元数を選択します。任意の次元数を選択する代わりに、「エルボー法」と呼ばれる手法を使用して、分散の99%を説明する次元数を特定できます(下記のようにハードコーディングされています)。
# エルボー法を使用して最適なPCAコンポーネントの数を見つけるpca = PCA()pca.fit(X_train)explained_variance = pca.explained_variance_ratio_cumulative_explained_variance = np.cumsum(explained_variance)# 分散をプロットplt.plot(range(1, len(cumulative_explained_variance) + 1), cumulative_explained_variance, marker='o')plt.xlabel('Number of Components')plt.ylabel('Cumulative Explained Variance')plt.title('PCA Explained Variance')plt.grid()plt.show()# 最適なコンポーネントの数(エルボーポイント)を決定optimal_num_components = np.where(cumulative_explained_variance >= 0.99999)[0][0] + 1print(f"最適なPCAコンポーネントの数:{optimal_num_components}")
グラフが「エルボー」を形成するところで視覚的に基づいて、6つのPCAコンポーネントがトレーニングセットの分散の99%を説明することが分かります。
次に、トレーニングセットに6つの主成分を捉えるためにPCAを適用します。これは、標準的な行列分解技術である特異値分解(SVD)を使用して行われるプロセスです(ここでは範囲外のプロセスです)。前述と同様に、PCA変換されたトレーニングセット上でDecisionTreeClassifierを訓練し、予測結果(pca_predictions)を収集します。
# 最適なコンポーネント数でPCAを適用pca = PCA(n_components=optimal_num_components, svd_solver="full")X_train_pca = pca.fit_transform(X_train)X_test_pca = pca.transform(X_test)# PCA変換されたデータセット上でDecision Tree Classifierを訓練pca_tree = DecisionTreeClassifier(random_state=42)pca_tree.fit(X_train_pca, y_train)# PCA変換されたデータセット上での予測pca_predictions = pca_tree.predict(X_test_pca)
# 混同行列pca_cm = confusion_matrix(y_test, pca_predictions)# 元のデータセットの適合率と再現率original_precision = precision_score(y_test, original_predictions, average='weighted')original_recall = recall_score(y_test, original_predictions, average='weighted')original_accuracy = accuracy_score(y_test, original_predictions)# 適合率と再現率pca_precision = precision_score(y_test, pca_predictions)pca_recall = recall_score(y_test, pca_predictions)pca_accuracy = accuracy_score(y_test, pca_predictions)# 適合率と再現率の出力print(f"元のデータセット - 適合率:{original_precision:.4f}、再現率:{original_recall:.4f}、正解率:{original_accuracy:.4f}")print(f"PCA変換されたデータセット - 適合率:{pca_precision:.4f}、再現率:{pca_recall:.4f}、正解率:{pca_accuracy:.4f}")
今、我們可以將我們的原始預測(非PCA轉換)與pca預測(PCA轉換)進行比較,以觀察在準確度、精確度和回收率等評估指標上的相對改進。
與原始的DT訓練數據相比,當我們首先將數據集進行PCA轉換,然後進行DT訓練時,我們在各方面都取得改善:
我們可以繪製混淆矩陣,以顯示兩個DT之間恶性和良性腫瘤分類的相對改善。
# 繪製混淆矩陣plt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)sns.heatmap(original_cm, annot=True, fmt="d", cmap="Blues", xticklabels=data.target_names, yticklabels=data.target_names)plt.title("原始決策樹混淆矩陣\n精確度:{:.2f},回收率:{:.2f}".format(original_precision, original_recall))plt.xlabel("預測")plt.ylabel("真實")plt.subplot(1, 2, 2)sns.heatmap(pca_cm, annot=True, fmt="d", cmap="Blues", xticklabels=data.target_names, yticklabels=data.target_names)plt.title("帶有PCA的決策樹混淆矩陣\n精確度:{:.2f},回收率:{:.2f}".format(pca_precision, pca_recall))plt.xlabel("預測")plt.ylabel("真實")plt.tight_layout()plt.show()
最後,有價值的是識別用於生成6個主成分的原始特徵。從技術上講,PCA生成的新特徵是原始特徵的線性組合。這些新特徵彼此正交,並按照它們解釋的變異數排序。但是,通過調用components_attribute,可以識別在創建這些組件時使用的特徵。
# 獲取每個主成分的解釋變異比explained_variance_ratio = pca.explained_variance_ratio_# 獲取PCA組件pca_components = pca.components_# 創建DataFrame以顯示原始特徵對每個主成分的貢獻df_components = pd.DataFrame(data=pca_components, columns=data.feature_names)# 打印對每個主成分貢獻最大的特徵for i in range(optimal_num_components): print(f"PC{i+1}的頂級特徵:") sorted_features = df_components.iloc[i].abs().sort_values(ascending=False) print(sorted_features.head()) print("\n解釋變異比:", explained_variance_ratio[i]) print("=" * 50)
因此,對於我們選擇的6個主成分,該模型使用以下5個特徵創建了它們:
結論
在選擇更高性能的算法之前,決策樹常常被遺棄,儘管最高性能很重要,但可能不是最好的——這個決策最終取決於利益相關者的需求以及解釋為什麼模型建議特定結果(參見“可解釋性人工智能”)。
與其擁抱最先進的技術算法,更好的方法是通過精心的特徵工程和主成分分析優化數據,以使決策樹展現出其直觀的決策能力的最佳機會。
感謝閱讀。很高興與任何人在LinkedIn上聯繫!如果您想分享任何您目前面臨的有趣的數據科學挑戰,請留言或私信,我將樂意嘗試去探索/寫作相關內容。
我的最新文章:
ベイジアンネットワークを使用して、病院の付帯サービスの量を予測する
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles