创建具有相同键但不同值的字典
Create a dictionary with same key but varied values
我正在研究 GridSearch 方法来调整 Desicion 树模型或随机森林模型的参数。看完波士顿房价的例子,我发现我不会运行这个例子的代码。以下代码为示例的GridSearch代码。问题是 ValueError: Parameter values for parameter (max_depth) need to be a sequence.
我搜索了某些示例,但是,这些示例中的变量 params
几乎以相同的格式定义,这可能会导致此错误。我想作者想创建一个字典,键总是 "max_depth" 但值会从 1 到 10 不等。我不知道如何解决这个问题。有人可以帮助我吗?
def fit_model(X, y):
""" Performs grid search over the 'max_depth' parameter for a
decision tree regressor trained on the input data [X, y]. """
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(X.shape[0], n_iter = 10, test_size = 0.20, random_state = 0)
print (cv_sets)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': range(1,11)}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search object
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
我的理论是:grid-search
模块是为 python 2 设计的,其中:
range
生成一个 list
- 所以没有
range
类型可以检查
因此,从 Python 3 传递 range
是一个不起作用的角落案例,带有令人困惑的消息。
我想我通过查看第 348 行附近的 source code 找到了原因(和修复):
check = [isinstance(v, k) for k in (list, tuple, np.ndarray)]
if True not in check:
raise ValueError("Parameter values for parameter ({0}) need "
"to be a sequence.".format(name))
in python 3, range
is a sequence 但由于它不再生成 list
,因此 grid-search
不接受它,因为明确对象类型的代码测试(所以如果你问我,错误消息会稍微偏离 :))。此外,我很确定如果代码在类型测试中也包含 range
,则其余代码将工作得很好,因为 range
非常接近地模拟 list
,而无需产生任何。
解决方法是强制迭代,例如:
params = {'max_depth': list(range(1,11))}
(tuple
或 numpy
数组也可以)
要修复 grid-search
,可以这样做:for k in (list, tuple, np.ndarray, range)
(但这可能会破坏 python 2,并且可能存在一些 python 2/3 兼容性要求这里)
其他修复方法是:
- 不执行任何检查,让 Python 决定何时使用这些方法(请求原谅比请求许可更好)
- 只需使用
if isinstance(k,(list, tuple, np.ndarray, range)):
,因为 isinstance
已经接受了 tuple
,不需要使用列表理解生成布尔值的复杂结构。
我正在研究 GridSearch 方法来调整 Desicion 树模型或随机森林模型的参数。看完波士顿房价的例子,我发现我不会运行这个例子的代码。以下代码为示例的GridSearch代码。问题是 ValueError: Parameter values for parameter (max_depth) need to be a sequence.
我搜索了某些示例,但是,这些示例中的变量 params
几乎以相同的格式定义,这可能会导致此错误。我想作者想创建一个字典,键总是 "max_depth" 但值会从 1 到 10 不等。我不知道如何解决这个问题。有人可以帮助我吗?
def fit_model(X, y):
""" Performs grid search over the 'max_depth' parameter for a
decision tree regressor trained on the input data [X, y]. """
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(X.shape[0], n_iter = 10, test_size = 0.20, random_state = 0)
print (cv_sets)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': range(1,11)}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search object
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
我的理论是:grid-search
模块是为 python 2 设计的,其中:
range
生成一个list
- 所以没有
range
类型可以检查
因此,从 Python 3 传递 range
是一个不起作用的角落案例,带有令人困惑的消息。
我想我通过查看第 348 行附近的 source code 找到了原因(和修复):
check = [isinstance(v, k) for k in (list, tuple, np.ndarray)]
if True not in check:
raise ValueError("Parameter values for parameter ({0}) need "
"to be a sequence.".format(name))
in python 3, range
is a sequence 但由于它不再生成 list
,因此 grid-search
不接受它,因为明确对象类型的代码测试(所以如果你问我,错误消息会稍微偏离 :))。此外,我很确定如果代码在类型测试中也包含 range
,则其余代码将工作得很好,因为 range
非常接近地模拟 list
,而无需产生任何。
解决方法是强制迭代,例如:
params = {'max_depth': list(range(1,11))}
(tuple
或 numpy
数组也可以)
要修复 grid-search
,可以这样做:for k in (list, tuple, np.ndarray, range)
(但这可能会破坏 python 2,并且可能存在一些 python 2/3 兼容性要求这里)
其他修复方法是:
- 不执行任何检查,让 Python 决定何时使用这些方法(请求原谅比请求许可更好)
- 只需使用
if isinstance(k,(list, tuple, np.ndarray, range)):
,因为isinstance
已经接受了tuple
,不需要使用列表理解生成布尔值的复杂结构。