From e876e37730abe3a61c19913677cf5820f4e55a9e Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 21 Sep 2022 15:37:22 -0700 Subject: [PATCH 1/5] add seed param to search params --- src/cluster/kmeans.rs | 13 +++++++++++++ src/svm/svc.rs | 14 ++++++++++++++ src/tree/decision_tree_classifier.rs | 20 ++++++++++++++++++++ src/tree/decision_tree_regressor.rs | 14 ++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index fee1425d..404f7b06 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -145,6 +145,9 @@ pub struct KMeansSearchParameters { pub k: Vec, /// Maximum number of iterations of the k-means algorithm for a single run. pub max_iter: Vec, + /// Determines random number generation for centroid initialization. + /// Use an int to make the randomness deterministic + pub seed: Vec>, } /// KMeans grid search iterator @@ -152,6 +155,7 @@ pub struct KMeansSearchParametersIterator { kmeans_search_parameters: KMeansSearchParameters, current_k: usize, current_max_iter: usize, + current_seed: usize, } impl IntoIterator for KMeansSearchParameters { @@ -163,6 +167,7 @@ impl IntoIterator for KMeansSearchParameters { kmeans_search_parameters: self, current_k: 0, current_max_iter: 0, + current_seed: 0, } } } @@ -173,6 +178,7 @@ impl Iterator for KMeansSearchParametersIterator { fn next(&mut self) -> Option { if self.current_k == self.kmeans_search_parameters.k.len() && self.current_max_iter == self.kmeans_search_parameters.max_iter.len() + && self.current_seed == self.kmeans_search_parameters.seed.len() { return None; } @@ -180,6 +186,7 @@ impl Iterator for KMeansSearchParametersIterator { let next = KMeansParameters { k: self.kmeans_search_parameters.k[self.current_k], max_iter: self.kmeans_search_parameters.max_iter[self.current_max_iter], + seed: self.kmeans_search_parameters.seed[self.current_seed], }; if self.current_k + 1 < self.kmeans_search_parameters.k.len() { @@ -187,9 +194,14 @@ impl Iterator for KMeansSearchParametersIterator { } else if self.current_max_iter + 1 < self.kmeans_search_parameters.max_iter.len() { self.current_k = 0; self.current_max_iter += 1; + } else if self.current_seed + 1 < self.kmeans_search_parameters.seed.len() { + self.current_k = 0; + self.current_max_iter = 0; + self.current_seed += 1; } else { self.current_k += 1; self.current_max_iter += 1; + self.current_seed += 1; } Some(next) @@ -203,6 +215,7 @@ impl Default for KMeansSearchParameters { KMeansSearchParameters { k: vec![default_params.k], max_iter: vec![default_params.max_iter], + seed: vec![default_params.seed], } } } diff --git a/src/svm/svc.rs b/src/svm/svc.rs index 94c6d9e7..d390866f 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -119,6 +119,8 @@ pub struct SVCSearchParameters, K: Kernel, /// Unused parameter. m: PhantomData, + /// Controls the pseudo random number generation for shuffling the data for probability estimates + seed: Vec>, } /// SVC grid search iterator @@ -128,6 +130,7 @@ pub struct SVCSearchParametersIterator, K: Kernel, K: Kernel> IntoIterator @@ -143,6 +146,7 @@ impl, K: Kernel> IntoIterator current_c: 0, current_tol: 0, current_kernel: 0, + current_seed: 0, } } } @@ -157,6 +161,7 @@ impl, K: Kernel> Iterator && self.current_c == self.svc_search_parameters.c.len() && self.current_tol == self.svc_search_parameters.tol.len() && self.current_kernel == self.svc_search_parameters.kernel.len() + && self.current_seed == self.svc_search_parameters.kernel.len() { return None; } @@ -167,6 +172,7 @@ impl, K: Kernel> Iterator tol: self.svc_search_parameters.tol[self.current_tol], kernel: self.svc_search_parameters.kernel[self.current_kernel].clone(), m: PhantomData, + seed: self.svc_search_parameters.seed[self.current_seed], }; if self.current_epoch + 1 < self.svc_search_parameters.epoch.len() { @@ -183,11 +189,18 @@ impl, K: Kernel> Iterator self.current_c = 0; self.current_tol = 0; self.current_kernel += 1; + } else if self.current_kernel + 1 < self.svc_search_parameters.kernel.len() { + self.current_epoch = 0; + self.current_c = 0; + self.current_tol = 0; + self.current_kernel = 0; + self.current_seed += 1; } else { self.current_epoch += 1; self.current_c += 1; self.current_tol += 1; self.current_kernel += 1; + self.current_seed += 1; } Some(next) @@ -204,6 +217,7 @@ impl> Default for SVCSearchParameters, + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub max_depth: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_leaf: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_split: Vec, + #[cfg_attr(feature = "serde", serde(default))] + /// Controls the randomness of the estimator + pub seed: Vec>, } /// DecisionTreeClassifier grid search iterator @@ -226,6 +233,7 @@ pub struct DecisionTreeClassifierSearchParametersIterator { current_max_depth: usize, current_min_samples_leaf: usize, current_min_samples_split: usize, + current_seed: usize, } impl IntoIterator for DecisionTreeClassifierSearchParameters { @@ -239,6 +247,7 @@ impl IntoIterator for DecisionTreeClassifierSearchParameters { current_max_depth: 0, current_min_samples_leaf: 0, current_min_samples_split: 0, + current_seed: 0, } } } @@ -267,6 +276,7 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { .decision_tree_classifier_search_parameters .min_samples_split .len() + && self.current_seed == self.decision_tree_classifier_search_parameters.seed.len() { return None; } @@ -283,6 +293,7 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { min_samples_split: self .decision_tree_classifier_search_parameters .min_samples_split[self.current_min_samples_split], + seed: self.decision_tree_classifier_search_parameters.seed[self.current_seed], }; if self.current_criterion + 1 @@ -319,11 +330,19 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { self.current_max_depth = 0; self.current_min_samples_leaf = 0; self.current_min_samples_split += 1; + } else if self.current_seed + 1 < self.decision_tree_classifier_search_parameters.seed.len() + { + self.current_criterion = 0; + self.current_max_depth = 0; + self.current_min_samples_leaf = 0; + self.current_min_samples_split = 0; + self.current_seed += 1; } else { self.current_criterion += 1; self.current_max_depth += 1; self.current_min_samples_leaf += 1; self.current_min_samples_split += 1; + self.current_seed += 1; } Some(next) @@ -339,6 +358,7 @@ impl Default for DecisionTreeClassifierSearchParameters { max_depth: vec![default_params.max_depth], min_samples_leaf: vec![default_params.min_samples_leaf], min_samples_split: vec![default_params.min_samples_split], + seed: vec![default_params.seed], } } } diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index 7d88c40a..12bb9c94 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -148,6 +148,8 @@ pub struct DecisionTreeRegressorSearchParameters { pub min_samples_leaf: Vec, /// The minimum number of samples required to split an internal node. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub min_samples_split: Vec, + /// Controls the randomness of the estimator + pub seed: Vec>, } /// DecisionTreeRegressor grid search iterator @@ -156,6 +158,7 @@ pub struct DecisionTreeRegressorSearchParametersIterator { current_max_depth: usize, current_min_samples_leaf: usize, current_min_samples_split: usize, + current_seed: usize, } impl IntoIterator for DecisionTreeRegressorSearchParameters { @@ -168,6 +171,7 @@ impl IntoIterator for DecisionTreeRegressorSearchParameters { current_max_depth: 0, current_min_samples_leaf: 0, current_min_samples_split: 0, + current_seed: 0, } } } @@ -191,6 +195,7 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { .decision_tree_regressor_search_parameters .min_samples_split .len() + && self.current_seed == self.decision_tree_regressor_search_parameters.seed.len() { return None; } @@ -204,6 +209,7 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { min_samples_split: self .decision_tree_regressor_search_parameters .min_samples_split[self.current_min_samples_split], + seed: self.decision_tree_regressor_search_parameters.seed[self.current_seed], }; if self.current_max_depth + 1 @@ -230,10 +236,17 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { self.current_max_depth = 0; self.current_min_samples_leaf = 0; self.current_min_samples_split += 1; + } else if self.current_seed + 1 < self.decision_tree_regressor_search_parameters.seed.len() + { + self.current_max_depth = 0; + self.current_min_samples_leaf = 0; + self.current_min_samples_split = 0; + self.current_seed += 1; } else { self.current_max_depth += 1; self.current_min_samples_leaf += 1; self.current_min_samples_split += 1; + self.current_seed += 1; } Some(next) @@ -248,6 +261,7 @@ impl Default for DecisionTreeRegressorSearchParameters { max_depth: vec![default_params.max_depth], min_samples_leaf: vec![default_params.min_samples_leaf], min_samples_split: vec![default_params.min_samples_split], + seed: vec![default_params.seed], } } } From a7340cdcf8ed21e72b93a325823fbd33c9d825af Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 21 Sep 2022 15:17:41 -0700 Subject: [PATCH 2/5] make default params available to serde --- src/cluster/dbscan.rs | 8 ++++++++ src/cluster/kmeans.rs | 6 ++++++ src/decomposition/pca.rs | 4 ++++ src/decomposition/svd.rs | 2 ++ src/ensemble/random_forest_classifier.rs | 16 ++++++++++++++++ src/ensemble/random_forest_regressor.rs | 14 ++++++++++++++ src/linear/elastic_net.rs | 10 ++++++++++ src/linear/lasso.rs | 8 ++++++++ src/linear/linear_regression.rs | 6 ++++++ src/linear/logistic_regression.rs | 4 ++++ src/linear/ridge_regression.rs | 5 +++++ src/naive_bayes/bernoulli.rs | 6 ++++++ src/naive_bayes/categorical.rs | 2 ++ src/naive_bayes/gaussian.rs | 2 ++ src/naive_bayes/multinomial.rs | 4 ++++ src/neighbors/knn_classifier.rs | 5 +++++ src/neighbors/knn_regressor.rs | 5 +++++ src/svm/svc.rs | 12 ++++++++++++ src/tree/decision_tree_classifier.rs | 15 +++++++++++++-- src/tree/decision_tree_regressor.rs | 24 +++++++++++++++++++++--- 20 files changed, 153 insertions(+), 5 deletions(-) diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index 621d0173..3ea67fb3 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -68,14 +68,18 @@ pub struct DBSCAN, T>> { #[derive(Debug, Clone)] /// DBSCAN clustering algorithm parameters pub struct DBSCANParameters, T>> { + #[cfg_attr(feature = "serde", serde(default))] /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. /// See [`Distances`](../../math/distance/struct.Distances.html) for a list of available functions. pub distance: D, + #[cfg_attr(feature = "serde", serde(default))] /// The number of samples (or total weight) in a neighborhood for a point to be considered as a core point. pub min_samples: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum distance between two samples for one to be considered as in the neighborhood of the other. pub eps: T, + #[cfg_attr(feature = "serde", serde(default))] /// KNN algorithm to use. pub algorithm: KNNAlgorithmName, } @@ -113,14 +117,18 @@ impl, T>> DBSCANParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct DBSCANSearchParameters, T>> { + #[cfg_attr(feature = "serde", serde(default))] /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. /// See [`Distances`](../../math/distance/struct.Distances.html) for a list of available functions. pub distance: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The number of samples (or total weight) in a neighborhood for a point to be considered as a core point. pub min_samples: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum distance between two samples for one to be considered as in the neighborhood of the other. pub eps: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// KNN algorithm to use. pub algorithm: Vec, } diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index 404f7b06..efeb87bc 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -105,10 +105,13 @@ impl PartialEq for KMeans { #[derive(Debug, Clone)] /// K-Means clustering algorithm parameters pub struct KMeansParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Number of clusters. pub k: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Maximum number of iterations of the k-means algorithm for a single run. pub max_iter: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Determines random number generation for centroid initialization. /// Use an int to make the randomness deterministic pub seed: Option, @@ -141,10 +144,13 @@ impl Default for KMeansParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct KMeansSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Number of clusters. pub k: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Maximum number of iterations of the k-means algorithm for a single run. pub max_iter: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Determines random number generation for centroid initialization. /// Use an int to make the randomness deterministic pub seed: Vec>, diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index 296926a4..a4a23e28 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -86,8 +86,10 @@ impl> PartialEq for PCA { #[derive(Debug, Clone)] /// PCA parameters pub struct PCAParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Number of components to keep. pub n_components: usize, + #[cfg_attr(feature = "serde", serde(default))] /// By default, covariance matrix is used to compute principal components. /// Enable this flag if you want to use correlation matrix instead. pub use_correlation_matrix: bool, @@ -120,8 +122,10 @@ impl Default for PCAParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct PCASearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Number of components to keep. pub n_components: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// By default, covariance matrix is used to compute principal components. /// Enable this flag if you want to use correlation matrix instead. pub use_correlation_matrix: Vec, diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index 3001fd9e..86c29f1b 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -72,6 +72,7 @@ impl> PartialEq for SVD { #[derive(Debug, Clone)] /// SVD parameters pub struct SVDParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Number of components to keep. pub n_components: usize, } @@ -94,6 +95,7 @@ impl SVDParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct SVDSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Maximum number of iterations of the k-means algorithm for a single run. pub n_components: Vec, } diff --git a/src/ensemble/random_forest_classifier.rs b/src/ensemble/random_forest_classifier.rs index 331dab70..42643051 100644 --- a/src/ensemble/random_forest_classifier.rs +++ b/src/ensemble/random_forest_classifier.rs @@ -67,20 +67,28 @@ use crate::tree::decision_tree_classifier::{ #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct RandomForestClassifierParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Split criteria to use when building a tree. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub criterion: SplitCriterion, + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub max_depth: Option, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_leaf: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_split: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The number of trees in the forest. pub n_trees: u16, + #[cfg_attr(feature = "serde", serde(default))] /// Number of random sample of predictors to use as split candidates. pub m: Option, + #[cfg_attr(feature = "serde", serde(default))] /// Whether to keep samples used for tree generation. This is required for OOB prediction. pub keep_samples: bool, + #[cfg_attr(feature = "serde", serde(default))] /// Seed used for bootstrap sampling and feature selection for each tree. pub seed: u64, } @@ -198,20 +206,28 @@ impl> Predictor for RandomForestCla #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct RandomForestClassifierSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Split criteria to use when building a tree. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub criterion: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub max_depth: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_leaf: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_split: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The number of trees in the forest. pub n_trees: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Number of random sample of predictors to use as split candidates. pub m: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// Whether to keep samples used for tree generation. This is required for OOB prediction. pub keep_samples: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Seed used for bootstrap sampling and feature selection for each tree. pub seed: Vec, } diff --git a/src/ensemble/random_forest_regressor.rs b/src/ensemble/random_forest_regressor.rs index 12706856..d7e61c36 100644 --- a/src/ensemble/random_forest_regressor.rs +++ b/src/ensemble/random_forest_regressor.rs @@ -65,18 +65,25 @@ use crate::tree::decision_tree_regressor::{ /// Parameters of the Random Forest Regressor /// Some parameters here are passed directly into base estimator. pub struct RandomForestRegressorParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub max_depth: Option, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub min_samples_leaf: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub min_samples_split: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The number of trees in the forest. pub n_trees: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Number of random sample of predictors to use as split candidates. pub m: Option, + #[cfg_attr(feature = "serde", serde(default))] /// Whether to keep samples used for tree generation. This is required for OOB prediction. pub keep_samples: bool, + #[cfg_attr(feature = "serde", serde(default))] /// Seed used for bootstrap sampling and feature selection for each tree. pub seed: u64, } @@ -181,18 +188,25 @@ impl> Predictor for RandomForestReg #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct RandomForestRegressorSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub max_depth: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_leaf: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub min_samples_split: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The number of trees in the forest. pub n_trees: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Number of random sample of predictors to use as split candidates. pub m: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// Whether to keep samples used for tree generation. This is required for OOB prediction. pub keep_samples: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Seed used for bootstrap sampling and feature selection for each tree. pub seed: Vec, } diff --git a/src/linear/elastic_net.rs b/src/linear/elastic_net.rs index 0e9cb578..8ba32872 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -71,16 +71,21 @@ use crate::linear::lasso_optimizer::InteriorPointOptimizer; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct ElasticNetParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub alpha: T, + #[cfg_attr(feature = "serde", serde(default))] /// The elastic net mixing parameter, with 0 <= l1_ratio <= 1. /// For l1_ratio = 0 the penalty is an L2 penalty. /// For l1_ratio = 1 it is an L1 penalty. For 0 < l1_ratio < 1, the penalty is a combination of L1 and L2. pub l1_ratio: T, + #[cfg_attr(feature = "serde", serde(default))] /// If True, the regressors X will be normalized before regression by subtracting the mean and dividing by the standard deviation. pub normalize: bool, + #[cfg_attr(feature = "serde", serde(default))] /// The tolerance for the optimization pub tol: T, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum number of iterations pub max_iter: usize, } @@ -139,16 +144,21 @@ impl Default for ElasticNetParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct ElasticNetSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub alpha: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The elastic net mixing parameter, with 0 <= l1_ratio <= 1. /// For l1_ratio = 0 the penalty is an L2 penalty. /// For l1_ratio = 1 it is an L1 penalty. For 0 < l1_ratio < 1, the penalty is a combination of L1 and L2. pub l1_ratio: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// If True, the regressors X will be normalized before regression by subtracting the mean and dividing by the standard deviation. pub normalize: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The tolerance for the optimization pub tol: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum number of iterations pub max_iter: Vec, } diff --git a/src/linear/lasso.rs b/src/linear/lasso.rs index aae7e500..d1445a0f 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -38,13 +38,17 @@ use crate::math::num::RealNumber; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LassoParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Controls the strength of the penalty to the loss function. pub alpha: T, + #[cfg_attr(feature = "serde", serde(default))] /// If true the regressors X will be normalized before regression /// by subtracting the mean and dividing by the standard deviation. pub normalize: bool, + #[cfg_attr(feature = "serde", serde(default))] /// The tolerance for the optimization pub tol: T, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum number of iterations pub max_iter: usize, } @@ -116,13 +120,17 @@ impl> Predictor for Lasso { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LassoSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Controls the strength of the penalty to the loss function. pub alpha: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// If true the regressors X will be normalized before regression /// by subtracting the mean and dividing by the standard deviation. pub normalize: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The tolerance for the optimization pub tol: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum number of iterations pub max_iter: Vec, } diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index c95e6e12..52ba9435 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -84,6 +84,7 @@ pub enum LinearRegressionSolverName { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LinearRegressionParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. pub solver: LinearRegressionSolverName, } @@ -117,6 +118,7 @@ impl Default for LinearRegressionParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LinearRegressionSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. pub solver: Vec, } @@ -353,5 +355,9 @@ mod tests { serde_json::from_str(&serde_json::to_string(&lr).unwrap()).unwrap(); assert_eq!(lr, deserialized_lr); + + let default = LinearRegressionParameters::default(); + let parameters: LinearRegressionParameters = serde_json::from_str("{}").unwrap(); + assert_eq!(parameters.solver, default.solver); } } diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index 3a4c706c..4b6f095e 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -79,8 +79,10 @@ pub enum LogisticRegressionSolverName { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LogisticRegressionParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. pub solver: LogisticRegressionSolverName, + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub alpha: T, } @@ -89,8 +91,10 @@ pub struct LogisticRegressionParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct LogisticRegressionSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. pub solver: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub alpha: Vec, } diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index 4c3d4ff0..7beedf34 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -71,8 +71,10 @@ use crate::math::num::RealNumber; #[derive(Debug, Clone, Eq, PartialEq)] /// Approach to use for estimation of regression coefficients. Cholesky is more efficient but SVD is more stable. pub enum RidgeRegressionSolverName { + #[cfg_attr(feature = "serde", serde(default))] /// Cholesky decomposition, see [Cholesky](../../linalg/cholesky/index.html) Cholesky, + #[cfg_attr(feature = "serde", serde(default))] /// SVD decomposition, see [SVD](../../linalg/svd/index.html) SVD, } @@ -94,10 +96,13 @@ pub struct RidgeRegressionParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct RidgeRegressionSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. pub solver: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub alpha: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// If true the regressors X will be normalized before regression /// by subtracting the mean and dividing by the standard deviation. pub normalize: Vec, diff --git a/src/naive_bayes/bernoulli.rs b/src/naive_bayes/bernoulli.rs index 29c6c84d..d71197e3 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -114,10 +114,13 @@ impl> NBDistribution for BernoulliNBDistributi #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct BernoulliNBParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Option>, + #[cfg_attr(feature = "serde", serde(default))] /// Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors. pub binarize: Option, } @@ -154,10 +157,13 @@ impl Default for BernoulliNBParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct BernoulliNBSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Vec>>, + #[cfg_attr(feature = "serde", serde(default))] /// Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors. pub binarize: Vec>, } diff --git a/src/naive_bayes/categorical.rs b/src/naive_bayes/categorical.rs index 78556889..9cda7a8f 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -243,6 +243,7 @@ impl CategoricalNBDistribution { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct CategoricalNBParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, } @@ -265,6 +266,7 @@ impl Default for CategoricalNBParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct CategoricalNBSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: Vec, } diff --git a/src/naive_bayes/gaussian.rs b/src/naive_bayes/gaussian.rs index 24bbdd33..37aeb0fa 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -78,6 +78,7 @@ impl> NBDistribution for GaussianNBDistributio #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct GaussianNBParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Option>, } @@ -100,6 +101,7 @@ impl Default for GaussianNBParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct GaussianNBSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Vec>>, } diff --git a/src/naive_bayes/multinomial.rs b/src/naive_bayes/multinomial.rs index 6e846c1a..8119fa98 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -86,8 +86,10 @@ impl> NBDistribution for MultinomialNBDistribu #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct MultinomialNBParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Option>, } @@ -118,8 +120,10 @@ impl Default for MultinomialNBParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct MultinomialNBSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Vec>>, } diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 8723900e..6a90e4f0 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -49,16 +49,21 @@ use crate::neighbors::KNNWeightFunction; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct KNNClassifierParameters, T>> { + #[cfg_attr(feature = "serde", serde(default))] /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. /// See [`Distances`](../../math/distance/struct.Distances.html) for a list of available functions. pub distance: D, + #[cfg_attr(feature = "serde", serde(default))] /// backend search algorithm. See [`knn search algorithms`](../../algorithm/neighbour/index.html). `CoverTree` is default. pub algorithm: KNNAlgorithmName, + #[cfg_attr(feature = "serde", serde(default))] /// weighting function that is used to calculate estimated class value. Default function is `KNNWeightFunction::Uniform`. pub weight: KNNWeightFunction, + #[cfg_attr(feature = "serde", serde(default))] /// number of training samples to consider when estimating class for new point. Default value is 3. pub k: usize, + #[cfg_attr(feature = "serde", serde(default))] /// this parameter is not used t: PhantomData, } diff --git a/src/neighbors/knn_regressor.rs b/src/neighbors/knn_regressor.rs index 649cd1f3..a8664a80 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -52,16 +52,21 @@ use crate::neighbors::KNNWeightFunction; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct KNNRegressorParameters, T>> { + #[cfg_attr(feature = "serde", serde(default))] /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. /// See [`Distances`](../../math/distance/struct.Distances.html) for a list of available functions. distance: D, + #[cfg_attr(feature = "serde", serde(default))] /// backend search algorithm. See [`knn search algorithms`](../../algorithm/neighbour/index.html). `CoverTree` is default. pub algorithm: KNNAlgorithmName, + #[cfg_attr(feature = "serde", serde(default))] /// weighting function that is used to calculate estimated class value. Default function is `KNNWeightFunction::Uniform`. pub weight: KNNWeightFunction, + #[cfg_attr(feature = "serde", serde(default))] /// number of training samples to consider when estimating class for new point. Default value is 3. pub k: usize, + #[cfg_attr(feature = "serde", serde(default))] /// this parameter is not used t: PhantomData, } diff --git a/src/svm/svc.rs b/src/svm/svc.rs index d390866f..97b91de3 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -91,16 +91,22 @@ use crate::svm::{Kernel, Kernels, LinearKernel}; #[derive(Debug, Clone)] /// SVC Parameters pub struct SVCParameters, K: Kernel> { + #[cfg_attr(feature = "serde", serde(default))] /// Number of epochs. pub epoch: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub c: T, + #[cfg_attr(feature = "serde", serde(default))] /// Tolerance for stopping criterion. pub tol: T, + #[cfg_attr(feature = "serde", serde(default))] /// The kernel function. pub kernel: K, + #[cfg_attr(feature = "serde", serde(default))] /// Unused parameter. m: PhantomData, + #[cfg_attr(feature = "serde", serde(default))] /// Controls the pseudo random number generation for shuffling the data for probability estimates seed: Option, } @@ -109,16 +115,22 @@ pub struct SVCParameters, K: Kernel #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct SVCSearchParameters, K: Kernel> { + #[cfg_attr(feature = "serde", serde(default))] /// Number of epochs. pub epoch: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Regularization parameter. pub c: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Tolerance for stopping epoch. pub tol: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The kernel function. pub kernel: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Unused parameter. m: PhantomData, + #[cfg_attr(feature = "serde", serde(default))] /// Controls the pseudo random number generation for shuffling the data for probability estimates seed: Vec>, } diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index acc3fb0a..7d918af2 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -83,14 +83,19 @@ use crate::rand::get_rng_impl; #[derive(Debug, Clone)] /// Parameters of Decision Tree pub struct DecisionTreeClassifierParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Split criteria to use when building a tree. pub criterion: SplitCriterion, + #[cfg_attr(feature = "serde", serde(default))] /// The maximum depth of the tree. pub max_depth: Option, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. pub min_samples_leaf: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. pub min_samples_split: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Controls the randomness of the estimator pub seed: Option, } @@ -276,7 +281,11 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { .decision_tree_classifier_search_parameters .min_samples_split .len() - && self.current_seed == self.decision_tree_classifier_search_parameters.seed.len() + && self.current_seed + == self + .decision_tree_classifier_search_parameters + .seed + .len() { return None; } @@ -293,7 +302,9 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { min_samples_split: self .decision_tree_classifier_search_parameters .min_samples_split[self.current_min_samples_split], - seed: self.decision_tree_classifier_search_parameters.seed[self.current_seed], + seed: self + .decision_tree_classifier_search_parameters + .seed[self.current_seed], }; if self.current_criterion + 1 diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index 12bb9c94..33efcfe6 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -78,12 +78,16 @@ use crate::rand::get_rng_impl; #[derive(Debug, Clone)] /// Parameters of Regression Tree pub struct DecisionTreeRegressorParameters { + #[cfg_attr(feature = "serde", serde(default))] /// The maximum depth of the tree. pub max_depth: Option, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. pub min_samples_leaf: usize, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. pub min_samples_split: usize, + #[cfg_attr(feature = "serde", serde(default))] /// Controls the randomness of the estimator pub seed: Option, } @@ -142,12 +146,16 @@ impl Default for DecisionTreeRegressorParameters { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] pub struct DecisionTreeRegressorSearchParameters { + #[cfg_attr(feature = "serde", serde(default))] /// Tree max depth. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub max_depth: Vec>, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to be at a leaf node. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub min_samples_leaf: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// The minimum number of samples required to split an internal node. See [Decision Tree Regressor](../../tree/decision_tree_regressor/index.html) pub min_samples_split: Vec, + #[cfg_attr(feature = "serde", serde(default))] /// Controls the randomness of the estimator pub seed: Vec>, } @@ -195,7 +203,11 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { .decision_tree_regressor_search_parameters .min_samples_split .len() - && self.current_seed == self.decision_tree_regressor_search_parameters.seed.len() + && self.current_seed + == self + .decision_tree_regressor_search_parameters + .seed + .len() { return None; } @@ -209,7 +221,9 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { min_samples_split: self .decision_tree_regressor_search_parameters .min_samples_split[self.current_min_samples_split], - seed: self.decision_tree_regressor_search_parameters.seed[self.current_seed], + seed: self + .decision_tree_regressor_search_parameters + .seed[self.current_seed], }; if self.current_max_depth + 1 @@ -236,7 +250,11 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { self.current_max_depth = 0; self.current_min_samples_leaf = 0; self.current_min_samples_split += 1; - } else if self.current_seed + 1 < self.decision_tree_regressor_search_parameters.seed.len() + } else if self.current_seed + 1 + < self + .decision_tree_regressor_search_parameters + .seed + .len() { self.current_max_depth = 0; self.current_min_samples_leaf = 0; From f34d2dc8eb73cc89c284e33b165a187d36059c2f Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 21 Sep 2022 15:23:36 -0700 Subject: [PATCH 3/5] lints --- src/tree/decision_tree_classifier.rs | 10 ++-------- src/tree/decision_tree_regressor.rs | 16 +++------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index 7d918af2..d318a205 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -281,11 +281,7 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { .decision_tree_classifier_search_parameters .min_samples_split .len() - && self.current_seed - == self - .decision_tree_classifier_search_parameters - .seed - .len() + && self.current_seed == self.decision_tree_classifier_search_parameters.seed.len() { return None; } @@ -302,9 +298,7 @@ impl Iterator for DecisionTreeClassifierSearchParametersIterator { min_samples_split: self .decision_tree_classifier_search_parameters .min_samples_split[self.current_min_samples_split], - seed: self - .decision_tree_classifier_search_parameters - .seed[self.current_seed], + seed: self.decision_tree_classifier_search_parameters.seed[self.current_seed], }; if self.current_criterion + 1 diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index 33efcfe6..c745a0d1 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -203,11 +203,7 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { .decision_tree_regressor_search_parameters .min_samples_split .len() - && self.current_seed - == self - .decision_tree_regressor_search_parameters - .seed - .len() + && self.current_seed == self.decision_tree_regressor_search_parameters.seed.len() { return None; } @@ -221,9 +217,7 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { min_samples_split: self .decision_tree_regressor_search_parameters .min_samples_split[self.current_min_samples_split], - seed: self - .decision_tree_regressor_search_parameters - .seed[self.current_seed], + seed: self.decision_tree_regressor_search_parameters.seed[self.current_seed], }; if self.current_max_depth + 1 @@ -250,11 +244,7 @@ impl Iterator for DecisionTreeRegressorSearchParametersIterator { self.current_max_depth = 0; self.current_min_samples_leaf = 0; self.current_min_samples_split += 1; - } else if self.current_seed + 1 - < self - .decision_tree_regressor_search_parameters - .seed - .len() + } else if self.current_seed + 1 < self.decision_tree_regressor_search_parameters.seed.len() { self.current_max_depth = 0; self.current_min_samples_leaf = 0; From 1e85bee6790877e3c9b792e0ffe4a71b608b51de Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 21 Sep 2022 16:14:19 -0700 Subject: [PATCH 4/5] create defaults for enums --- src/algorithm/neighbour/mod.rs | 6 ++++++ src/cluster/dbscan.rs | 3 ++- src/cluster/kmeans.rs | 1 + src/decomposition/pca.rs | 1 + src/decomposition/svd.rs | 1 + src/linear/linear_regression.rs | 8 +++++++- src/linear/logistic_regression.rs | 8 +++++++- src/linear/ridge_regression.rs | 10 +++++++--- src/neighbors/knn_classifier.rs | 4 ++-- src/neighbors/knn_regressor.rs | 4 ++-- src/neighbors/mod.rs | 6 ++++++ src/tree/decision_tree_classifier.rs | 8 +++++++- 12 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/algorithm/neighbour/mod.rs b/src/algorithm/neighbour/mod.rs index 42ab7bc8..f59448af 100644 --- a/src/algorithm/neighbour/mod.rs +++ b/src/algorithm/neighbour/mod.rs @@ -59,6 +59,12 @@ pub enum KNNAlgorithmName { CoverTree, } +impl Default for KNNAlgorithmName { + fn default() -> Self { + KNNAlgorithmName::CoverTree + } +} + #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug)] pub(crate) enum KNNAlgorithm, T>> { diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index 3ea67fb3..ba8722e8 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -65,6 +65,7 @@ pub struct DBSCAN, T>> { eps: T, } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] /// DBSCAN clustering algorithm parameters pub struct DBSCANParameters, T>> { @@ -229,7 +230,7 @@ impl Default for DBSCANParameters { distance: Distances::euclidian(), min_samples: 5, eps: T::half(), - algorithm: KNNAlgorithmName::CoverTree, + algorithm: KNNAlgorithmName::default(), } } } diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index efeb87bc..6f45e6cd 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -102,6 +102,7 @@ impl PartialEq for KMeans { } } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] /// K-Means clustering algorithm parameters pub struct KMeansParameters { diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index a4a23e28..7961d415 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -83,6 +83,7 @@ impl> PartialEq for PCA { } } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] /// PCA parameters pub struct PCAParameters { diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index 86c29f1b..9a1e33d4 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -69,6 +69,7 @@ impl> PartialEq for SVD { } } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] /// SVD parameters pub struct SVDParameters { diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index 52ba9435..b816b481 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -80,6 +80,12 @@ pub enum LinearRegressionSolverName { SVD, } +impl Default for LinearRegressionSolverName { + fn default() -> Self { + LinearRegressionSolverName::SVD + } +} + /// Linear Regression parameters #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] @@ -109,7 +115,7 @@ impl LinearRegressionParameters { impl Default for LinearRegressionParameters { fn default() -> Self { LinearRegressionParameters { - solver: LinearRegressionSolverName::SVD, + solver: LinearRegressionSolverName::default(), } } } diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index 4b6f095e..e8fd01fc 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -75,6 +75,12 @@ pub enum LogisticRegressionSolverName { LBFGS, } +impl Default for LogisticRegressionSolverName { + fn default() -> Self { + LogisticRegressionSolverName::LBFGS + } +} + /// Logistic Regression parameters #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] @@ -208,7 +214,7 @@ impl LogisticRegressionParameters { impl Default for LogisticRegressionParameters { fn default() -> Self { LogisticRegressionParameters { - solver: LogisticRegressionSolverName::LBFGS, + solver: LogisticRegressionSolverName::default(), alpha: T::zero(), } } diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index 7beedf34..396953db 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -71,14 +71,18 @@ use crate::math::num::RealNumber; #[derive(Debug, Clone, Eq, PartialEq)] /// Approach to use for estimation of regression coefficients. Cholesky is more efficient but SVD is more stable. pub enum RidgeRegressionSolverName { - #[cfg_attr(feature = "serde", serde(default))] /// Cholesky decomposition, see [Cholesky](../../linalg/cholesky/index.html) Cholesky, - #[cfg_attr(feature = "serde", serde(default))] /// SVD decomposition, see [SVD](../../linalg/svd/index.html) SVD, } +impl Default for RidgeRegressionSolverName { + fn default() -> Self { + RidgeRegressionSolverName::Cholesky + } +} + /// Ridge Regression parameters #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)] @@ -209,7 +213,7 @@ impl RidgeRegressionParameters { impl Default for RidgeRegressionParameters { fn default() -> Self { RidgeRegressionParameters { - solver: RidgeRegressionSolverName::Cholesky, + solver: RidgeRegressionSolverName::default(), alpha: T::one(), normalize: true, } diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 6a90e4f0..5e34ce70 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -116,8 +116,8 @@ impl Default for KNNClassifierParameters { fn default() -> Self { KNNClassifierParameters { distance: Distances::euclidian(), - algorithm: KNNAlgorithmName::CoverTree, - weight: KNNWeightFunction::Uniform, + algorithm: KNNAlgorithmName::default(), + weight: KNNWeightFunction::default(), k: 3, t: PhantomData, } diff --git a/src/neighbors/knn_regressor.rs b/src/neighbors/knn_regressor.rs index a8664a80..8fdda3d0 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -118,8 +118,8 @@ impl Default for KNNRegressorParameters { fn default() -> Self { KNNRegressorParameters { distance: Distances::euclidian(), - algorithm: KNNAlgorithmName::CoverTree, - weight: KNNWeightFunction::Uniform, + algorithm: KNNAlgorithmName::default(), + weight: KNNWeightFunction::default(), k: 3, t: PhantomData, } diff --git a/src/neighbors/mod.rs b/src/neighbors/mod.rs index 86b1e46e..5a713abb 100644 --- a/src/neighbors/mod.rs +++ b/src/neighbors/mod.rs @@ -58,6 +58,12 @@ pub enum KNNWeightFunction { Distance, } +impl Default for KNNWeightFunction { + fn default() -> Self { + KNNWeightFunction::Uniform + } +} + impl KNNWeightFunction { fn calc_weights(&self, distances: Vec) -> std::vec::Vec { match *self { diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index d318a205..d330fdf3 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -123,6 +123,12 @@ pub enum SplitCriterion { ClassificationError, } +impl Default for SplitCriterion { + fn default() -> Self { + SplitCriterion::Gini + } +} + #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug)] struct Node { @@ -201,7 +207,7 @@ impl DecisionTreeClassifierParameters { impl Default for DecisionTreeClassifierParameters { fn default() -> Self { DecisionTreeClassifierParameters { - criterion: SplitCriterion::Gini, + criterion: SplitCriterion::default(), max_depth: None, min_samples_leaf: 1, min_samples_split: 2, From 369283f61f02c2498f94ae8cdeb4660f84edaad9 Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 21 Sep 2022 16:23:09 -0700 Subject: [PATCH 5/5] lint --- src/linear/linear_regression.rs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index b816b481..12769bb8 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -71,24 +71,19 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[derive(Debug, Clone, Eq, PartialEq)] +#[derive(Debug, Default, Clone, Eq, PartialEq)] /// Approach to use for estimation of regression coefficients. QR is more efficient but SVD is more stable. pub enum LinearRegressionSolverName { /// QR decomposition, see [QR](../../linalg/qr/index.html) QR, + #[default] /// SVD decomposition, see [SVD](../../linalg/svd/index.html) SVD, } -impl Default for LinearRegressionSolverName { - fn default() -> Self { - LinearRegressionSolverName::SVD - } -} - /// Linear Regression parameters #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[derive(Debug, Clone)] +#[derive(Debug, Default, Clone)] pub struct LinearRegressionParameters { #[cfg_attr(feature = "serde", serde(default))] /// Solver to use for estimation of regression coefficients. @@ -112,14 +107,6 @@ impl LinearRegressionParameters { } } -impl Default for LinearRegressionParameters { - fn default() -> Self { - LinearRegressionParameters { - solver: LinearRegressionSolverName::default(), - } - } -} - /// Linear Regression grid search parameters #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone)]