背景
以前、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セルずつ処理するのは、実行速度の面で非効率であるということを実感した。