決策樹是一種非參數的有監督學習方法,可以用于分類和回歸問題。在分類問題中,決策樹通過遞歸地分割訓練數據集,構建一棵決策樹。每個內部節點代表一個特征測試條件,邊代表節點間的轉移,而葉子節點代表決策結果(類別)。
在C++中,我們可以使用各種庫來實現決策樹算法,如:SHARK、MLPACK、Dlib等。這里以Dlib為例,展示如何在C++中使用決策樹進行分類。
首先,確保已經安裝了Dlib庫。然后,包含必要的頭文件并編寫代碼:
#include<iostream>
#include <dlib/ml.h>
#include <dlib/data_io.h>
using namespace std;
using namespace dlib;
// 加載數據集
void load_data(const string& filename,
std::vector<std::vector<double>>& samples,
std::vector<string>& labels) {
std::ifstream fin(filename);
samples.clear();
labels.clear();
string line;
while (getline(fin, line)) {
std::istringstream sin(line);
std::vector<double> sample;
string label;
// 讀取特征值
double value;
while (sin >> value) {
sample.push_back(value);
}
// 讀取標簽
sin >> label;
samples.push_back(sample);
labels.push_back(label);
}
}
int main() {
// 加載數據集
std::vector<std::vector<double>> samples;
std::vector<string> labels;
load_data("your_dataset.txt", samples, labels);
// 將數據集劃分為訓練集和測試集
std::vector<std::vector<double>> train_samples, test_samples;
std::vector<string> train_labels, test_labels;
partition_data(samples, labels, 0.8, train_samples, test_samples, train_labels, test_labels);
// 創建決策樹分類器
decision_tree<2> tree;
// 訓練決策樹
tree.train(train_samples, train_labels);
// 對測試集進行預測
std::vector<string> predicted_labels = tree(test_samples);
// 計算準確率
int num_correct = 0;
for (size_t i = 0; i< predicted_labels.size(); ++i) {
if (predicted_labels[i] == test_labels[i]) {
++num_correct;
}
}
double accuracy = static_cast<double>(num_correct) / test_labels.size();
cout << "Accuracy: "<< accuracy<< endl;
return 0;
}
在這個示例中,我們首先加載了一個數據集,并將其劃分為訓練集和測試集。接著,我們創建了一個決策樹分類器,并使用訓練集對其進行訓練。然后,我們使用訓練好的決策樹對測試集進行預測,并計算準確率。
注意:在運行此代碼之前,請確保已經將數據集文件名替換為實際的文件路徑。數據集文件應該包含特征值和對應的類別標簽,每個樣本占一行,特征值和標簽之間用空格分隔。