Home > Mobile >  TypeError: 'numpy.float64' object is not iterable. While trying to make dataframe with res
TypeError: 'numpy.float64' object is not iterable. While trying to make dataframe with res

Time:01-09

I'm using Linear Regression to predict and evaluate predictions, and following that input all this info into dataframe but I got an error. Functions that I use:

def cross_val(model):
    pred = cross_val_score(model, X, y, cv=10)
    return pred.mean()

def print_evaluate(true, predicted):
    mae = metrics.mean_absolute_error(true, predicted)
    mse = metrics.mean_squared_error(true, predicted)
    rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
    r2_square = metrics.r2_score(true, predicted)
    print('MAE: ', mae)
    print('MSE: ', mse)
    print('RMSE: ', rmse)
    print('R2 SQUARE: ', r2_square)
    
def evaluate(true, predicted):
    mae = metrics.mean_absolute_error(true, predicted)
    mse = metrics.mean_squared_error(true, predicted)
    rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
    r2_square = metrics.r2_score(true, predicted)
    return mae
    return mse
    return rmse
    return r2_squre

Fitting and getting measurements:

lin_reg.fit(X_train, y_train)
y_pred = lin_reg.predict(X_test)

print('-' * 30)
print('Accuracy of Predictions \n')
print_evaluate(y_test, y_pred)

Making dataframe and getting an error:

results_df = pd.DataFrame(data=[["Linear Regression", *evaluate(y_test, test_pred) , cross_val(LinearRegression())]], 
                          columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])

Error itself:

----> 1 results_df = pd.DataFrame(data=[["Linear Regression", *evaluate(y_test, test_pred) , cross_val(LinearRegression())]], 
      2                           columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])

TypeError: 'numpy.float64' object is not iterable

CodePudding user response:

The problem is in the evaluate function:

def evaluate(true, predicted):
    mae = metrics.mean_absolute_error(true, predicted)
    mse = metrics.mean_squared_error(true, predicted)
    rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
    r2_square = metrics.r2_score(true, predicted)
    return mae
    return mse
    return rmse
    return r2_squre

Here when the first return is hit the function will end and nothing else would be executed. If you want all the values to be returned you need to modify it to:

def evaluate(true, predicted):
    mae = metrics.mean_absolute_error(true, predicted)
    mse = metrics.mean_squared_error(true, predicted)
    rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
    r2_square = metrics.r2_score(true, predicted)
    return mae, mse, rmse, r2_squre
  •  Tags:  
  • Related