Complete predict and score of kdb

Change new/delete to make_unique
This commit is contained in:
2023-07-15 01:05:36 +02:00
parent 6a8aad5911
commit db6908acd0
16 changed files with 176 additions and 98 deletions

View File

@@ -4,17 +4,22 @@ namespace bayesnet {
using namespace std;
using namespace torch;
Ensemble::Ensemble(BaseClassifier& model) : model(model), models(vector<BaseClassifier>()), m(0), n(0), metrics(Metrics()) {}
Ensemble::Ensemble() : m(0), n(0), n_models(0), metrics(Metrics()) {}
Ensemble& Ensemble::build(vector<string>& features, string className, map<string, vector<int>>& states)
{
dataset = torch::cat({ X, y.view({y.size(0), 1}) }, 1);
this->features = features;
this->className = className;
this->states = states;
auto n_classes = states[className].size();
metrics = Metrics(dataset, features, className, n_classes);
// Build models
train();
// Train models
n_models = models.size();
for (auto i = 0; i < n_models; ++i) {
models[i].fit(X, y, features, className, states);
}
return *this;
}
Ensemble& Ensemble::fit(Tensor& X, Tensor& y, vector<string>& features, string className, map<string, vector<int>>& states)
@@ -37,16 +42,21 @@ namespace bayesnet {
}
Tensor Ensemble::predict(Tensor& X)
{
auto m_ = X.size(0);
auto n_ = X.size(1);
vector<vector<int>> Xd(n_, vector<int>(m_, 0));
for (auto i = 0; i < n_; i++) {
auto temp = X.index({ "...", i });
Xd[i] = vector<int>(temp.data_ptr<int>(), temp.data_ptr<int>() + m_);
Tensor y_pred = torch::zeros({ X.size(0), n_models }, torch::kInt64);
for (auto i = 0; i < n_models; ++i) {
y_pred.index_put_({ "...", i }, models[i].predict(X));
}
auto yp = model.predict(Xd);
auto ypred = torch::tensor(yp, torch::kInt64);
return ypred;
auto y_pred_ = y_pred.accessor<int64_t, 2>();
vector<int> y_pred_final;
for (int i = 0; i < y_pred.size(0); ++i) {
vector<float> votes(states[className].size(), 0);
for (int j = 0; j < y_pred.size(1); ++j) {
votes[y_pred_[i][j]] += 1;
}
auto indices = argsort(votes);
y_pred_final.push_back(indices[0]);
}
return torch::tensor(y_pred_final, torch::kInt64);
}
float Ensemble::score(Tensor& X, Tensor& y)
{
@@ -55,7 +65,11 @@ namespace bayesnet {
}
vector<string> Ensemble::show()
{
return model.show();
vector<string> result;
for (auto i = 0; i < n_models; ++i) {
auto res = models[i].show();
result.insert(result.end(), res.begin(), res.end());
}
return result;
}
}