Python 我想使用rss实现一个基于树的回归模型

Python 我想使用rss实现一个基于树的回归模型,python,tree,regression,decision-tree,Python,Tree,Regression,Decision Tree,1.2 RSS 如教材第8章所述,我们需要一个参数来衡量特定拆分/树的效率。我们在这里选择剩余平方和。为拆分列表执行RSS计算,知道要预测的值(工资(k))包含在拆分中元素的元素[-1]中。 您可以使用实现下面的代码单元来检查特定拆分的结果 1.3拆分 我们将编写一个拆分函数,能够根据特征索引、拆分值和数据将数据拆分为两部分。执行拆分条件,以约定为准 1.4最佳分割创建 在进行所有可能的分割之前,没有理论结果允许找到最佳的分割,因此我们在整个分割上实现了RSS最小化。使用之前编码的函数,填充#待

1.2 RSS 如教材第8章所述,我们需要一个参数来衡量特定拆分/树的效率。我们在这里选择剩余平方和。为拆分列表执行RSS计算,知道要预测的值(工资(k))包含在拆分中元素的元素[-1]中。 您可以使用实现下面的代码单元来检查特定拆分的结果

1.3拆分 我们将编写一个拆分函数,能够根据特征索引、拆分值和数据将数据拆分为两部分。执行拆分条件,以约定为准 1.4最佳分割创建 在进行所有可能的分割之前,没有理论结果允许找到最佳的分割,因此我们在整个分割上实现了RSS最小化。使用之前编码的函数,填充#待办事项部分。您可以在下面的单元格中查看报税表

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]))
将numpy导入为np
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
输入数学
data=pd.read_csv(“工资.csv”,sep=“;”)
训练集=np.数组(数据[:10])
test_set=np.array(数据[10:])
--RSS--
冗长=错误
def RSS(拆分):
"""
返回输入拆分的RSS。输入应为
一系列
"""
残差=0
对于拆分中的拆分:
如果(长度(分割)!=0):
平均值=平均值(分割[:-1])
如果(详细):打印(“平均值:+str(平均值))
剩余=##待办事项
剩余收益
split_1=np.数组([[0,2],[0,8],[[4,5]])
RSS_值=RSS(拆分_1)
如果(类型(RSS_值)不在[int,float,np.float16,np.float32,np.float64]中):
打印(“TypeError:检查输出”)
elif(RSS(split_1)==18.0):
打印(“您的计算是正确的,至少在这个特定的
示例“)
其他:
打印(“您的计算错误”)
--分裂--
def拆分(索引、值、数据):
"""
根据@index处的功能,将输入的@data拆分为两部分
位置,使用@value作为边界值
"""
左分割=#TODO条件
右分割=#TODO条件
返回[左分割,右分割]
--最优分割创建
def split_测试仪(数据):
"""
为当前@数据查找可能的最佳拆分。
循环所有可能的特征和给定特征的所有值
用于测试每个可能拆分的功能
"""
最优分割索引,最优分割值,最优剩余,最优分割=-1,-1,浮点(“inf”),[]进行初始化,使第一次分割优于初始化
对于范围内的电流指示(数据形状[1]-1):
对于数据中的当前值:
如果(详细):打印(“当前拆分:+str((当前索引,当前值[当前索引]))
split_res=#TODO(注释:获取当前拆分)
如果(详细):打印(拆分)
剩余_值=#TODO(注释:获取当前拆分的RSS)
如果(详细):打印(“剩余:+str(剩余值))
如果残差_值<最佳_残差:
最优分割指数,最优分割指数,最优残差,最优分割指数=当前指数\
当前值[当前值]、残值、拆分值
返回最优分割索引、最优分割值、最优分割
--建树--
def树建筑(数据,最小尺寸):
"""
使用以前构建的SplitTester递归地构建树。
"""
如果(数据形状[0]>最小尺寸):
ind,value,[左,右]=拆分测试器(数据)
左,右=np.数组(左),np.数组(右)
返回[tree_building(左,最小尺寸),tree_building(右,
最小值(单位大小),单位,数值]
其他:
返回数据
树=树建筑(训练集,2)
def预测(树,输入向量):
如果(类型(树[-1])!=np.int64):
如果(len(tree)==1):
返回(树[0][1])
其他:
返回(np.平均值([元素[-1]表示树中的元素])
其他:
左树,右树,拆分索引,拆分值=树

如果(input_vector[split_ind]如果我理解正确,您只需要在发布的代码中输入标记为#TODO的计算。如果您计算模型预测的错误,这些错误值有时称为“剩余错误”。不能简单地求和,有些是负数,有些是正数,因此它们可能会相互抵消。但是,如果误差都是平方的,则平方误差都是正值,可以求和。这就是术语“剩余平方和”(RSS)的来源。您可以使用类似“RSS=numpy.sum(numpy.square(errors))”计算此值。

如果我理解正确,您只需要在发布的代码中输入标有#TODO的计算值。如果您计算模型预测的错误,这些错误值有时称为“剩余错误”。不能简单地求和,有些是负数,有些是正数,因此它们可能会相互抵消。但是,如果误差都是平方的,则平方误差都是正值,可以求和。这就是术语“剩余平方和”(RSS)的来源。您可以使用类似“RSS=numpy.sum(numpy.square(errors))”计算此值。

“我如何提问和回答家庭作业问题?”“我如何提问和回答家庭作业问题?”