web-dev-qa-db-ja.com

scikit-learnでの前処理後にデータフレームの列ヘッダーを保持する方法

pandasデータフレームには行と列があります。各列にはヘッダーがあります。パンダでデータ操作操作を続ける限り、変数ヘッダーは保持されます。 Sci-kit-learn libのデータ前処理機能を試してみると、ヘッダーがすべて失われ、フレームは数字のマトリックスに変換されます。

Scikit-learnが出力としてnumpy ndarrayを与えるので、なぜそれが起こるのか理解しています。そして、numpy ndarrayは単なる行列であり、列名はありません。

しかし、ここにあります。データセットに何らかのモデルを構築している場合、初期データの前処理とモデルの試行の後でも、より適切な他のモデルを実行するには、さらにデータ操作タスクを実行する必要があります。特定の変数のインデックスがわからない場合があるため、列ヘッダーにアクセスできないとデータ操作が困難になりますが、変数名を覚えたり、df.columnsを実行することで検索することも簡単です。

それを克服する方法は?

EDIT1:サンプルデータのスナップショットを使用した編集。

    Pclass  Sex Age SibSp   Parch   Fare    Embarked
0   3   0   22  1   0   7.2500  1
1   1   1   38  1   0   71.2833 2
2   3   1   26  0   0   7.9250  1
3   1   1   35  1   0   53.1000 1
4   3   0   35  0   0   8.0500  1
5   3   0   NaN 0   0   8.4583  3
6   1   0   54  0   0   51.8625 1
7   3   0   2   3   1   21.0750 1
8   3   1   27  0   2   11.1333 1
9   2   1   14  1   0   30.0708 2
10  3   1   4   1   1   16.7000 1
11  1   1   58  0   0   26.5500 1
12  3   0   20  0   0   8.0500  1
13  3   0   39  1   5   31.2750 1
14  3   1   14  0   0   7.8542  1
15  2   1   55  0   0   16.0000 1

上記は基本的にpandasデータフレームです。このデータフレームでこれを行うと、列ヘッダーが削除されます。

from sklearn import preprocessing 
X_imputed=preprocessing.Imputer().fit_transform(X_train) 
X_imputed

新しいデータはnumpy配列であるため、列名は削除されます。

array([[  3.        ,   0.        ,  22.        , ...,   0.        ,
          7.25      ,   1.        ],
       [  1.        ,   1.        ,  38.        , ...,   0.        ,
         71.2833    ,   2.        ],
       [  3.        ,   1.        ,  26.        , ...,   0.        ,
          7.925     ,   1.        ],
       ..., 
       [  3.        ,   1.        ,  29.69911765, ...,   2.        ,
         23.45      ,   1.        ],
       [  1.        ,   0.        ,  26.        , ...,   0.        ,
         30.        ,   2.        ],
       [  3.        ,   0.        ,  32.        , ...,   0.        ,
          7.75      ,   3.        ]])

したがって、pandasデータフレームでデータ操作を行うときに列名を保持したいと思います。

31
Baktaawar

ほとんどの場合、scikit-learnは実際に列ヘッダーを削除するため、後で追加し直します。あなたの例では、X_imputedとしてsklearn.preprocessing出力およびX_train元のデータフレームとして、次を使用して列ヘッダーを戻すことができます。

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)
33
selwyth

AMI Tavory's reply here によると、ドキュメントごとに、Imputerは空の列または行を省略します(ただし、実行します)。
したがって、Imputerを実行し、説明されているように列名を設定する前に 上記 、次のように実行します(列の場合):

X_train=X_train.dropna(axis=1, how='all')

df.dropnaはここで説明されています。

3
AChervony