LoginSignup
marcopagot
@marcopagot (Asuka)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

機械学習のtrainデータとtestデータの扱い方について

特徴量作成等、trainデータにした作業をtestデータにする際、効率の良い方法を模索しております。

機械学習初学者です。
現在、NISHIKAの「中古マンション価格予測」というコンペに参加しております。
trainデータに対する特徴量の作成を終えた段階で「あれ?この作業testデータにもやらなきゃでは!?」と
膨大なコーディオングをもう一度やらなければいけないことに落胆しております。
「そもそも初めからpd.concat等でtrainデータとtestデータを合体させておけばよかったのか、、、」と
思ったりもしたのですが、concatした後、いざmodelにfitさせる段階でconcatしたものを再度
trainデータとtestデータに分ける方法が分かりません、、、、

皆さんは、この問題をどのように解決していますでしょうか。
特徴量の作成をdef関数等で済ませ、それをtrainとtestに当てはめる等
色々やり方はあるのかなと思ったりもするのですが、、、、
何か、効率の良い方法があればご教示頂きたいです。
何卒よろしくお願い致します。

下記のように、私は全てtrainとtestを書いてコーディングを2倍しています、、、

train = train[train['間取り'] != 'オープンフロア']
test = test[test['間取り'] != 'オープンフロア']
0

2Answer

特徴量の作成をdef関数等で済ませ、それをtrainとtestに当てはめる等

これが良いと思います。

concatした後、いざmodelにfitさせる段階でconcatしたものを再度
trainデータとtestデータに分ける方法が分かりません、、、、

上記の方法(共通の前処理や特徴量抽出を関数にする方法)が良いと思いますが、何らかの都合によりこちらでやるなら、データフレーム (pd.DataFrame) にtestデータかどうかを表す列を追加して、これをもとに分けるのはどうでしょうか。

# train, testともにpd.DataFrame
train["is_test"] = False
test["is_test"] = True

# train, testを結合
train_and_test = pd.concat([train, test])

# 特徴抽出。抽出結果がデータフレームの列として追加される想定
train_and_test = extract_feature(train_and_test)

# 列is_testをもとに、trainとtestを取り出す
train_new = train_and_test[~train_and_test["is_test"]]
test_new = train_and_test[train_and_test["is_test"]]

特徴抽出の処理で行数や行の並びが変わらないなら、trainとtestそれぞれの行番号をもとに取り出してもいいですね。

3

Comments

  1. @marcopagot

    Questioner
    mamo3gr様
    大変分かりやすいご回答ありがとうございます😭
    やはり、関数で共通の作業を作るのが最も効率は良いのですね、、、
    関数の勉強をします!
This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌