決策樹是一種非參數(shù)的有監(jiān)督學(xué)習(xí)方法,可以用于分類和回歸問題。在分類問題中,決策樹通過遞歸地分割訓(xùn)練數(shù)據(jù)集,構(gòu)建一棵決策樹。每個內(nèi)部節(jié)點代表一個特征測試條件,邊代表節(jié)點間的轉(zhuǎn)移,而葉子節(jié)點代表決策結(jié)果(類別)。
在C++中,我們可以使用各種庫來實現(xiàn)決策樹算法,如:SHARK、MLPACK、Dlib等。這里以Dlib為例,展示如何在C++中使用決策樹進行分類。
首先,確保已經(jīng)安裝了Dlib庫。然后,包含必要的頭文件并編寫代碼:
#include<iostream>
#include <dlib/ml.h>
#include <dlib/data_io.h>
using namespace std;
using namespace dlib;
// 加載數(shù)據(jù)集
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);
}
// 讀取標(biāo)簽
sin >> label;
samples.push_back(sample);
labels.push_back(label);
}
}
int main() {
// 加載數(shù)據(jù)集
std::vector<std::vector<double>> samples;
std::vector<string> labels;
load_data("your_dataset.txt", samples, labels);
// 將數(shù)據(jù)集劃分為訓(xùn)練集和測試集
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);
// 創(chuàng)建決策樹分類器
decision_tree<2> tree;
// 訓(xùn)練決策樹
tree.train(train_samples, train_labels);
// 對測試集進行預(yù)測
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;
}
在這個示例中,我們首先加載了一個數(shù)據(jù)集,并將其劃分為訓(xùn)練集和測試集。接著,我們創(chuàng)建了一個決策樹分類器,并使用訓(xùn)練集對其進行訓(xùn)練。然后,我們使用訓(xùn)練好的決策樹對測試集進行預(yù)測,并計算準確率。
注意:在運行此代碼之前,請確保已經(jīng)將數(shù)據(jù)集文件名替換為實際的文件路徑。數(shù)據(jù)集文件應(yīng)該包含特征值和對應(yīng)的類別標(biāo)簽,每個樣本占一行,特征值和標(biāo)簽之間用空格分隔。