我在StackOverflow上搜索了这个错误,发现了几个帖子,但没有一个解决这种特定情况的。
我有以下数据框:
输入变量和输出变量在这个代码中定义:
xcol=["h","o","p","d","ddlt","devdlt","sl","lt"]ycol=["Q","r"]x=df[xcol].valuesy=df[ycol].values
我的目标是根据输入(x)来预测输出值Q和r。我尝试了两种方法,但都失败了。第一种方法,我尝试使用多输出回归器。
我首先将数据分成测试和训练数据:
import numpy as npfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)y_train = y_train.ravel()y_test = y_test.ravel()
然后导入函数:
from sklearn.multioutput import MultiOutputRegressor
然后尝试预测Q和r:
reg= MultiOutputRegressor(estimator=100, n_jobs=None)reg=reg.predict(X_train, y_train)
这给我带来了错误:
TypeError: predict() 需要2个位置参数,但提供了3个
我做错了什么?我该如何修复它?
接下来我尝试了神经网络。在分配了列x和y后,我创建了神经网络:
# 神经网络类定义class neuralNetwork:#Step 1: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): #设置每个输入、隐藏、输出层的节点数 self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes #链接权重矩阵,wih和who(隐藏和输出层的权重), # 我们将创建矩阵来进行乘法以获得 # 输出 # 数组(矩阵)内的权重是w_i_j,其中链接是从节点 # i到下一层的节点j #w11 w21 #w12 w22 等 self.wih = numpy.random.normal(0.0,pow(self.inodes,-0.5),( self.hnodes, self.inodes)) self.who = numpy.random.normal(0.0,pow(self.hnodes,-0.5),( self.onodes, self.hnodes)) # 设置学习率 self.lr = learningrate # 激活函数是sigmoid函数 self.activation_function = lambda x: scipy.special.expit(x) pass #Step 2:def train(self, inputs_list, targets_list): #将输入列表转换为2d数组(矩阵) inputs = numpy.array(inputs_list, ndmin=2).T targets = numpy.array(targets_list, ndmin=2).T #计算进入隐藏层的信号 hidden_inputs = numpy.dot(self.wih, inputs) #计算从隐藏层输出的信号 hidden_outputs = self.activation_function(hidden_inputs) #计算进入最终输出层的信号 final_inputs = numpy.dot(self.who, hidden_outputs) #计算从最终输出层输出的信号 final_outputs = self.activation_function(final_inputs) # 输出层错误是(目标-实际) output_errors = targets -final_outputs #隐藏层错误是输出错误,通过权重分开,在隐藏节点处重新组合 hidden_errors = numpy.dot(self.who.T, output_errors) #更新隐藏层和输出层之间的链接权重 self.who += self.lr * numpy.dot((output_errors*final_outputs * (1.0- final_outputs)),numpy.transpose(hidden_outputs)) # 更新输入层和隐藏层之间的链接权重 self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0- hidden_outputs)),numpy.transpose(inputs)) pass #Step 3def query(self, inputs_list): #将输入列表转换为2d数组(矩阵) inputs = numpy.array(inputs_list, ndmin=2).T #计算进入隐藏层的信号 hidden_inputs = numpy.dot(self.wih, inputs) #计算从隐藏层输出的信号 hidden_outputs = self.activation_function(hidden_inputs) #计算进入最终输出层的信号 final_inputs = numpy.dot(self.who, hidden_outputs) #计算从最终输出层输出的信号 final_outputs = self.activation_function(final_inputs) return final_outputs
然后我创建了一个神经网络的实例:
#创建神经网络的实例 #输入、隐藏和输出节点的数量 input_nodes = 8 hidden_nodes = 100 output_nodes = 2 #学习率为0.8 learning_rate = 0.8 #创建神经网络的实例 n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
我有8个输入和2个需要预测的输出。
然后我训练了神经网络:
# 训练神经网络# 遍历训练数据集中的所有记录 for record in df: #缩放和平移输入 inputs = x #创建目标输出值 targets = y n.train(inputs, targets) pass
然后我想查询预测的输出,现在出错了:
所以我想在数据框中添加两列,包含对Q(Q*)和r(r*)的预测值:
df["Q*","r*"] = n.query(x)
我真的不知道如何正确地做到这一点。上述代码给我带来了错误:
ValueError: 值的长度与索引的长度不匹配
任何帮助都将不胜感激。
Steven
回答:
关于你问题的前半部分(MultiOutputRegressor
),你的代码有几个问题…