web-dev-qa-db-ja.com

最適なパラメータに対応するランダムフォレストツリーをプロットする方法

Python:3.6

ウインドウズ10

ランダムフォレストと手元の問題に関する質問はほとんどありません。

グリッドフォレストを使用して、ランダムフォレストを使用して回帰問題を実行しています。 gridsearchが見つけた最適なパラメーターに対応するツリーをプロットしたいと思います。これがコードです。

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=55)

    # Use the random grid to search for best hyperparameters
    # First create the base model to tune
    rf = RandomForestRegressor()
    # Random search of parameters, using 3 fold cross validation, 
    # search across 100 different combinations, and use all available cores
    rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 50, cv = 5, verbose=2, random_state=56, n_jobs = -1)
    # Fit the random search model
    rf_random.fit(X_train, y_train)

    rf_random.best_params_

最良のパラメータは次のとおりです。

    {'n_estimators': 1000,
     'min_samples_split': 5,
     'min_samples_leaf': 1,
     'max_features': 'auto',
     'max_depth': 5,
     'bootstrap': True}
  1. 上記のパラメータを使用してこのツリーをプロットするにはどうすればよいですか?

  2. 私の従属変数yは[0,1](連続)の範囲内にあり、すべての予測子変数はバイナリまたはカテゴリカルです。この入力フィーチャ空間と出力フィーチャ空間で一般的にどのアルゴリズムがうまく機能するか。ランダムフォレストで試してみました。 (その良い結果を与えませんでした)。ここでy変数は一種の比率であるため、0と1の間であることに注意してください。Example: Expense on food/Total Expense

  3. 上記のデータは歪んでいます。これは、従属変数またはy変数がデータの60%でvalue = 1を持ち、残りのデータで0と1の間のどこかにあることを意味します。 0.66, 0.87など。

  4. 私のデータにはバイナリ{0,1}とカテゴリ変数{A,B,C}しかないため。ランダムフォレストを使用するためにone-hot encoding変数に変換する必要がありますか?

3
MAC

プロットについて(あなたの他の質問はSOにはあまりにも広範であり、一般的な考えは同時に複数の質問をすることを避けることです):

RandomizedSearchCVをフィッティングすると、rf_random.best_estimator_が生成されます。これは、質問に示されたパラメーター('n_estimators': 1000を含む)を持つランダムフォレストです。

docs によると、適合したRandomForestRegressorには属性が含まれています。

estimators_:DecisionTreeRegressorのリスト

適合したサブ推定量のコレクション。

したがって、ランダムフォレストの個々のツリーをプロットするには、次のいずれかを使用する必要があります。

from sklearn import tree
tree.plot_tree(rf_random.best_estimator_.estimators_[k])

または

from sklearn import tree
tree.export_graphviz(rf_random.best_estimator_.estimators_[k])

あなたのケースでは[0, 999]の希望するkに対して(一般的なケースでは[0, n_estimators-1])。

1
desertnaut

質問に答える前に、少し前に戻ります。

理想的には、RandomizedSearchCVGridSearchCVbest_params_の出力をさらにドリルダウンする必要があります。 RandomizedSearchCVは、すべての可能なオプションを試さずにパラメーターを調べます。次に、RandomizedSearchCVbest_params_を取得すると、より狭い範囲ですべての可能なオプションを調査できます。

コード入力にrandom_gridパラメータを含めませんでしたが、次のようにGridSearchCVを実行することを期待しています:

# Create the parameter grid based on the results of RandomizedSearchCV
param_grid = {
    'max_depth': [4, 5, 6],
    'min_samples_leaf': [1, 2],
    'min_samples_split': [4, 5, 6],
    'n_estimators': [990, 1000, 1010]
}
# Fit the grid search model
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid, 
                          cv = 5, n_jobs = -1, verbose = 2, random_state=56)

上記のことは、param_gridのパラメーターの可能なすべての組み合わせを調べ、最適なパラメーターを提供することです。

今あなたの質問に来ています:

  1. ランダムフォレストは複数のツリーの組み合わせです。したがって、プロットできるツリーは1つだけではありません。代わりにできることは、ランダムフォレストで使用される個々のツリーを1つ以上プロットすることです。これは plot_tree 関数で実現できます。ドキュメントとこの [〜#〜] so [〜#〜] の質問を読んで、理解を深めてください。

  2. 最初に単純な線形回帰を試しましたか?

  3. これは、モデルの適合性/精度を評価するためにどのような精度メトリックスを利用するかに影響します。不均衡/歪んだデータを処理するときに、精度、再現率、F1スコアが思い浮かびます

  4. はい、ランダム変数のフォレストをフィッティングする前に、カテゴリ変数をダミー変数に変換する必要があります

1
finlytics-hub