1.2 RSS Как указано в главе 8 учебника, нам нужен параметр для измерения эффективности конкретного разбиения / дерева.Мы выбираем здесь Остаточную сумму квадратов.Реализуйте расчет RSS для списка разделений, зная, что прогнозируемое значение (Wage (k)) содержится в элементе [-1] для элемента в разделении.Вы можете использовать ячейку кода ниже вашей реализации, чтобы проверить свой результат на конкретное разделение.
1.3 Разделение Мы будем кодировать функцию разделения, способную разделять данные на две части на основе индекса функции,Значение расщепления и данных.Реализуйте условие разделения, взяв в качестве соглашения оставленное
1.4 Оптимальное создание разделения Не существует теоретического результата, позволяющего найти наилучшее возможное разделение, прежде чем пройти через все возможные, поэтому мы реализуем минимизатор RSS для всего разделения.Используя ранее закодированные функции, заполните части #TODO.Вы можете проверить свое возвращение в следующей ячейке.
1.5 Построение дерева и прогнозирование Агрегирование всех частей кода теперь позволяет нам рекурсивно построить все дерево.Прокомментируйте данный код и, в особенности, важность параметра min_size для структуры модели. Использование той же парадигмы кодирования позволяет нам использовать нашу модель для регрессии на тестовом наборе, как вы можете видеть в следующей ячейке кода.Какая часть глобальной модели сейчас отсутствует?Объясните его важность в реальной проблеме машинного обучения.(Бонус) Реализация
Я хочу реализовать модель регрессии на основе дерева, используя rss.Я хочу заполнить следующие пробелы, но это слишком сложно
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import math
data = pd.read_csv("Wages.csv", sep=";")
training_set = np.array(data[:10])
test_set = np.array(data[10:])
-- RSS --
verbose = False
def RSS(splits):
"""
Return the RSS of the input splits. The input should be in the form
of a list of list
"""
residual = 0
for split in splits:
if(len(split) != 0):
mean = mean(split[:-1])
if(verbose):print("Mean :" + str(mean))
residual = ##TODO
return residual
split_1 = np.array([[[0,2],[0,8]],[[4,5]]])
RSS_value = RSS(split_1)
if (type(RSS_value) not in [int,float,np.float16,np.float32,np.float64]):
print("TypeError : check your output")
elif(RSS(split_1) == 18.0):
print("Your calculations are right, at least on this specific
example")
else:
print("Your calculations are wrong")
-- Split --
def split(index, value, data):
"""
Splits the input @data into two parts, based on the feature at @index
position, using @value as a boundary value
"""
left_split = #TODO condition
right_split = #TODO condition
return [left_split, right_split]
-- optimal split creation
def split_tester(data):
"""
Find the best possible split possible for the current @data.
Loops over all the possible features, and all values for the given
features to test every possible split
"""
optimal_split_ind, optimal_split_value, optimal_residual, optimal_splits = -1,-1,float("inf"),[] #Initialize such that the first split is better than initialization
for curr_ind in range(data.shape[1]-1):
for curr_val in data:
if(verbose):print("Curr_split : " + str((curr_ind, curr_val[curr_ind])))
split_res = #TODO (comments : get the current split)
if(verbose):print(split_res)
residual_value = #TODO (comments : get the RSS of the current split)
if(verbose):print("Residual : " + str(residual_value))
if residual_value < optimal_residual:
optimal_split_ind, optimal_split_value, optimal_residual, optimal_splits = curr_ind,\
curr_val[curr_ind], residual_value, split_res
return optimal_split_ind, optimal_split_value, optimal_splits
-- tree building --
def tree_building(data, min_size):
"""
Recursively builds a tree using the split tester built before.
"""
if(data.shape[0] > min_size):
ind, value, [left, right] = split_tester(data)
left, right = np.array(left), np.array(right)
return [tree_building(left, min_size), tree_building(right,
min_size),ind,value]
else:
return data
tree = tree_building(training_set,2)
def predict(tree, input_vector):
if(type(tree[-1]) != np.int64):
if(len(tree) == 1):
return(tree[0][-1])
else:
return(np.mean([element[-1] for element in tree]))
else:
left_tree, right_tree, split_ind, split_value = tree
if(input_vector[split_ind]<split_value):
return predict(left_tree, input_vector)
else:
return predict(right_tree, input_vector)
for employee in test_set:
print("Predicted : " + str(predict(tree,employee)) + ", Actual : " +
str(employee[-1]))
Я изучаю код, чтобы получить #TODO здесь.Я не знаю.Пожалуйста, помогите мне.