Я хочу реализовать модель регрессии на основе дерева, используя rss - PullRequest
1 голос
/ 28 мая 2019

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 здесь.Я не знаю.Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 28 мая 2019

Если я правильно понимаю, вы запрашиваете только расчет, помеченный #TODO в коде, который вы разместили. Если вы вычисляете ошибки, предсказанные вашей моделью, эти значения ошибок иногда называют «остаточными ошибками». Вы не можете просто суммировать их, некоторые отрицательные, а некоторые положительные, чтобы они могли взаимно отменять друг друга. Однако, если все ошибки возведены в квадрат, тогда все возведенные в квадрат ошибки являются положительными значениями и могут суммироваться. Отсюда и термин «Остаточная сумма квадратов» (RSS). Вы можете использовать что-то вроде «RSS = numpy.sum (numpy.square (errors))» для вычисления этого значения.

...