MAE с использованием Pipeline и GridSearchCV - PullRequest
0 голосов
/ 21 марта 2020

Я сталкиваюсь с проблемой определения средней средней ошибки (MAE) с использованием Pipeline и GridSearchCV

Справочная информация:

Я работал над проектом Data Science (MWE как ниже) где значение MAE будет возвращено классификатором в виде показателя производительности c.

#Library
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

#Data import and preparation
data = pd.read_csv("data.csv")
data_features = ['location','event_type_count','log_feature_count','total_volume','resource_type_count','severity_type']
X = data[data_features]
y = data.fault_severity

#Train Validation Split for Cross Validation
X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0)

#RandomForest Modeling
RF_model = RandomForestClassifier(n_estimators=100, random_state=0)
RF_model.fit(X_train, y_train)

#RandomForest Prediction
y_predict = RF_model.predict(X_valid)

#MAE 
print(mean_absolute_error(y_valid, y_predict))
#Output:
#   0.38727149627623564

Задача:

Теперь я пытаюсь реализовать то же самое, используя Pipeline и GridSearchCV (MWE, как показано ниже). Ожидается, что будет возвращено то же значение MAE, что и выше. К сожалению, я не смог сделать это правильно, используя 3 подхода ниже.

#Library
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

#Data import and preparation
data = pd.read_csv("data.csv")
data_features = ['location','event_type_count','log_feature_count','total_volume','resource_type_count','severity_type']
X = data[data_features]
y = data.fault_severity

#Train Validation Split for Cross Validation
X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0)

#RandomForest Modeling via Pipeline and Hyper-parameter tuning
steps = [('rf', RandomForestClassifier(random_state=0))]
pipeline = Pipeline(steps) # define the pipeline object.
parameters = {'rf__n_estimators':[100]}
grid = GridSearchCV(pipeline, param_grid=parameters, scoring='neg_mean_squared_error', cv=None, refit=True)
grid.fit(X_train, y_train)

#Approach 1:
print(grid.best_score_)
# Output:
#    -0.508130081300813

#Approach 2:
y_predict=grid.predict(X_valid)
print("score = %3.2f"%(grid.score(y_predict, y_valid)))
# Output:
#    ValueError: Expected 2D array, got 1D array instead:
#    array=[0. 0. 0. ... 0. 1. 0.].
#    Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

#Approach 3:
y_predict_df = pd.DataFrame(y_predict.reshape(len(y_predict), -1),columns=['fault_severity'])
print("score = %3.2f"%(grid.score(y_predict_df, y_valid)))
# Output: 
#    ValueError: Number of features of the model must match the input. Model n_features is 6 and input n_features is 1 

Обсуждение:

Подход 1: Как и в GridSearchCV(), переменная scoring установить neg_mean_squared_error, попытался прочитать grid.best_score_. Но он не получил тот же результат MAE.

Подход 2: Пытался получить значения y_predict, используя grid.predict(X_valid). Затем попытался получить MAE, используя grid.score(y_predict, y_valid), поскольку переменная scoring в GridSearchCV() установлена ​​в neg_mean_squared_error. Он возвратил ValueError с жалобой «Ожидаемый 2D-массив, вместо него получен 1D-массив».

Подход 3: Попытался изменить y_predict, но он также не работал. На этот раз он возвратил «ValueError: Количество характеристик модели должно совпадать со входом».

Было бы полезно, если вы можете помочь указать, где я мог совершить ошибку?

Если вам нужно, data.csv доступен на https://www.dropbox.com/s/t1h53jg1hy4x33b/data.csv

Большое спасибо

1 Ответ

1 голос
/ 21 марта 2020

Вы пытаетесь сравнить mean_absolute_error с neg_mean_squared_error, что очень отличается, обратитесь к здесь для получения более подробной информации. Вы должны были использовать neg_mean_absolute_error при создании GridSearchCV объекта, как показано ниже:

grid = GridSearchCV(pipeline, param_grid=parameters,scoring='neg_mean_absolute_error', cv=None, refit=True)

Кроме того, метод score в sklearn принимает (X,y) в качестве входных данных, где x ваша функция ввода формы (n_samples, n_features), а y - метки цели, вам нужно изменить grid.score(y_predict, y_valid) на grid.score(X_valid, y_valid).

Надеюсь, это поможет.

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