LoginSignup
11
11

More than 3 years have passed since last update.

Pandasを活用し相関の高い特徴を除去する(改良)

Last updated at Posted at 2019-06-29

背景

以前、Pandasを活用し相関の高い記述子を除去するを書いたが、相関の高い特徴が見つかった場合、適当にどちらかの特徴を除去していた。その後、参考に記載しているURLに「その他との相関の絶対値が大きい方を除去している」という記載を見つけたためプログラムを修正した。合わせて処理時間の大幅な改善も行った。

環境

  • Windows10
  • python 3.7.3
  • pandas 0.24.2

ソース

今までいろいろ実験したが、毎回同じようなコードを書くのに嫌気がさしたため、今後はできるだけ関数の形にしていこうと思う。
で、今回早速、関数にした。
dfには説明変数が各列に記載されたデータフレームを与え、thresholdは取り除きたい相関係数のしきい値を与えると、最終的に除去されずに残った特徴のリストを返すようにした。


def corr_column(df, threshold):

    df_corr = df.corr()
    df_corr = abs(df_corr)
    columns = df_corr.columns

    # 対角線の値を0にする
    for i in range(0, len(columns)):
        df_corr.iloc[i, i] = 0

    while True:
        columns = df_corr.columns
        max_corr = 0.0
        query_column = None
        target_column = None

        df_max_column_value = df_corr.max()
        max_corr = df_max_column_value.max()
        query_column = df_max_column_value.idxmax()
        target_column = df_corr[query_column].idxmax()

        if max_corr < threshold:
            # しきい値を超えるものがなかったため終了
            break
        else:
            # しきい値を超えるものがあった場合
            delete_column = None
            saved_column = None

            # その他との相関の絶対値が大きい方を除去
            if sum(df_corr[query_column]) <= sum(df_corr[target_column]):
                delete_column = target_column
                saved_column = query_column
            else:
                delete_column = query_column
                saved_column = target_column

            # 除去すべき特徴を相関行列から消す(行、列)
            df_corr.drop([delete_column], axis=0, inplace=True)
            df_corr.drop([delete_column], axis=1, inplace=True)

    return df_corr.columns

実行速度

前回は、データフレームのindex, columnsでループし、1セルずつ相関をチェックしていたが、今回pandasのmax, idxmax関数を駆使することで大幅に処理時間を短縮できた。
Pandasのデータフレームを1セルずつ処理するのは、実行速度の面で非効率であるということを実感した。

参考

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11