+1
|-1
)Компания просит у исследователя описать те группы слушателей, которым курс не понравился, чтобы возможно как-то его улучшить.
В идеальном мире исследователь должен прийти с чем-то вроде
[Пол = Ж][Возраст > 21][Факультет = Экономика][Посещаемость < 50%]
- не нравится в 82% случаев[Пол = М][Возраст >= 20][Факультет = ВМК][Средний балл > 4.5]
- не нравится в 10% случаевФормально, дерево решений - это связный ациклический граф. В нем можно выделить 3 типа вершин:
Во внутренней или коневой вершине признак проверяется на некий логический критерий, по результатам которого мы движемся все глубже
{python}
1. function decision_tree(X, y):
2. if stopping_criterion(X, y) == True:
3. S = create_leaf_with_prediction(y)
4. else:
5. S = create_node()
6. (X_1, y_1) .. (X_L, y_L) = best_split(X, y)
7. for i in 1..L:
8. C = decision_tree(X_i, y_i)
9. connect_nodes(S, C)
10. return S
Пусть $p_k$ - это доля класса $C_k$ в узле дерева $S$.
plot_impurities()
Выберем признак $A$ и пороговое значение $t$ на нем таким образом, чтобы уменьшить неопределенность:
Насколько уменьшится неопределенность:
$$ Gain(S, A) = I(S) - \left(\frac{|S_L|}{|S|}\cdot I(S_L) + \frac{|S_R|}{|S|}\cdot I(S_R) \right),$$ где $S_R$ и $S_L$ - это потомки узла $S$ c объектами, удовлетворяющим соответствующим условиям.
def impurity(p):
# p - массив из долей каждого из классов
# Имплементируйте любую меру неопределенности
return 1 - (p**2).sum()
# return 1 - np.max(p)
# return -np.sum(p*np.log2(p))
wine_demo()
try:
fig = interact(demo_dec_tree, depth=IntSlider(min=1, max=5, value=1))
except:
print('Что-то не так. Посмотрите на доску')
Для задачи регрессии в качестве меры неопределенности могут выступать
try:
fig = interact(plot_dec_reg, depth=IntSlider(min=1, max=5, value=1), criterion=['mse', 'mae'])
except:
print('Что-то не так. Посмотрите на доску')
В деревьях решений производится автоматический отбор признаков.
Пусть $v(S)$ - это признак, который использовался для ветвления в узле $S$
$$ \text{imp}(A) = \sum\limits_{i: v(S_i) = A} \frac{|S_i|}{|S|} Gain(S_i, A) $$ID 3
С 4.5
СART
Преимущества
Недостатки
Дерево решений очень чувствительно к данным
demo_2dec_tree()
Возможно, если строить несколько немного разных деревьев, то в среднем
Надо строить ансамбль деревьев, каждое из которых будет обучаться на немножно разных данных!
M = 100
T = int(M/2 + 1)
p = 0.6
p_ens = sum([scipy.special.comb(M,k)*(p**k)*((1-p)**(M-k)) for k in range(T, M+1)])
p_ens
0.972900802242991
Bagging - это параллельный способ построения ансамбля.
Так же есть некоторые обобщения бэггинга:
В данном случае, на каждом сэмпле базовой моделью является дерево решений.
Если вам нужно за минимальное время построить достаточно точную и устойчивую модель - это ваш вариант.
try:
fig = interact(rf_demo, n_est=IntSlider(min=1, max=101, value=1, step=5))
except:
print('Что-то не так. Посмотрите на доску')