Class: SVMKit::Ensemble::RandomForestRegressor
- Inherits:
-
Object
- Object
- SVMKit::Ensemble::RandomForestRegressor
- Includes:
- Base::BaseEstimator, Base::Regressor
- Defined in:
- lib/svmkit/ensemble/random_forest_regressor.rb
Overview
RandomForestRegressor is a class that implements random forest for regression
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, 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, random_seed: nil) ⇒ RandomForestRegressor
Create a new regressor with random forest.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 49 def initialize(n_estimators: 10, criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1, max_features: nil, random_seed: nil) check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes, max_features: max_features, 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[: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.
26 27 28 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 26 def estimators @estimators end |
#feature_importances ⇒ Numo::DFloat (readonly)
Return the importance for each feature.
30 31 32 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 30 def feature_importances @feature_importances end |
#rng ⇒ Random (readonly)
Return the random generator for random selection of feature index.
34 35 36 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 34 def rng @rng end |
Instance Method Details
#apply(x) ⇒ Numo::Int32
Return the index of the leaf that each sample reached.
115 116 117 118 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 115 def apply(x) SVMKit::Validation.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.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 77 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] ||= n_features @params[:max_features] = [[1, @params[:max_features]].max, Math.sqrt(n_features).to_i].min single_target = y.shape[1].nil? # Construct forest. @estimators = Array.new(@params[:n_estimators]) do |_n| tree = Tree::DecisionTreeRegressor.new( criterion: @params[:criterion], max_depth: @params[:max_depth], max_leaf_nodes: @params[:max_leaf_nodes], min_samples_leaf: @params[:min_samples_leaf], max_features: @params[:max_features], random_seed: @params[:random_seed] ) bootstrap_ids = Array.new(n_samples) { @rng.rand(0...n_samples) } tree.fit(x[bootstrap_ids, true], single_target ? y[bootstrap_ids] : y[bootstrap_ids, true]) end # Calculate feature importances. @feature_importances = @estimators.map(&:feature_importances).reduce(&:+) @feature_importances /= @feature_importances.sum self end |
#marshal_dump ⇒ Hash
Dump marshal data.
122 123 124 125 126 127 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 122 def marshal_dump { params: @params, estimators: @estimators, feature_importances: @feature_importances, rng: @rng } end |
#marshal_load(obj) ⇒ nil
Load marshal data.
131 132 133 134 135 136 137 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 131 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.
106 107 108 109 |
# File 'lib/svmkit/ensemble/random_forest_regressor.rb', line 106 def predict(x) check_sample_array(x) @estimators.map { |est| est.predict(x) }.reduce(&:+) / @params[:n_estimators] end |