Создайте функцию перекрестной проверки для определения среднеквадратической ошибки (RMSPE) для каждой прогностической модели. - PullRequest
0 голосов
/ 09 апреля 2019

Я новичок в создании функций Python. Я пытаюсь придумать функцию cross_valid для определения среднеквадратичной ошибки в процентах (RMSPE) различных прогностических моделей. Прилагается мой фрагмент моего кода:

y = mod_coal.loc[:,"Replacement_cost_USD"]
mod_coal = mod_coal.drop('Replacement_cost_USD', axis = 1)

###Do a cross valiation function for model accuracy
def cross_valid(n_cv_estimates, method):

    CV_list = np.repeat(0, n_cv_estimates) 
    for k in range(1,n_cv_estimates):
        mod_coal_train, mod_coal_test, y_train, y_test = train_test_split(mod_coal, y, test_size = 0.2, random_state = 4240)

        if method == "LM":
            #Fit a simple linear regression model
            lm = LinearRegression()
            lm_model = lm.fit(mod_coal_train,y_train)
            lm_predictions = lm.predict(mod_coal_test)
            RMSPE = np.sqrt(np.mean((lm_predictions - y_test)/y_test)**2)
            CV_list[k] = RMSPE

        elif method == 'Ridge':
            #Fit a Ridge regression model

            #Find optimal alpha
            ridge_parameters = RidgeCV(alphas = [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 1, 5, 10, 20])
            ridge_param_model = ridge_parameters.fit(mod_coal_train, y_train)

            #Optimal alpha is 5 for ridge regression
            ridge = Ridge(alpha=5.0)
            ridge_model = ridge.fit(mod_coal_train, y_train)
            ridge_predictions = ridge.predict(mod_coal_test)
            RMSPE = np.sqrt(np.mean((ridge_predictions - y_test)/y_test)**2)
            CV_list[k] = RMSPE

        elif method == 'Lasso':
            #Fit a LASSO regression model

            #Find optimal alpha
            lasso_parameters = LassoCV(alphas=None, cv=10, max_iter = 1000, normalize=True)
            lasso_param_model = lasso_parameters.fit(mod_coal_train, y_train)

            #Optimal alpha is 215961 for Lasso regression
            lasso = Lasso(alpha=215961) 
            lasso_model = lasso.fit(mod_coal_train, y_train)
            lasso_predictions = lasso.predict(mod_coal_test)
            RMSPE = np.sqrt(np.mean((lasso_predictions - y_test)/y_test)**2)
            CV_list[k] = RMSPE

        elif method == "randomForest":

            #Fit a randomforest model
            rf = RandomForestRegressor(n_estimators = 1000, random_state = 4240)
            rf_model = rf.fit(mod_coal_train, y_train)
            rf_predictions = rf.predict(mod_coal_test)
            RMSPE = np.sqrt(np.mean((rf_predictions - y_test)/y_test)**2)
            CV_list[k] = RMSPE

        elif method == "gbm":

            #Fit a gradient boosting model
            gbm = GradientBoostingRegressor(n_estimators = 1000)
            gbm_model = gbm.fit(mod_coal_train, y_train)
            gbm_predictions = gbm.predict(mod_coal_test)
            RMSPE = np.sqrt(np.mean((gbm_predictions - y_test)/y_test)**2)
            CV_list[k] = RMSPE

        return CV_list 

random.seed(4240)
lm_cv = cross_valid(1000000,"LM")
ridge_cv = cross_valid(1000000, "Ridge")
lasso_cv = cross_valid(1000000, "Lasso")
rf_cv = cross_valid(1000000, "randomForest")
gbm_cv = cross_valid(1000000, "gbm")

print(lm_cv)
print(ridge_cv)
print(lasso_cv)
print(rf_cv)
print(gbm_cv)

Я действительно ожидаю, что список значений RMSPE будет добавлен в мою переменную CV_list. Однако, когда я попытался напечатать lm_cv, ridge_cv, lasso_cv, rf_cv и gbm_cv, я получил список 0 вместо этого. Я в настоящее время в растерянности относительно того, где мой код пошел не так, как надо. Любая помощь приветствуется.

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