Ошибка типа: предикат () принимает 2 позиционных аргумента, но 3 были заданы - PullRequest
0 голосов
/ 28 ноября 2018

Я искал эту ошибку в stackoverflow и нашел несколько сообщений, но никто не обращался к этой конкретной ситуации.

У меня есть следующий фрейм данных:

df

входные переменные и выходные переменные определены в этом коде:

xcol=["h","o","p","d","ddlt","devdlt","sl","lt"]
ycol=["Q","r"]
x=df[xcol].values
y=df[ycol].values

Моя цель - угадать выходные значения Q & r на основе входных данных (x).Я пробовал два способа, и оба терпят неудачу.С первым я попробовал регрессор с несколькими выходами.

Сначала я разделил данные в тестовых и обучающих данных:

import numpy as np
from sklearn.model_selection import train_test_split
X_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() takes 2 positional arguments but 3 were given

Что я делаю неправильно и как я могу это исправить?

Следующая вещь, которую я попробовал, была нейронная сеть.После назначения столбцов x и y я сделал нейронную сеть:

# neural network class definition
class neuralNetwork:

#Step 1: 
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
    #set number of nodes in each input, hidden, output layer
    self.inodes = inputnodes
    self.hnodes = hiddennodes
    self.onodes = outputnodes

    #link weight matrices, wih and who (weights in hidden en output layers), 
    # we are going to create matrices for the multiplication of it to get an 
    # output
    # weights inside the arrays (matrices) are w_i_j, where link is from node 
    # i to node j in the next layer
    #w11 w21
    #w12 w22 etc
    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))

    # setting the learning rate
    self.lr = learningrate

    # activation function is the sigmoid function
    self.activation_function = lambda x: scipy.special.expit(x)

    pass

    #Step 2:
def train(self, inputs_list, targets_list):
    #convert input lists to 2d array (matrice)
    inputs = numpy.array(inputs_list, ndmin=2).T
    targets = numpy.array(targets_list, ndmin=2).T

    #calculate signals into hidden layer
    hidden_inputs = numpy.dot(self.wih, inputs)
    #calculate signals emerging from hidden layer
    hidden_outputs = self.activation_function(hidden_inputs)

    #calculate signals into final output layer
    final_inputs = numpy.dot(self.who, hidden_outputs)
    #calculate signals emerging from final output layer
    final_outputs = self.activation_function(final_inputs)
    # output layer error is the (target-actual)
    output_errors = targets -final_outputs
    #hidden layer error is the output_errors, split by weights, recombined 
    at hidden nodes
    hidden_errors = numpy.dot(self.who.T, output_errors)

    #update the weights for the links between the hidden and output layers
    self.who += self.lr * numpy.dot((output_errors*final_outputs * (1.0- 
    final_outputs)),numpy.transpose(hidden_outputs))

    # update the weights for the links between the input and hidden layers
    self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0- 
    hidden_outputs)),numpy.transpose(inputs))

    pass

    #Step 3
def query(self, inputs_list):
    #convert input lists to 2d array (matrice)
    inputs = numpy.array(inputs_list, ndmin=2).T

    #calculate signals into hidden layer
    hidden_inputs = numpy.dot(self.wih, inputs)
    #calculate signals emerging from hidden layer
    hidden_outputs = self.activation_function(hidden_inputs)

    #calculate signals into final output layer
    final_inputs = numpy.dot(self.who, hidden_outputs)
    #calculate signals emerging from final output layer
    final_outputs = self.activation_function(final_inputs)

    return final_outputs

Затем я создал экземпляр нейронной сети:

   #Creating instance of neural network 

   #number of input, hidden and output nodes
   input_nodes = 8
   hidden_nodes = 100
   output_nodes = 2

   #learning rate is 0.8
   learning_rate = 0.8

   #create instance of neural network
   n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

Я получил 8 входов и 2 выхода, которыенужно прогнозировать.

Затем я обучил нейронную сеть:

# train the neural network
# go through all records in the training data set 
for record in df:
    #scale and shift te inputs
    inputs = x
    #create the target output values 
    targets = y
    n.train(inputs, targets)
    pass

, а затем я хочу запросить предполагаемые результаты, и теперь он идет не так:

, поэтому яхочу сделать 2 дополнительных столбца в кадре данных с предположениями Q (Q *) & r (r *):

df["Q*","r*"] = n.query(x)

Я действительно не знаю, как это сделать правильно.Этот код дает мне ошибку:

ValueError: Length of values does not match length of index

Любая помощь приветствуется.

Стивен

1 Ответ

0 голосов
/ 28 ноября 2018

Относительно первой части (MultiOutputRegressor) вашего вопроса, есть несколько проблем с вашим кодом ...

Для начала, аргумент estimator MultiOutputRegressor не должен быть числом, но, как говорят документы :

оценка: объект оценки

объект оценки, реализующий соответствиеи прогнозировать.

Итак, для пример , чтобы использовать случайный лес с параметрами по умолчанию, вы должны использовать

reg = MultiOutputRegressor(RandomForestRegressor()) 

(см. thisответьте , чтобы узнать больше примеров)

Во-вторых, в вашем коде вы никогда не соответствовали вашему регрессору;Вы должны добавить

reg.fit(X_train, y_train)

после определения.

В-третьих, predict не принимает значения истинной основы (y_train здесь) в качестве аргументов, только функции (* 1038)*);из документов снова:

прогноз (X)

Прогнозирование мульти-выходной переменной с использованием модели, обученной для каждой целевой переменной.

Параметры: X: (разреженный) в виде массива, форма (n_samples, n_features)

Данные.

Возвращает: y: (разреженный) в виде массива, форма (n_samples, n_outputs)

Множество выходных целей, предсказанных для нескольких предикторов.Примечание. Для каждого предиктора создаются отдельные модели.

Поскольку вы также передаете y_train в своем коде, вы получаете ожидаемую ошибку в одном аргументе слишком много;просто измените его на reg.predict(X_train), и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...