В предыдущей статье основноеМодель линейной регрессииМодели, которые относятся к глобальным (кромелокально взвешенная линейная регрессияВ модели линейной регрессии предполагается, что глобальные данные являются линейными, а окончательная модель получается путем подгонки всех точек выборки. Однако на самом деле многие проблемы являются нелинейными. При работе с такими сложными проблемами регрессии данных отношения между признаками не являются простыми линейными отношениями. В настоящее время невозможно использовать глобальную модель линейной регрессии для соответствия таким данным.
Алгоритм регрессии дерева CART относится к алгоритму локальной регрессии.Посредством разделения глобального набора данных на несколько наборов данных, которые легко моделировать, локальное регрессионное моделирование выполняется для каждого локального набора данных.
сложная проблема регрессии
Модель линейной регрессии
В базовом алгоритме линейной регрессии существует линейная корреляция между характеристиками выборок и метками выборок, но когда существует нелинейная связь между характеристиками выборок и метками выборок, как показано на рисунке :
Для задачи нелинейной регрессии, показанной на рисунке выше, результат использования решения простой линейной регрессии показан на рисунке:
локально взвешенная линейная регрессия
Чтобы соответствовать нелинейным данным, можно использовать локальную взвешенную линейную регрессию.Результат решения локальной взвешенной линейной регрессии показан на рисунке:
Локальная взвешенная линейная регрессия может лучше соответствовать нелинейным данным.По сравнению с алгоритмом простой линейной регрессии, алгоритм локальной линейной взвешенной регрессии представляет собой локальную линейную модель, а простая модель линейной регрессии является глобальной моделью.Модель может лучше соответствовать локальным данным. Хотя модель линейной регрессии с локальным взвешиванием может лучше соответствовать нелинейным данным, модель линейной регрессии с локальным взвешиванием относится к алгоритму непараметрического обучения.Каждый раз, когда данные прогнозируются, параметры модели необходимо повторно обучать с использованием данных.Когда большие, такие расчеты занимают очень много времени.
Алгоритм КОРЗИНЫ
Алгоритм регрессии на основе дерева также является типом алгоритма локальной регрессии, Путем разделения набора данных на несколько частей каждая часть данных моделируется отдельно. В отличие от локальной взвешенной линейной регрессии, алгоритм, основанный на древовидной регрессии, представляет собой алгоритм обучения, основанный на параметрах.После обучения модели с помощью обучающих данных, как только параметры определены, их не нужно изменять.
дерево регрессии классификацииАлгоритм (дерево классификации и регрессии, CART) представляет собой древовидную модель, которая используется чаще Алгоритм CART может решать проблемы классификации и проблемы регрессии. существуеталгоритм дерева решенийВ статье мы представили, как использовать алгоритм CART для решения проблем классификации, в этой статье мы сосредоточимся на том, как использовать алгоритм CART для решения проблем регрессии. Дерево в алгоритме CART использует метод рекурсивной сегментации пополам, то есть текущий набор выборок делится на два набора подвыборок, левое поддерево и правое поддерево, так что каждый сгенерированный нелистовой узел имеет две ветви. Следовательно, дерево решений, сгенерированное алгоритмом CART, является нетипичным бинарным деревом. Основные этапы использования алгоритма CART для решения проблемы регрессии: ① создание дерева регрессии CART; ② обрезка дерева регрессии CART.
Генерация дерева регрессии CART
Разделение дерева регрессии CART
В алгоритме дерева классификации CART индекс Джини используется в качестве индекса для разделения дерева, и выборки делятся по признакам в выборках до тех пор, пока все выборки во всех листовых узлах не будут одной категории. Однако в дереве регрессии CART метка выборки представляет собой набор ряда непрерывных значений, и индекс Джини больше нельзя использовать в качестве индикатора для разделения дерева. Однако мы заметили, что индекс Джини представляет собой степень путаницы данных.Для непрерывных данных, когда распределение данных относительно разбросано, сумма квадратов различий между каждыми данными и средним значением больше, а дисперсия больше; когда распределение данных относительно сконцентрировано, сумма квадратов различий между отдельными данными и средним значением меньше. Чем больше дисперсия, тем более изменчивы данные; чем меньше дисперсия, тем менее изменчивы данные. Следовательно, для непрерывных данных сумма квадратов разностей между выборками и средним значением может использоваться в качестве индикатора для деления дерева регрессии:
в– метка i-го образца,является средним значением m выборочных меток. Формула выражается в Python как:
import numpy as np
def err_cnt(dataSet):
'''回归树的划分指标
input: dataSet(list):训练数据
output: m*s^2(float):总方差
'''
data = np.mat(dataSet)
return np.var(data[:, -1]) * np.shape(data)[0]
Функция rr_cnt используется для вычисления общей дисперсии текущего узла. При стандарте деления, как должна быть разделена выборка? Подобно методу в дереве классификации CART, мы пытаемся разделить выборку на левое и правое поддеревья узла дерева в соответствии с каждым значением каждого признака измерения, например, получение медианного значения x признака j-го измерения в признаке выборки. как деление.Если значение выборки в j-м измерении больше или равно x, она делится на правое поддерево, в противном случае - на левое поддерево. Процедура деления выглядит следующим образом:
def split_tree(data, fea, value):
'''根据特征fea中的值value将数据集data划分成左右子树
input: data(list):训练样本
fea(float):需要划分的特征index
value(float):指定的划分的值
output: (set_1, set_2)(tuple):左右子树的聚合
'''
set_1 = [] # 右子树的集合
set_2 = [] # 左子树的集合
for x in data:
if x[fea] >= value:
set_1.append(x)
else:
set_2.append(x)
return (set_1, set_2)
Функция split_tree делит выборку на левое и правое поддеревья в соответствии со значением в позиции fea.Когда значение выборки в fea больше или равно значению, она делится на правое поддерево, в противном случае оно разделено на левое поддерево в дереве.
Построение дерева регрессии CART
Процесс построения дерева классификации CART выглядит следующим образом:
- Для текущего набора обучающих данных пройдите все атрибуты и все возможные точки сегментации, чтобы найти лучший атрибут сегментации и его оптимальную точку сегментации, чтобы индекс Джини после сегментации был наименьшим, и используйте лучший атрибут и его оптимальную точку сегментации. точка разделения делит набор обучающих данных на два подмножества, соответствующие левому поддереву и правому поддереву соответственно.
- Первый шаг вызывается рекурсивно для двух подмножеств данных, сгенерированных на первом шаге, до тех пор, пока не будет выполнено условие остановки.
- Сгенерировать дерево решений CART
Чтобы построить алгоритм дерева регрессии CART, прежде всего, необходимо настроить структуру для узлов в дереве регрессии CART Конкретная реализация выглядит следующим образом:
class node:
'''树的节点的类
'''
def __init__(self, fea=-1, value=None, results=None, right=None, left=None):
self.fea = fea # 用于切分数据集的属性的列索引值
self.value = value # 设置划分的值
self.results = results # 存储叶节点的值
self.right = right # 右子树
self.left = left # 左子树
В классе узлов дерева регрессии CART атрибут fea представляет собой индекс признака набора данных, подлежащего разделению, значение атрибута представляет конкретное значение деления, результаты атрибута представляют конкретное значение конечного узла, а атрибут right представляет собой правое поддерево, а атрибут left представляет левое поддерево. Теперь давайте вместе реализуем дерево регрессии CART:
def build_tree(data, min_sample, min_err):
'''构建树
input: data(list):训练样本
min_sample(int):叶子节点中最少的样本数
min_err(float):最小的error
output: node:树的根结点
'''
# 构建决策树,函数返回该决策树的根节点
if len(data) <= min_sample:
return node(results=leaf(data))
# 1、初始化
best_err = err_cnt(data)
bestCriteria = None # 存储最佳切分属性以及最佳切分点
bestSets = None # 存储切分后的两个数据集
# 2、开始构建CART回归树
feature_num = len(data[0]) - 1
for fea in range(0, feature_num):
feature_values = {}
for sample in data:
feature_values[sample[fea]] = 1
for value in feature_values.keys():
# 2.1、尝试划分
(set_1, set_2) = split_tree(data, fea, value)
if len(set_1) < 2 or len(set_2) < 2:
continue
# 2.2、计算划分后的error值
now_err = err_cnt(set_1) + err_cnt(set_2)
# 2.3、更新最优划分
if now_err < best_err and len(set_1) > 0 and len(set_2) > 0:
best_err = now_err
bestCriteria = (fea, value)
bestSets = (set_1, set_2)
# 3、判断划分是否结束
if best_err > min_err:
right = build_tree(bestSets[0], min_sample, min_err)
left = build_tree(bestSets[1], min_sample, min_err)
return node(fea=bestCriteria[0], value=bestCriteria[1], \
right=right, left=left)
else:
return node(results=leaf(data)) # 返回当前的类别标签作为最终的类别标签
Функция build_tree используется для построения модели дерева регрессии CART.В процессе построения модели дерева регрессии CART, если количество выборок в узле меньше или равно указанному минимальному количеству выборок min_sample, узел не будет больше не делится, а функция листа используется для вычисления значения текущего листового узла, когда узел необходимо разделить, сначала вычислить значение ошибки текущего узла.В процессе начала построения попробуйте разделить выборка в левое и правое поддеревья в соответствии со значением каждой функции измерения. После деления генерируются левое поддерево и правое поддерево.В это время вычисляется значение ошибки левого и правого поддеревьев.Если значение ошибки в это время меньше оптимального значения ошибки, оптимальное деление обновляется , Когда разделение узла завершено, перейдите к разделу Его левое и правое поддеревья:
def leaf(dataSet):
'''计算叶节点的值
input: dataSet(list):训练样本
output: np.mean(data[:, -1])(float):均值
'''
data = np.mat(dataSet)
return np.mean(data[:, -1])
Функциональный лист используется для вычисления значения текущего конечного узла с использованием среднего значения меток всех выборок, разделенных на листовой узел.
Обрезка дерева регрессии CART
В регрессии дерева CART, когда узлы в дереве непрерывно делятся на выборки, наиболее экстремальной будет ситуация: каждый листовой узел содержит только одну выборку, в это время значение конечного узла является меткой выборочного значения . В этом случае легко «переобучить» обучающие выборки.Обученные таким образом выборки могут хорошо соответствовать обучающим выборкам, но эффект предсказания для новых выборок будет плохим. Чтобы предотвратить переоснащение построенной модели регрессии дерева CART, обычно необходимо сократить дерево регрессии CART.Цель сокращения состоит в том, чтобы предотвратить создание дерева регрессии CART слишком большого количества конечных узлов. В обрезке она в основном делится на: переднюю обрезку и заднюю обрезку.
передняя обрезка
Предварительная обрезка относится к контролю глубины дерева в процессе создания дерева регрессии CART, чтобы предотвратить создание слишком большого количества листовых узлов. В функции build_tree мы используем параметры min_sample и min_err, чтобы контролировать, нужно ли больше делить узлы в дереве. Путем непрерывной настройки этих двух параметров можно найти подходящую модель дерева CART.
после обрезки
Постобрезка относится к разделению обучающих выборок на две части, одна часть используется для обучения модели дерева CART, эта часть данных называется обучающими данными, а другая часть используется для обрезки сгенерированной модели дерева CART, эта часть данных называется проверкой данных. Из вышеприведенного процесса видно, что в процессе постобрезки необходимо проверить, соответствует ли сгенерированная модель дерева CART набору проверочных данных.
Ссылка на ссылку:GitHub.com/Apache Talent/ИИ…
Дерево регрессии CART для прогнозирования данных
С приведенными выше теоретическими приготовлениями мы используем реализованные выше функции для построения регрессионной модели дерева CART. Процесс использования алгоритма дерева регрессии CART для решения проблемы в основном включает: ① использование обучающих данных для обучения модели дерева регрессии CART; ② использование обученной модели дерева регрессии CART для прогнозирования новых данных.
Когда дерево регрессии CART обучено и необходимо оценить обученную модель дерева регрессии CART, функция cal_error используется для оценки обученной модели дерева регрессии CART:
def cal_error(data, tree):
''' 评估CART回归树模型
input: data(list):
tree:训练好的CART回归树模型
output: err/m(float):均方误差
'''
m = len(data) # 样本的个数
n = len(data[0]) - 1 # 样本中特征的个数
err = 0.0
for i in xrange(m):
tmp = []
for j in xrange(n):
tmp.append(data[i][j])
pre = predict(tmp, tree) # 对样本计算其预测值
# 计算残差
err += (data[i][-1] - pre) * (data[i][-1] - pre)
return err / m
Функция cal_error используется для оценки обученной модели дерева регрессии CART.Вводом функции являются данные обучающих данных и обученное дерево модели дерева регрессии CART.В процессе оценки модели дерева регрессии CART обученная модель дерева регрессии CART используется для предсказания каждой выборки, и конкретная реализация функции предсказания выглядит следующим образом. Когда прогноз завершен, остаток вычисляется с использованием прогнозируемого значения и метки исходной выборки.
def predict(sample, tree):
'''对每一个样本sample进行预测
input: sample(list):样本
tree:训练好的CART回归树模型
output: results(float):预测值
'''
# 1、只是树根
if tree.results != None:
return tree.results
else:
# 2、有左右子树
val_sample = sample[tree.fea] # fea处的值
branch = None
# 2.1、选择右子树
if val_sample >= tree.value:
branch = tree.right
# 2.2、选择左子树
else:
branch = tree.left
return predict(sample, branch)
Предсказание функции использует обученное дерево модели дерева регрессии CART для предсказания образца выборки. В процессе прогнозирования его в основном делят на следующие ситуации:
- Если в это время есть только корневой узел, его значение напрямую возвращается как окончательный результат прогнозирования.
- Если в это время узел имеет левое и правое поддеревья, сравните значение val_sample в индексе fea в образце выборки со значением значения в разделе в модели дерева регрессии CART.
- Если val_sample больше или равно значению значения в модели дерева регрессии CART, выберите правильное поддерево.
- Если val_sample меньше значения значения в модели дерева регрессии CART, выберите левое поддерево.
Окончательный эффект подгонки данных показан на рисунке:
Настройте значения min_sample и min_err, как показано на рисунке:
Внедрение деревьев решений с помощью Scikit-Learn в Python
классификация дерева решений
from sklearn import tree
from sklearn.datasets import load_iris
import graphviz
iris = load_iris()
clf = tree.DecisionTreeClassifier(criterion="gini",splitter="best")
clf.fit(iris.data, iris.target)
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.view('iris','data')
регрессия дерева решений
# -*- coding:utf-8 -*-
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.25, random_state=33)
ss_X = StandardScaler()
ss_y = StandardScaler()
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
# fit_transform与transform都要求操作2D数据,而此时的y_train与y_test都是1D的,因此需要调用reshape(-1,1),例如:[1,2,3]变成[[1],[2],[3]]
y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1, 1))
dtr = DecisionTreeRegressor()
dtr.fit(X_train, y_train)
dtr_y_predict = dtr.predict(X_test)
# 使用R-squared、MSE、MAE指标评估
print('R-squared:', dtr.score(X_test, y_test))
print('MSE:', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(dtr_y_predict)))
print('MAE:', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(dtr_y_predict)))
Ссылка: «Алгоритм машинного обучения Python — Чжао Чжиюн»