为什么发生过度拟合时随机森林最大深度参数验证分数不会缩小
Why randomforest max depth parameter's validation score not shrink, when overfitting occur
我制作了随机森林模型,并将结果可视化。
#training code
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
digits = load_digits()
forest_param = {'max_depth': np.arange(1,15),
'n_estimators': [50, 100, 150, 200, 250, 300, 350, 400]}
forest_classifier = RandomForestClassifier()
forest_grid = GridSearchCV(forest_classifier, forest_param, n_jobs=-1, return_train_score=True, cv=10)
digit_data = digits.data
digit_target = digits.target
forest_grid.fit(digit_data, digit_target)
print("best forest validation score")
forest_grid.best_score_
#visualize code
def plot_search_results(grid, lsi_log_index):
"""
Params:
grid: A trained GridSearchCV object.
"""
## Results from grid search
results = grid.cv_results_
means_test = results['mean_test_score']
stds_test = results['std_test_score']
means_train = results['mean_train_score']
stds_train = results['std_train_score']
## Getting indexes of values per hyper-parameter
masks=[]
masks_names= list(grid.best_params_.keys())
for p_k, p_v in grid.best_params_.items():
masks.append(list(results['param_'+p_k].data==p_v))
params=grid.param_grid
## Ploting results
fig, ax = plt.subplots(1,len(params),sharex='none', sharey='all',figsize=(20,5))
fig.suptitle('Score per parameter')
fig.text(0.04, 0.5, 'MEAN SCORE', va='center', rotation='vertical')
pram_preformace_in_best = {}
for i, p in enumerate(masks_names):
m = np.stack(masks[:i] + masks[i+1:])
pram_preformace_in_best
best_parms_mask = m.all(axis=0)
best_index = np.where(best_parms_mask)[0]
x = np.array(params[p])
y_1 = np.array(means_test[best_index])
e_1 = np.array(stds_test[best_index])
y_2 = np.array(means_train[best_index])
e_2 = np.array(stds_train[best_index])
ax[i].errorbar(x, y_1, e_1, linestyle='--', marker='o', label='test')
ax[i].errorbar(x, y_2, e_2, linestyle='-', marker='^',label='train' )
ax[i].set_xlabel(p.upper())
for log_scaler in lsi_log_index:
ax[log_scaler].set_xscale("log")
plt.legend()
plt.show()
plot_search_results(forest_grid,[])
我想在发生过度拟合时缩小验证分数。
像这个 SVR_C 参数。 Image1
当发生过度拟合时,验证分数会缩小。
但是,当发生过拟合时,最大深度参数的验证分数不会缩小。
Image2
我了解到验证分数缩水,出现过拟合情况。
你能告诉我为什么会出现这种情况吗? :)
嗯,这完全取决于数据集。从您的 Image2 中,我们可以看到您的 RandomForestClassifier
max_depth
没有过度拟合您的训练集。扩展树的深度,直到所有叶子都是纯净的或直到所有叶子包含少于 min_samples_split
个样本(默认为 2)。这些条件确保您的树木不会扩展到最大深度。因此你的模型没有过度拟合。
另一方面 SVR
,一个大的 C
参数将确保所有样本都被正确分类。因此模型过度拟合。
我制作了随机森林模型,并将结果可视化。
#training code
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
digits = load_digits()
forest_param = {'max_depth': np.arange(1,15),
'n_estimators': [50, 100, 150, 200, 250, 300, 350, 400]}
forest_classifier = RandomForestClassifier()
forest_grid = GridSearchCV(forest_classifier, forest_param, n_jobs=-1, return_train_score=True, cv=10)
digit_data = digits.data
digit_target = digits.target
forest_grid.fit(digit_data, digit_target)
print("best forest validation score")
forest_grid.best_score_
#visualize code
def plot_search_results(grid, lsi_log_index):
"""
Params:
grid: A trained GridSearchCV object.
"""
## Results from grid search
results = grid.cv_results_
means_test = results['mean_test_score']
stds_test = results['std_test_score']
means_train = results['mean_train_score']
stds_train = results['std_train_score']
## Getting indexes of values per hyper-parameter
masks=[]
masks_names= list(grid.best_params_.keys())
for p_k, p_v in grid.best_params_.items():
masks.append(list(results['param_'+p_k].data==p_v))
params=grid.param_grid
## Ploting results
fig, ax = plt.subplots(1,len(params),sharex='none', sharey='all',figsize=(20,5))
fig.suptitle('Score per parameter')
fig.text(0.04, 0.5, 'MEAN SCORE', va='center', rotation='vertical')
pram_preformace_in_best = {}
for i, p in enumerate(masks_names):
m = np.stack(masks[:i] + masks[i+1:])
pram_preformace_in_best
best_parms_mask = m.all(axis=0)
best_index = np.where(best_parms_mask)[0]
x = np.array(params[p])
y_1 = np.array(means_test[best_index])
e_1 = np.array(stds_test[best_index])
y_2 = np.array(means_train[best_index])
e_2 = np.array(stds_train[best_index])
ax[i].errorbar(x, y_1, e_1, linestyle='--', marker='o', label='test')
ax[i].errorbar(x, y_2, e_2, linestyle='-', marker='^',label='train' )
ax[i].set_xlabel(p.upper())
for log_scaler in lsi_log_index:
ax[log_scaler].set_xscale("log")
plt.legend()
plt.show()
plot_search_results(forest_grid,[])
我想在发生过度拟合时缩小验证分数。
像这个 SVR_C 参数。 Image1
当发生过度拟合时,验证分数会缩小。
但是,当发生过拟合时,最大深度参数的验证分数不会缩小。
Image2
我了解到验证分数缩水,出现过拟合情况。
你能告诉我为什么会出现这种情况吗? :)
嗯,这完全取决于数据集。从您的 Image2 中,我们可以看到您的 RandomForestClassifier
max_depth
没有过度拟合您的训练集。扩展树的深度,直到所有叶子都是纯净的或直到所有叶子包含少于 min_samples_split
个样本(默认为 2)。这些条件确保您的树木不会扩展到最大深度。因此你的模型没有过度拟合。
另一方面 SVR
,一个大的 C
参数将确保所有样本都被正确分类。因此模型过度拟合。