10-кратная перекрестная проверка и получение RMSE - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь сравнить RMSE, который у меня есть, от выполнения множественной линейной регрессии на полном наборе данных до 10-кратной перекрестной проверки с использованием модуля KFold в scikit learn. Я нашел какой-то код, который я пытался адаптировать, но я не могу заставить его работать (и я подозреваю, что он вообще никогда не работал.

TIA для любой помощи!

Вот мой линейныйфункция регрессии

  def standRegres(xArr,yArr):
      xMat = np.mat(xArr); yMat = np.mat(yArr).T
      xTx = xMat.T*xMat
      if np.linalg.det(xTx) == 0.0:
          print("This matrix is singular, cannot do inverse")
          return
      ws = xTx.I * (xMat.T*yMat)
      return ws

  ##  I run it on my matrix ("comm_df") and my dependent var (comm_target)

  ##  Calculate RMSE (omitted some code)

  initial_regress_RMSE = np.sqrt(np.mean((yHat_array - comm_target_array)**2)

  ##  Now trying to get RMSE after training model through 10-fold cross validation

  from sklearn.model_selection import KFold
  from sklearn.linear_model import LinearRegression

  kf = KFold(n_splits=10)
  xval_err = 0
  for train, test in kf:
      linreg.fit(comm_df,comm_target)
      p = linreg.predict(comm_df)
      e = p-comm_target
      xval_err += np.sqrt(np.dot(e,e)/len(comm_df))

  rmse_10cv = xval_err/10

Я получаю сообщение о том, что объект kfold не повторяется

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Таким образом, код, который вы предоставили, по-прежнему выдает ошибку. Я отказался от того, что у меня было выше, в пользу следующего, который работает:

## KFold cross-validation

from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression

## Define variables for the for loop

kf = KFold(n_splits=10)
RMSE_sum=0
RMSE_length=10
X = np.array(comm_df)
y = np.array(comm_target)

for loop_number, (train, test) in enumerate(kf.split(X)):

    ## Get Training Matrix and Vector

    training_X_array = X[train]
    training_y_array = y[train].reshape(-1, 1)

    ## Get Testing Matrix Values

    X_test_array = X[test]
    y_actual_values = y[test]

    ## Fit the Linear Regression Model

    lr_model = LinearRegression().fit(training_X_array, training_y_array)

    ## Compute the predictions for the test data

    prediction = lr_model.predict(X_test_array)      
    crime_probabilites = np.array(prediction)   

    ## Calculate the RMSE

    RMSE_cross_fold = RMSEcalc(crime_probabilites, y_actual_values)

    ## Add each RMSE_cross_fold value to the sum

    RMSE_sum=RMSE_cross_fold+RMSE_sum

## Calculate the average and print    

RMSE_cross_fold_avg=RMSE_sum/RMSE_length

print('The Mean RMSE across all folds is',RMSE_cross_fold_avg)
0 голосов
/ 17 октября 2019

Есть несколько вещей, которые необходимо исправить в этом коде.

  • Вы не можете перебрать kf. Вы можете перебирать только kf.split(comm_df)

  • Вам нужно каким-то образом использовать разделение теста поезда, предоставляемое KFold. Вы не используете их в своем коде! Цель KFold - подогнать регрессию к наблюдениям за поездом и оценить регрессию (т. Е. Вычислить среднеквадратичное отклонение в вашем случае) на тестовых наблюдениях.

Имея это в видуВот как я бы исправил ваш код (здесь предполагается, что ваши данные находятся в бесчисленных массивах, но вы легко можете переключиться на панд)

kf = KFold(n_splits=10)
xval_err = 0
for train, test in kf.split(comm_df):
    linreg.fit(comm_df[train],comm_target[train])
    p = linreg.predict(comm_df[test])
    e = p-comm_label[test]
    xval_err += np.sqrt(np.dot(e,e)/len(comm_target[test]))

rmse_10cv = xval_err/10
...