woodwork.datacolumn.DataColumnをpandas.core.series.Seriesに変換してpandas.core.frame.DataFrameに結合する方法


背景

AutoMLライブラリのEvalMLを使ってみようと思ったことがあります。

EvalMLを使ってみて、テストデータから予測を試みたときに「結果として出力される型がwoodwork.datacolumn.DataColumnpandas.core.frame.DataFrameに結合できない」という壁に直面しました。

そして、EvalMLやwoodwork.datacolumn.DataColumnのドキュメント、EvalMLの利用例などを調査したのですが、解決策は見当たりませんでした。最終的に解決策は見つかったのですが、同じように悩む人もいるかと思い、この記事を公開します。

前提

Kaggleにおけるタイタニック号の生存者予測を例として挙げます。下記の手順でEvalMLによるテストデータからの予測が実現できます。

import pandas as pd
from evalml.automl import AutoMLSearch

train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')
submission = pd.read_csv('../input/titanic/gender_submission.csv')
label = 'Survived'

X_train = train.drop(columns=[label])
y_train = train[label]

automl = AutoMLSearch(X_train=X_train, y_train=y_train, problem_type='binary')
automl.search()
automl.rankings

pipeline = automl.best_pipeline
pipeline.fit(X_train,y_train)
prediction = pipeline.predict(test)

しかし予測結果として出力されたであろうpredictionを意図したとおりにデータフレームに結合できません。以下のように各データの予測結果が出力されてほしい部分に<DataColumn: Survived (Physical Type = Int64) ...というものが入ってしまっています。

submission[label] = prediction
submission.head()
    PassengerId Survived
0   892 <DataColumn: Survived (Physical Type = Int64) ...
1   893 <DataColumn: Survived (Physical Type = Int64) ...
2   894 <DataColumn: Survived (Physical Type = Int64) ...
3   895 <DataColumn: Survived (Physical Type = Int64) ...
4   896 <DataColumn: Survived (Physical Type = Int64) ...

以下のように、出力されたpredictionの型はwoodwork.datacolumn.DataColumnでした。

type(prediction)
woodwork.datacolumn.DataColumn

結果

以下のように解決できました。

submission[label] = prediction.to_series()
submission.head()
    PassengerId Survived
0   892 0
1   893 0
2   894 0
3   895 0
4   896 1

以下のように、出力されたpredictionの型をpandas.core.series.Seriesに変換しています。

type(prediction.to_series())
pandas.core.series.Series

EvalMLのテストにヒントがありました。

IDE使ってたらこんな悩みもなくなるのでしょうか…?これにより、woodwork.datacolumn.DataColumnpandas.core.series.Seriesに変換してpandas.core.frame.DataFrameに結合し、EvalMLを使ってテストデータから予測ができました。おかげで、Kaggleにおいて、EvalMLを使って以下のようにsubmitまでできました。

よいEvalMLライフを!(※EvalML、オススメです!)