0

不均衡学習ライブラリの SMOTENC を使用して、カテゴリ変数と数値変数の両方を含むデータフレームをオーバーサンプリングしようとしています。全部で 55 列あり、そのうち 3 つは数値です。データセット内のクラスごとのサンプル数 (値のカウント) は次のとおりです。

ID   #of samples
2    281
0    184
6     57
4     27
3      5
7      3

このデータセットを次のコードでオーバーサンプリングしようとしています:

sm = SMOTENC(cat_features, random_state=42, k_neighbors=1)
x_res, y_res = sm.fit_resample(x, y)

cat_features にはカテゴリ列のインデックスが含まれ、y には各サンプルのクラス メンバーシップが含まれ、x には残りの特徴が含まれます。ただし、このデータセットをオーバーサンプリングすることはできず、代わりにエラーが発生します ValueError: could not broadcast input array from the shape (3,96) into shape (184,96)。私が理解できる限り、エラーは ID 7 のクラスに関連しています。SMOTENC がこのクラスをオーバーサンプリングできないのはなぜですか? データセットをオーバーサンプリングするために提供する必要があるサンプルの最小数などの制限はありますか? また、私は 96 列を持っていません。それはどこから来たのですか?

エラーに関するより詳細な情報は次のとおりです。私のカテゴリ機能はすべてバイナリであり、すでにワンホット エンコードされていることに注意してください。したがって、SMOTENC による追加のエンコードは必要ありません。つまり、列の数を増やすことは想定されていません。エラーが発生する正確な行は

..\lib\site-packages\imblearn\over_sampling\_smote\base.py", line 577, in _generate_samples
    ] = self._X_categorical_minority_encoded

この関数 (_generate_samples) のコメントには、「std の中央値がゼロに等しい場合、OHE のエンコードに基づいて null 以外のエントリを作成する必要がある」と書かれています。base.py でエラーが発生する完全な部分は次のとおりです。

if math.isclose(self.median_std_, 0):
            nn_data[
                :, self.continuous_features_.size :
            ] = self._X_categorical_minority_encoded

ただし、データセット内のサンプルが互いに同一ではないことがわかっているため、標準偏差がゼロになる方法がわかりません。したがって、std は 0 とは異なる必要があります。数値列 (多数のゼロ値があります)。SMOTE のソース コードで、スパース列を処理する関数があることを確認しましたが、正常に動作しないようで、エラーが発生しています。この問題を解決する方法がわかりません。これに関するヘルプやアドバイスをいただければ幸いです。

4

0 に答える 0