2

デシジョン ツリーがデータのスケーリングの影響を受けないことはわかっていますが、デシジョン ツリー内でデータをスケーリングすると、パフォーマンスが低下します (再現率、精度、精度が低下します)。

しかし、すべてのパフォーマンス メトリクスをスケーリングしないと、デシジョン ツリーから驚くべき結果が得られます。どうすればいいの?

注: GridSearchCV を使用していますが、クロス検証が問題の原因であるとは思いません。これが私のコードです:

scaled = MinMaxScaler()

pca = PCA()

bestK = SelectKBest()

combined_transformers = FeatureUnion([ ("scale",scaled),("best", bestK),         
("pca", pca)])

clf = tree.DecisionTreeClassifier(class_weight= "balanced")

pipeline = Pipeline([("features", combined_transformers), ("tree", clf)])

param_grid = dict(features__pca__n_components=[1, 2,3],
      features__best__k=[1, 2,3],
      tree__min_samples_split=[4,5],
      tree__max_depth= [4,5],
     )

grid_search = GridSearchCV(pipeline, param_grid=param_grid,scoring='f1')
grid_search.fit(features,labels)

スケール関数 MinMaxScaler() を使用すると、私のパフォーマンスは次のようになります。

f1 =  0.837209302326
recall =  1.0
precision =  0.72
accuracy =  0.948148148148

ただし、スケーリングなし:

f1 =  0.918918918919
recall =  0.944444444444
precision =  0.894736842105
accuracy =  0.977777777778
4

1 に答える 1

1

私は scikit-learn に詳しくないので、何か誤解していたらすみません。

まず第一に、PCA は機能を標準化しますか? そうでない場合、スケーリングされた入力とスケーリングされていない入力で異なる結果が得られます。

第 2 に、サンプルの分割はランダムであるため、CV は実行ごとに異なる結果をもたらす可能性があります。これは、特にサンプル サイズが小さい場合に結果に影響します。また、サンプルサイズが小さい場合、結果はそれほど変わらない場合があります。

次の提案があります。

  1. スケーリングは、CV によって最適化できる追加のハイパーパラメーターとして扱うことができます。
  2. 追加の CV (ネストされた CV と呼ばれます) またはホールドアウトを実行して、パフォーマンスを見積もります。これは、テスト セットを保持し、トレーニング データで CV を使用してモデルを選択し、テスト セットでのパフォーマンスを評価することによって行われます (ネストされた CV の場合は、すべてのフォールドに対してこれを繰り返し実行し、パフォーマンス推定値を平均化します)。もちろん、最終的なモデルはデータセット全体でトレーニングする必要があります。一般に、モデル選択に使用される CV のパフォーマンス推定値は過度に楽観的であるため、使用しないでください。
于 2016-06-08T20:55:47.000 に答える