ValidationはTrainデータとTestデータの分布が異なる際に、Testデータに似たValidationデータを作成するのに使われる手法です。Kaggleなどのデータ分析コンペではTrainデータとTestデータの一部が与えられ、コンペ終了まではこの一部のTestデータに対するスコアのみ知ることができます。一部のTestデータだけを見てモデルを評価していると、全体のテストデータに対しては良いスコアが出ずに最終的に低い順位に終わることがあります。Validationなどを用いて求めたValidationデータに対するのスコアと一部のTestデータに対するスコアに相関があることが望ましい状態です。そのために重要なことはTestデータに似た分布を持つValidationデータを作成することです。最終的な目標はTrainデータとTestデータを分類するモデルを作成することです。どちらのデータセットからのデータかをラベル付けするために、TrainデータとTestデータにそれぞれ新しい目的変数を与えます。"1"を、Testデータには"0"を与えます。TrainデータとTestデータを結合して、データがどちら由来か予測するモデルを作成します。TrainデータとTestデータが同じ分布を持つとするとどちら由来かを予測できないはずです。逆にTrainデータとTestデータの分布が異なる場合は予測は容易になります。予測結果からTrainデータとTestデータの分布が異なるようであれば、Testデータの分布に似たValidationデータを作成する必要があります。これはTrainデータのうち、モデルがTestデータに由来する確率が高いと予測したデータを選ぶことで作成できます。それでは必要なライブラリをインポートして実装に進みましょう。lgbTrainデータとTestデータの分布が同じ場合まずデータセットを作成し、プロットしてみます。"1"を、Testデータには"0"をそれぞれ新しく目的変数として与えます。その後、TrainデータとTestデータを結合して1つのデータセットに戻します。axis=0)これでTrainデータとTestデータが混ざったデータセットが出来上がりました。ここから新たに与えた目的変数を元にTrainデータとTestデータを分類するモデルを作成していきます。verbose=100)このときのValidationデータを作成しモデルの性能を評価します。モデルのパフォーマンスを見てみましょう。metric='auc')plt.show()結果を見ると、Validationデータに対してAUCはほぼ0.5あたりを示しています。AUCが0.5を示すということはモデルのパフォーマンスがランダムに分類するのと変わらないことを意味しています。これはモデルがTrainデータとTestデータをうまく分類できてないということです。TrainデータとTestデータの分布が同じであることがわかります。次にTrainデータとTestデータの分布が異なる場合を見ていきましょう。Bowlのデータを引っ張ってきました。データの中身や特徴量作成に関して、ここではコードだけにして割愛させていただきます。pd.DataFrame(compiled_test)特徴量作成の後にできたTrainデータとTestデータは次のようになっています。display(X_train.head())display(X_test.head())余分なinstallatio_idカラムは削除して、titleカラムのエンコーディングを行っておきましょう。le.transform(list(X_test['title'].values))ここから先は上記のプロセスと同じくTrainデータとTestデータに新たな目的変数を与えて結合した後、TrainデータとTestデータが混ざったデータからそれぞれを分類していきます。verbose=100)ではモデルのパフォーマンスを見てみましょう。metric='auc')plt.show()Validationデータに対するAUCはおよそ0.93あたりで、TrainデータとTestデータの分布が同じ場合に比べモデルのパフォーマンスが良いことがわかります。これは今回用いたTrainデータとTestデータの分布が異なるため、モデルが容易に分類できるからです。このようにして得られた結果から、TrainデータのうちTestデータである確率が高いと予測されたデータを取り出すことでTestデータに似たValidationデータを作成することが可能になります。Validationを使うこともできます。Validationを応用して特徴量選択を行う方法を紹介します。先程のTrainデータとTestデータの分布が異なる場合に、予測に寄与した特徴量の重要度を見てみましょう。重要度が高くなっています。TrainデータかTestデータかの分類に大きく寄与していることを示しています。TrainデータとTestデータの間でこの特徴量に乖離があることを意味しています。metric='auc')plt.show()たしかにAUCスコアが低くなりTrainデータとTestデータの分類がしづらくなっていることがわかります。Validationを応用することによって、TrainデータとTestデータで乖離している特徴量を見つけることができます。Validationを紹介しました。setの作成や特徴量選択に役立ちます。実際に私もコンペで利用しており、今後ますます注目を浴びるのではないかと思われます。