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}
上記のパラメータを使用してこのツリーをプロットするにはどうすればよいですか?
私の従属変数y
は[0,1](連続)の範囲内にあり、すべての予測子変数はバイナリまたはカテゴリカルです。この入力フィーチャ空間と出力フィーチャ空間で一般的にどのアルゴリズムがうまく機能するか。ランダムフォレストで試してみました。 (その良い結果を与えませんでした)。ここでy
変数は一種の比率であるため、0と1の間であることに注意してください。Example: Expense on food/Total Expense
上記のデータは歪んでいます。これは、従属変数またはy
変数がデータの60%でvalue = 1
を持ち、残りのデータで0と1の間のどこかにあることを意味します。 0.66, 0.87
など。
私のデータにはバイナリ{0,1}
とカテゴリ変数{A,B,C}
しかないため。ランダムフォレストを使用するためにone-hot encoding
変数に変換する必要がありますか?
プロットについて(あなたの他の質問は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]
)。
質問に答える前に、少し前に戻ります。
理想的には、RandomizedSearchCV
のGridSearchCV
のbest_params_
の出力をさらにドリルダウンする必要があります。 RandomizedSearchCV
は、すべての可能なオプションを試さずにパラメーターを調べます。次に、RandomizedSearchCV
のbest_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つ以上プロットすることです。これは plot_tree 関数で実現できます。ドキュメントとこの [〜#〜] so [〜#〜] の質問を読んで、理解を深めてください。
最初に単純な線形回帰を試しましたか?
これは、モデルの適合性/精度を評価するためにどのような精度メトリックスを利用するかに影響します。不均衡/歪んだデータを処理するときに、精度、再現率、F1スコアが思い浮かびます
はい、ランダム変数のフォレストをフィッティングする前に、カテゴリ変数をダミー変数に変換する必要があります