Closed ShotaArima closed 2 months ago
このコードは、プレプリントで説明されているLowProFoolアルゴリズムの実装と評価を行っています。以下に、プレプリントの内容がどの程度反映されているか、および改善が必要な点をまとめます:
adversarial examples
の生成coherence
の概念の実装が明示的でないget_bounds
)でエラーが発生しており、デバッグが必要credit-g
)に特化しており、汎用性に欠ける部分があるMaxIters
, Alpha
, Lambda
)の根拠が不明確coherenceとは、
生成された敵対的サンプルが現実世界で意味をもち、妥当性を保つことを意味する
プレプリントでの定義
生成された攻撃が自然で、直感的、人間の知識によって設計された厳格な境界内にあること
目的
- 生成された adversarial examples が、元のデータの分布から大きく逸脱しないようにする。
- 現実世界で意味のある、解釈可能な例を生成する。
実装方法
- 各特徴の自然な、直感的、または厳格な境界を定義する。
- 生成された adversarial examples がこれらの境界内に収まるようにする。
- 必要に応じて、生成された値を適切な範囲内に収めるためにクリッピングや丸めを行う。
コード内では、この概念は主に clip 関数やデータの前処理段階で部分的に実装されていますが、より明示的かつ包括的な実装が必要かもしれません。例えば、各特徴ごとに特定の制約を定義し、adversarial example の生成過程でこれらの制約を常に遵守するようなメカニズムを追加することが考えられます。
get_bounds
関数の定義が複数回行われており、最後の定義と使用方法が一致していない可能性があります。LowProFool
とDeepfool
の両方で成功率が10%と低くなっています。~#15 Issueを作成~ complete and merged
このコードは全体としてプレプリントの内容を反映していますが、上記の改善を行うことで、研究の再現性と理解可能性がさらに向上すると考えられます。
scater
を使用しなかったまず、問題のある列を特定します
for col in feature_names:
if df[col].dtype == 'object':
print(f"Column {col} contains non-numeric data: {df[col].unique()}")
問題のある列に対して、適切な変換を行います。例えば:
def clean_data(df):
# '<0' を 0 に置き換える例
df = df.replace('<0', 0)
# その他の特殊なケースの処理
# df['column_name'] = df['column_name'].map({'category1': 0, 'category2': 1, ...})
return df
df = clean_data(df)
カテゴリカル変数を数値に変換します。
from sklearn.preprocessing import LabelEncoder
def encode_categorical(df, feature_names):
le = LabelEncoder()
for col in feature_names:
if df[col].dtype == 'object':
df[col] = le.fit_transform(df[col].astype(str))
return df
df = encode_categorical(df, feature_names)
normalize
関数の修正:数値データのみをスケーリングするように関数を修正します。
def normalize(df, target, feature_names, bounds):
df_return = df.copy()
# 数値型の列のみを選択
numeric_features = df_return[feature_names].select_dtypes(include=[np.number]).columns
scaler = MinMaxScaler()
df_return[numeric_features] = scaler.fit_transform(df_return[numeric_features])
# boundsの更新(必要に応じて)
# ...
return scaler, df_return, bounds # boundsの更新方法に応じて変更
# 使用例
scaler, df, bounds = normalize(df, target, feature_names, bounds)
get_df
関数の修正:データを読み込む際に、カテゴリカル変数を適切に処理します。
def get_df(dataset):
# ... (既存のコード)
# カテゴリカル変数の処理
for col in df.columns:
if df[col].dtype == 'object':
df[col] = pd.Categorical(df[col]).codes
return df, 'target', feature_names
これらの修正を適用した後、再度コードを実行してみてください。エラーが解消され、数値データの処理が正しく行われるはずです。 また、データの前処理段階でpandas.get_dummies()を使用してカテゴリカル変数を処理する方法も検討してください。これにより、カテゴリカル変数が適切に数値化され、モデルに入力できる形式になります。
close #9