Kaggle / jetson nano【11/27】

今日やったこと

  • 特徴量スケーリングの使用方法
  • スケーリング法による評価精度の比較
特徴量スケーリング

スケーリングの中でも代表的な手法である「正規化」と「標準化」を使って評価精度の比較を行った...が、スケーリングの前にデータ形式によるエラー処理にかなり多くの時間が取られてしまった(泣)

DataFrame全体に対してスケーリングを行う場合は、引数にデータを丸ごと投げるだけで実行できました。特定の列に対してスケーリングを行うため抽出するとSeriesになってしまうらしく、スケーリングした特徴量を置き換えるときに「データをreshapeしなさい」というようなエラーが。解決策は以下に記載。

all_data[col] = mms.fit_transform(all_data[col].to_frame())

抽出したデータ(all_data[col])は、DataFrameからSeriesに変わってしまっているため、to_frame()メソッドで強引にDataFrame型にします。それに対してインスタンス化したmms(MinMaxScaler:正規化)をし、その結果を元データに置き換えます。先人の方々の方法を参考に一番シンプルな形に書き直しました。これにより特定のカラムに対してだけスケーリングを行うことができるようになりました。

スケーリング法による評価精度の比較

これらのスケーリングをし、訓練データを分割したのち、単純な学習モデル(LogisticRegression)で評価精度を比較してみました。Regressionと聞くと回帰を想像しますが、ロジスティク回帰は分類に使うモデルです!(たまに勘違い)

 

スケーリングなし [Accuracy Score: 0.6901066666666666]
Label化したカテゴリ変数のみ [Accuracy Score: 0.6948933333333334]
全データ(standard scale) [Accuracy Score: 0.7426666666666667]
全データ(MinMaxScaler) [Accuracy Score: 0.74268]
日付(MinMaxScaler)それ以外(standard scale) Accuracy Score: 0.7427066666666666

 

以前から気になっていた、LabelEncoderで大きくなってしまう特徴量に対してのみスケーリングを行っても評価精度に影響はありませんでした。モデルの特性にも起因すると思いますがあまり気にしなくても良さそうです。やはり、スケーリングをするかしないかで評価精度に大きな違いがあるようでした。僅差ですが最も精度が良かったのは正規化でした。

感想

スケーリングをするかしないかでモデル性能に大きな影響を与えることがわかりました。また、今回は名義尺度と順序尺度でスケーリングしたことで情報が失われてしまうことはありませんでしたが、複雑になるほど影響を及ぼしかねないので、そこも意識しながら機械学習モデルを作ろうと思います。今後は、スケーリングも意識しながら、分割法・いろいろなモデル・ハイパーパラメータチューニング、スタッキングなどのアンサンブル学習などなど...。まだまだ試したいことがたくさんある!笑

EDAやBI、特徴量生成・選択は、やればキリがないのでモデル構築がぱぱっとできるようになったら深みにはまっていきたいと思う。