Class: Rumale::Ensemble::RandomForestRegressor
- Inherits:
-
Object
- Object
- Rumale::Ensemble::RandomForestRegressor
- Includes:
- Base::BaseEstimator, Base::Regressor
- Defined in:
- lib/rumale/ensemble/random_forest_regressor.rb
Overview
RandomForestRegressor is a class that implements random forest for regression
Direct Known Subclasses
Instance Attribute Summary collapse
-
#estimators ⇒ Array<DecisionTreeRegressor>
readonly
Return the set of estimators.
-
#feature_importances ⇒ Numo::DFloat
readonly
Return the importance for each feature.
-
#rng ⇒ Random
readonly
Return the random generator for random selection of feature index.
Attributes included from Base::BaseEstimator
Instance Method Summary collapse
-
#apply(x) ⇒ Numo::Int32
Return the index of the leaf that each sample reached.
-
#fit(x, y) ⇒ RandomForestRegressor
Fit the model with given training data.
-
#initialize(n_estimators: 10, criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1, max_features: nil, n_jobs: nil, random_seed: nil) ⇒ RandomForestRegressor
constructor
Create a new regressor with random forest.
-
#marshal_dump ⇒ Hash
Dump marshal data.
-
#marshal_load(obj) ⇒ nil
Load marshal data.
-
#predict(x) ⇒ Numo::DFloat
Predict values for samples.
Methods included from Base::Regressor
Constructor Details
#initialize(n_estimators: 10, criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1, max_features: nil, n_jobs: nil, random_seed: nil) ⇒ RandomForestRegressor
Create a new regressor with random forest.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 52 def initialize(n_estimators: 10, criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1, max_features: nil, n_jobs: nil, random_seed: nil) check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes, max_features: max_features, n_jobs: n_jobs, random_seed: random_seed) check_params_integer(n_estimators: n_estimators, min_samples_leaf: min_samples_leaf) check_params_string(criterion: criterion) check_params_positive(n_estimators: n_estimators, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes, min_samples_leaf: min_samples_leaf, max_features: max_features) @params = {} @params[:n_estimators] = n_estimators @params[:criterion] = criterion @params[:max_depth] = max_depth @params[:max_leaf_nodes] = max_leaf_nodes @params[:min_samples_leaf] = min_samples_leaf @params[:max_features] = max_features @params[:n_jobs] = n_jobs @params[:random_seed] = random_seed @params[:random_seed] ||= srand @estimators = nil @feature_importances = nil @rng = Random.new(@params[:random_seed]) end |
Instance Attribute Details
#estimators ⇒ Array<DecisionTreeRegressor> (readonly)
Return the set of estimators.
25 26 27 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 25 def estimators @estimators end |
#feature_importances ⇒ Numo::DFloat (readonly)
Return the importance for each feature.
29 30 31 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 29 def feature_importances @feature_importances end |
#rng ⇒ Random (readonly)
Return the random generator for random selection of feature index.
33 34 35 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 33 def rng @rng end |
Instance Method Details
#apply(x) ⇒ Numo::Int32
Return the index of the leaf that each sample reached.
137 138 139 140 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 137 def apply(x) check_sample_array(x) Numo::Int32[*Array.new(@params[:n_estimators]) { |n| @estimators[n].apply(x) }].transpose end |
#fit(x, y) ⇒ RandomForestRegressor
Fit the model with given training data.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 82 def fit(x, y) check_sample_array(x) check_tvalue_array(y) check_sample_tvalue_size(x, y) # Initialize some variables. n_samples, n_features = x.shape @params[:max_features] = Math.sqrt(n_features).to_i unless @params[:max_features].is_a?(Integer) @params[:max_features] = [[1, @params[:max_features]].max, n_features].min single_target = y.shape[1].nil? sub_rng = @rng.dup rngs = Array.new(@params[:n_estimators]) { Random.new(sub_rng.rand(Rumale::Values.int_max)) } # Construct forest. @estimators = if enable_parallel? # :nocov: parallel_map(@params[:n_estimators]) do |n| bootstrap_ids = Array.new(n_samples) { rngs[n].rand(0...n_samples) } tree = plant_tree(rngs[n].rand(Rumale::Values.int_max)) tree.fit(x[bootstrap_ids, true], single_target ? y[bootstrap_ids] : y[bootstrap_ids, true]) end # :nocov: else Array.new(@params[:n_estimators]) do |n| bootstrap_ids = Array.new(n_samples) { rngs[n].rand(0...n_samples) } tree = plant_tree(rngs[n].rand(Rumale::Values.int_max)) tree.fit(x[bootstrap_ids, true], single_target ? y[bootstrap_ids] : y[bootstrap_ids, true]) end end @feature_importances = if enable_parallel? parallel_map(@params[:n_estimators]) { |n| @estimators[n].feature_importances }.reduce(&:+) else @estimators.map(&:feature_importances).reduce(&:+) end @feature_importances /= @feature_importances.sum self end |
#marshal_dump ⇒ Hash
Dump marshal data.
144 145 146 147 148 149 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 144 def marshal_dump { params: @params, estimators: @estimators, feature_importances: @feature_importances, rng: @rng } end |
#marshal_load(obj) ⇒ nil
Load marshal data.
153 154 155 156 157 158 159 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 153 def marshal_load(obj) @params = obj[:params] @estimators = obj[:estimators] @feature_importances = obj[:feature_importances] @rng = obj[:rng] nil end |
#predict(x) ⇒ Numo::DFloat
Predict values for samples.
124 125 126 127 128 129 130 131 |
# File 'lib/rumale/ensemble/random_forest_regressor.rb', line 124 def predict(x) check_sample_array(x) if enable_parallel? parallel_map(@params[:n_estimators]) { |n| @estimators[n].predict(x) }.reduce(&:+) / @params[:n_estimators] else @estimators.map { |tree| tree.predict(x) }.reduce(&:+) / @params[:n_estimators] end end |