観測数が少ない列を削除する
多くの特徴量エンジニアリングを行った後は、一度立ち止まって作成物を見直すのがよい方法です。カテゴリ変数に対して explode や OneHot Encoding などの自動化手法を使うと、新しい二値特徴量が何百個もできていることがあります。特徴量選択はそれ自体が別コースのテーマですが、データセットの次元数を減らすためにすぐ実践できる手順もあります。
この演習では、観測数が30未満の列を削除します。30は統計的有意性のための一般的な最小観測数です。これより少ないと、単なる偶然により関係が生じ、過学習につながりやすくなります。
NOTE: データはデータフレーム df に用意されています。
この演習はコースの一部です
PySparkで学ぶ特徴量エンジニアリング
演習の手順
- 二値列のリストを反復するあらかじめ用意された
forループを使い、agg関数でその列の値のsumを計算します。collect()を使って計算を即時実行し、結果をobs_countに保存します。 obs_countをobs_thresholdと比較します。if文は、obs_countがobs_threshold以下の場合に true になるようにします。cols_to_removeリストに追加された列を、drop()を使って削除します。*を付けるとリストをアンパックできることを思い出してください。- PySpark のデータフレームの開始時と終了時の形状を、レコード数は
count()、列数はdf.columnsまたはnew_df.columnsに対するlen()で出力してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
obs_threshold = 30
cols_to_remove = list()
# Inspect first 10 binary columns in list
for col in binary_cols[0:10]:
# Count the number of 1 values in the binary column
obs_count = df.____({col: ____}).____()[0][0]
# If less than our observation threshold, remove
if ____ ____ ____:
cols_to_remove.append(col)
# Drop columns and print starting and ending dataframe shapes
new_df = df.____(*____)
print('Rows: ' + str(df.____()) + ' Columns: ' + str(____(df.____)))
print('Rows: ' + str(new_df.____()) + ' Columns: ' + str(____(new_df.____)))