【问题标题】:How to use 'predict' at the time of Random Search for all different param combination如何在随机搜索时对所有不同的参数组合使用“预测”
【发布时间】:2021-10-15 07:11:25
【问题描述】:

我们可以使用RandomizedSearchCV 获得模型的最佳参数。

def test_model():
    X_train, X_test, y_train, y_test = make_friedman1()
    result_dfs = []
    model = Ridge()
    search = RandomizedSearchCV(model, space, n_iter=500, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv)
    result = search.fit(X_train, y_train)
    print('Best Score: %s' % result.best_score_)
    print('Best Hyperparameters: %s' % result.best_params_)

现在,我正在尝试使用X_test 数据获取每种不同类型的参数组合的测试分数(即MSER2)。

def test_model():
    X_train, X_test, y_train, y_test = make_friedman1()
    result_dfs = []
    model = Ridge()
    search = RandomizedSearchCV(model, space, n_iter=500, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv)
    result = search.fit(X_train, y_train)
    print('Best Score: %s' % result.best_score_)
    print('Best Hyperparameters: %s' % result.best_params_)
    
    test_result = search.fit(X_train, y_train).predict(X_test)
    diff_acc = test_result - y_test
    fold_df = pd.DataFrame()
    fold_df["MSE"] = [mean_squared_error(y_test, test_result)]
    fold_df["R2"] = [r2_score(y_test, test_result)]
    result_dfs.append(fold_df)
    rep_df = pd.concat(result_dfs, axis=0, ignore_index=True)
    return rep_df

我得到的输出是

Best Score: -0.495580216817403
Best Hyperparameters: {'alpha': 28.590361345568553, 'fit_intercept': False, 'normalize': True, 'solver': 'cholesky'}
       MSE       R2            
0  0.460333  0.504366  

但我想从param space 获取所有不同参数配置的所有测试分数并将它们保存在df 中。

更具体地说,我需要说,我的程序中有n_iter=500。所以,我有 500 种参数设置组合。我想在下面的行中将这些参数用于fitpredict。最后,对于每个不同的参数组合,我将有 500 个 MSER2

test_result = search.fit(X_train, y_train).predict(X_test)

您能告诉我如何使用RandomizedSearchCV 获得每个不同参数组合的所有测试分数吗?

完整代码

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
import pandas as pd
from scipy.stats import loguniform
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import RandomizedSearchCV


# define search space
space = dict()
space['solver'] = ['svd', 'cholesky', 'lsqr', 'sag']
space['alpha'] = loguniform(1e-5, 100)
space['fit_intercept'] = [True, False]
space['normalize'] = [True, False]

cv = RepeatedKFold(n_splits=5, n_repeats=3)

def generate_friedman1():
    data = datasets.make_friedman1(n_samples=300)
    X = data[0]
    y = data[1]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    return X_train, X_test, y_train, y_test

def test_model():
    X_train, X_test, y_train, y_test = make_friedman1()
    result_dfs = []
    model = Ridge()
    search = RandomizedSearchCV(model, space, n_iter=500, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv)
    result = search.fit(X_train, y_train)
    print('Best Score: %s' % result.best_score_)
    print('Best Hyperparameters: %s' % result.best_params_)
    
    test_result = search.fit(X_train, y_train).predict(X_test)
    diff_acc = test_result - y_test
    fold_df = pd.DataFrame()
    fold_df["MSqE"] = [mean_squared_error(y_test, test_result)]
    fold_df["R2"] = [r2_score(y_test, test_result)]
    result_dfs.append(fold_df)
    rep_df = pd.concat(result_dfs, axis=0, ignore_index=True)
    return rep_df

if __name__ == "__main__":
    print(test_model())

【问题讨论】:

    标签: python python-3.x machine-learning scikit-learn


    【解决方案1】:

    .cv_results_ 属性将具有每个 cv 折叠和测试的每个参数的结果。例如,search.cv_results_['params'] 将保存在随机搜索中测试的所有值的字典,search.cv_results_['split0_test_score'] 将保存它为 split0 获得的分数。

    如果您需要进一步的帮助,请指定您希望查看的 DataFrame 的列,如果需要我可以提供帮助!

    【讨论】:

    • 感谢您的回答。但我需要别的东西。说,我的程序中有n_iter=500。所以,我有 500 种参数设置组合。我想在test_result = search.fit(X_train, y_train).predict(X_test) 这一行中将这些参数用于fitpredict。最后,对于每个不同的参数组合,我将有 500 个 MSER2
    【解决方案2】:

    您可以将所有参数保存在一个变量中

    all_param_combination = search.cv_results_['params']
    

    然后你可以使用一个循环到fitpredict 使用一个模型

        for i in range(len(all_param_combination)):
            reg_preds = Ridge(**all_param_combination[i]).fit(X_train, y_train).predict(X_test)
            acc_diff = reg_preds - y_test
            fold_df = pd.DataFrame()
            fold_df["MSE"] = [mean_squared_error(y_test, reg_preds)]
            fold_df["R2"] = [r2_score(y_test, reg_preds)]
            fold_dfs.append(fold_df)
        rep_df = pd.concat(fold_dfs, axis=0, ignore_index=True)
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2019-12-02
      • 2019-07-18
      • 2019-10-04
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多