Python で特徴量の重要性を計算するための 3 つの重要な方法
データサイエンティストを目指す人が知っておくべきこと
データセット内の最も重要な特徴を見つけるにはどうすればよいでしょうか? 多くのテクニックがありますが、この記事ではデータサイエンティストが知っておくべき 3 つの方法を説明します。
これを読むと、わずか数行のコードを使用して Python で特徴量の重要度を計算する方法がわかります。また、これらのテクニックを適切に機能させるために重要な前提条件についても学習します。
この記事のノートブックからノートブックをダウンロードできます。
記事は次のように構成されています。
データセットの読み込みと準備
方法 1 — 係数から重要度を取得する
方法 2 — ツリーベースのモデルから重要性を取得する
方法 3 — PCA ロードスコアから重要性を取得する
結論 データセットの読み込みと準備
ここで過ごす時間はできるだけ短くしましょう。Scikit-Learn の組み込み乳がんデータセットを使用します。さまざまな分析や視覚化の目的で、Numpy、Pandas、Matplotlib も必要になります。
次のコード スニペットは、ライブラリをインポートしてデータセットをロードする方法を示しています。
# 导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer
現在、データセットは最も便利な形式ではありません。ほとんどの場合、Pandas データフレームを使用して作業することになるため、これをすぐに Pandas データフレームに変換しましょう。次のコード スニペットは、予測変数とターゲット変数をデータ フレームに連結します。
# 加载数据集 data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target
head() を呼び出すと、次の出力が生成されます。
[乳がんデータセットの最初の数行]
つまり、30 個の予測変数と 1 つのターゲット変数があります。すべての値は数値であり、欠損値はありません。唯一の明白な問題は規模です。平均面積と平均平滑度の列の違いに注目してください。これにより、モデルのパフォーマンスが低下する可能性があります。
スケールの問題を解決する前に、トレーニングとテストの分割を実行する必要もあります。
次のコード スニペットは、トレーニング/テスト分割を実行し、StandardScaler クラスを使用して予測子をスケールする方法を示しています。
# 数据拆分 from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler X = df.drop('target', axis=1) y = df['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 数据缩放 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
機能の重要性を理解するために必要なのはこれだけです。次に、これを始めましょう。
方法 1 — 係数から重要度を取得する特徴の重要性を確認する最も簡単な方法の 1 つは、モデルの係数を調べることです。たとえば、線形回帰とロジスティック回帰は両方とも、各入力値に係数 (重要度) が割り当てられる方程式に要約されます。
簡単に言うと、割り当てられた係数が大きい (負または正の) 数値である場合、予測に一定の影響を与えます。逆に、係数がゼロの場合は、予測に影響を与えません。
単純なロジックですが、テストしてみましょう。カテゴリデータセットがあるため、ロジスティック回帰が適切なアルゴリズムです。モデルが適合された後、係数は coef_ 属性に保存されます。
次のコード スニペットは、ロジスティック回帰モデルをトレーニングし、属性とそれに対応する係数を格納するデータフレームを作成し、データフレームを係数で降順に並べ替えます。
# 训练逻辑回归模型 from sklearn.linear_model import LogisticRegression lr = LogisticRegression() lr.fit(X_train, y_train) # 获取系数 coefficients = lr.coef_[0] feature_names = X.columns # 创建包含特征及其系数的数据帧 feature_importance = pd.DataFrame({'feature': feature_names, 'importance': coefficients}) # 按重要性降序排序 feature_importance = feature_importance.sort_values(by='importance', ascending=False)
シンプルですね。次に、係数を視覚的に調べてみましょう。次のコード スニペットは、係数から棒グラフを作成します。
# 创建特征重要性的条形图 plt.figure(figsize=(12, 6)) plt.barh(feature_importance['feature'], feature_importance['importance']) plt.xlabel('Importance') plt.ylabel('Feature') plt.title('Feature Importances as Logistic Regression Coefficients') plt.show()
対応する視覚化は次のとおりです。
[特徴量の重要度としてのロジスティック回帰係数]
それがこのシンプルなテクニックのすべてです。覚えておくべき重要な点は、係数 (正か負かに関係なく) が大きいほど、予測への影響が大きくなるということです。
方法 2 — ツリーベースのモデルから重要性を取得する
ツリーベースのモデルをトレーニングした後は、_feature_importances__ 属性にアクセスできるようになります。これは、機能の重要性を取得する最速の方法の 1 つです。
次のコード スニペットは、XGBClassifier モデルをインポートしてトレーニング データに適合させる方法を示しています。重要度は以前と同様の方法で取得され、データ フレームに保存され、重要度によって並べ替えられます。
# 导入XGBClassifier模型 from xgboost import XGBClassifier xgb = XGBClassifier() xgb.fit(X_train, y_train) # 获取特征重要性 importances = xgb.feature_importances_ # 创建包含特征及其重要性的数据帧 feature_importance = pd.DataFrame({'feature': feature_names, 'importance': importances}) # 按重要性降序排序 feature_importance = feature_importance.sort_values(by='importance', ascending=False)
棒グラフをプロットすることで重要性を視覚化できます。作り方は次のとおりです。
# 创建从基于树的模型获取的特征重要性的条形图 plt.figure(figsize=(12, 6)) plt.barh(feature_importance['feature'], feature_importance['importance']) plt.xlabel('Importance') plt.ylabel('Feature') plt.title('Feature Importances obtained from a tree-based model') plt.show()
対応する視覚化は次のとおりです。
【ツリーベースモデルから得られる特徴量の重要度】
前に述べたように、この方法で重要性を得るのは簡単ですが、結果は少し偏る可能性があります。このアプローチの傾向は、連続特徴またはカーディナリティの高いカテゴリ変数の重要性を高めることです [1]。最初に適切な準備と変換を行うようにしてください。これで問題なく実行できるはずです。
方法 3 — PCA ロードスコアから重要性を取得する
主成分分析 PCA は、特徴の重要性を判断するためにも使用できる優れた次元削減手法です。
PCA は、最初の 2 つの方法とは異なり、最も重要な機能を直接明らかにしません。代わりに、N 個の主成分が返されます (N は元の特徴の数に等しい)。
PCA を初めて使用する場合は、この記事の最後に完全な入門ガイドが記載されています。
まず、スケーリングされたデータに PCA を当てはめて、何が起こるかを見てみましょう。次のコード スニペットはまさにそれを実行し、累積説明分散の折れ線プロットもプロットします。
# 导入PCA模型 from sklearn.decomposition import PCA pca = PCA() pca.fit(X_train) # 绘制累积解释方差的线图 explained_variance_ratio = pca.explained_variance_ratio_ cumulative_variance_ratio = np.cumsum(explained_variance_ratio) plt.figure(figsize=(8, 4)) plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o', linestyle='--') plt.xlabel('Number of Principal Components') plt.ylabel('Cumulative Explained Variance') plt.title('PCA Cumulative Explained Variance') plt.grid() plt.show()
対応する視覚化は次のとおりです。
[PCA累積説明分散]
しかし、これは何を意味するのでしょうか?
これは、ソース データ セットの分散の約 90% を最初の 5 つの主成分を使用して説明できることを意味します。これが何を意味するかわからない場合は、ゼロから始めるためのガイドを次に示します。
これで、PCA ペイロードの処理を開始できます。これらは、主成分から構築された元の変数の線形結合の係数にすぎません [2]。
負荷量を使用して、実際の変数と主成分の間の相関関係を見つけることができます。
主成分と元の変数の間に強い相関関係がある場合、最も簡単に言えば、この機能が重要であることを意味します。
Python を使用して負荷スコアを計算する方法:
# 计算PCA载荷分数 loadings = pca.components_.T * np.sqrt(pca.explained_variance_) # 创建包含PCA载荷分数的数据帧 loading_scores = pd.DataFrame(loadings, columns=[f'PC{i}' for i in range(1, len(loadings) + 1)], index=feature_names) # 打印前几行 print(loading_scores.head())
対応するデータ フレームは次のようになります。
[PCA 負荷スコアの最初の数行]
第一主成分は非常に重要です。これは 1 つの特徴にすぎませんが、データセット内の分散の 60% 以上を説明します。画像 5 からわかるように、平均半径特徴との相関係数はほぼ 0.8 であり、これは強い正の相関であると考えられます。
すべての入力特徴と最初の主成分の間の相関関係を視覚化してみましょう。コード スニペット全体 (視覚化を含む) は次のとおりです。
# 绘制PCA载荷分数的可视化 plt.figure(figsize=(12, 6)) plt.barh(loading_scores.index, loading_scores['PC1']) plt.xlabel ('Correlation with PC1') plt.ylabel('Feature') plt.title('PCA Loading Scores from the first Principal Component') plt.show()
対応する視覚化は次のとおりです。
[第一主成分からスコアをロードする PCA]
これは、PCA を「抜け出して」特徴重要度アルゴリズムとして使用する方法です。次のセクションですべてをまとめてみましょう。