【问题标题】:MAE using Pipeline and GridSearchCVMAE 使用 Pipeline 和 GridSearchCV
【发布时间】:2020-07-02 05:15:03
【问题描述】:

我在使用 Pipeline 和 GridSearchCV 查找平均误差 (MAE) 时面临挑战

背景:

我参与过一个数据科学项目(如下所示的 MWE),其中一个 MAE 值将作为分类器的性能指标返回。

#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 

讨论:

方法一: 如在GridSearchCV() 中,scoring 变量设置为neg_mean_squared_error,试图读取grid.best_score_。但它没有得到相同的 MAE 结果。

方法 2: 尝试使用grid.predict(X_valid) 获取y_predict 值。然后尝试使用grid.score(y_predict, y_valid) 获取MAE,因为GridSearchCV() 中的scoring 变量设置为neg_mean_squared_error。它返回了一个 ValueError 抱怨“预期的二维数组,而不是一维数组”。

方法 3: 试图重塑y_predict,它也没有工作。这次它返回“ValueError:模型的特征数必须与输入匹配。”

如果您能帮助指出我可能犯错误的地方会很有帮助?

如果您需要,data.csv 可在https://www.dropbox.com/s/t1h53jg1hy4x33b/data.csv 获得

非常感谢

【问题讨论】:

    标签: python pandas machine-learning scikit-learn data-science


    【解决方案1】:

    您正在尝试将 mean_absolute_errorneg_mean_squared_error 进行比较,这非常不同,请参阅 here 了解更多详细信息。您应该在 GridSearchCV 对象创建中使用了 neg_mean_absolute_error,如下所示:

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

    另外,sklearn 中的score 方法将(X,y) 作为输入,其中x 是您的输入特征(n_samples, n_features)y 是目标标签,您需要将您的grid.score(y_predict, y_valid) 更改为grid.score(X_valid, y_valid).

    希望这会有所帮助。

    【讨论】:

    • 非常感谢。我做了你指出的错误。现在更好地理解它。下面是我使用 Pipeline 和 GridSearchCV 得到的值,这个值与我没有使用 Pipeline 和 GridSearchCV 的解决方案完全相同。 print("score = %3.17f"%(grid.score(X_valid, y_valid))) #-0.38727149627623564
    • 还有一个疑问。grid.score()方法返回-0.38727149627623564,而grid.best_score_属性返回-0.3871951219512195。发现 grid.best_score_ 为评分参数提供了更好的价值。了解 best_score_ 使用 best_estimator_ 使用所有 CV 折叠的平均值。 score 方法在计算其值时有何不同?它不应该使用 best_estimator_ 作为通过 GridSearchCV 调整其超参数的网格对象吗?在 MWE 中,我只为 n_estimators 使用了 1 个值,因此希望 grid.score() 方法和 grid.best_score_ 属性具有相同的值。
    • 您在 X_validy_valid 上应用 grid.score() 但在网格搜索中您没有使用交叉验证数据作为 X_validy_valid 所以您在两个不同的数据集,因此结果不同。
    • 知道了,grid.score() - 使用了验证集数据,grid.best_score_ - 使用了训练集数据。因此结果不同。从你那里学到了很多。感谢您的耐心等待。
    猜你喜欢
    • 2018-01-27
    • 2020-09-02
    • 2020-07-12
    • 2021-12-08
    • 2017-03-14
    • 2018-10-24
    • 2020-12-27
    • 2021-09-15
    • 2019-05-22
    相关资源
    最近更新 更多