2

ロジスティック回帰のようなアルゴリズムで分類できるように、カテゴリデータをバイナリに変換しようとしています。「sklearn.preprocessing」モジュールの OneHotEncoder を使用することを考えましたが、問題は、データフレーム エントリが A、B の異なる長さの配列のペアであり、各行に他の行の配列の長さと等しくない同じ長さの配列のペアがあることです。 OneHotEncoderは私のようなデータフレームを受け入れません

[34]: data.index

Out[34]: インデックス([train1, train2, train3, ..., train7829, train7830, train7831], dtype=object)

In [35]:  data.columns

Out[35]:  Index([A, B], dtype=object)

SampleID                      A                                B
train1      [2092.0, 1143.0, 390.0, ...]          [5651.0, 4449.0, 4012.0...]
train2      [3158.0, 3158.0, 3684.0, 3684.0....]  [2.0, 4.0, 2.0, 1.0...]
train3      [1699.0, 1808.0 ,...]                 [0.0, 1.0...]

したがって、A と B の各ペアの長さは同じですが、ペアごとに長さが異なることを再度強調したいと思います。データフレームには、数値、カテゴリ、およびバイナリ値が含まれています。すべてのエントリ タイプに関する情報を含む別の csv ファイルがあります。次のように、両方の列のカテゴリエントリを除外するファイルを読み取ります。

info=data_io.read_train_info()
col1=info.columns[0]
col2=info.columns[1]
info=info[(info[col1]=='Categorical')&(info[col2]=='Categorical')]

次にinfo.index、トレーニングデータフレームをフィルタリングするために使用します

filtered = data.loc[info.index]

後でエンコードできるように、各配列の次元を変更するユーティリティ関数を作成したよりも

def setDim(df):
    for item in x[x.columns[0]].index:
        df[df.columns[0]][item].shape=(1,df[df.columns[0]][item].shape[0])
        df[df.columns[1]][item].shape=(1,df[df.columns[1]][item].shape[0])

setDim(filtered)

次に、配列の各ペアを2行の行列に結合して、エンコーダーに渡し、エンコード後に再度分離できるようにすることを考えました。

import numpy as np
from sklearn.preprocessing import OneHotEncoder

def makeSparse(df):
   enc = OneHotEncoder()
   for i in df.index:
     cd=np.append(df['A'][i],df['B'][i],axis=0)
     a=enc.fit_transform(cd)
     df['A'][i] = a[0,:]
     df['B'][i] = a[1,:]

makeSparse(filtered)

これらすべての手順を実行すると、スパース データフレームが取得されます。私の質問は次のとおりです。

  1. これは、このデータフレームをエンコードする正しい方法ですか?(私はそれを非常に疑っています)
  2. いいえの場合、どのような代替手段を提供しますか?
    私を助けてくれてありがとう。
4

1 に答える 1