Nic*_*san 8 python machine-learning scikit-learn cross-validation grid-search
我在Python中使用scikitlearn来运行一些基本的机器学习模型.使用内置的GridSearchCV()函数,我确定了不同技术的"最佳"参数,但其中许多都比默认值更差.我包含默认参数作为选项,所以我很惊讶这会发生.
例如:
from sklearn import svm, grid_search
from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(verbose=1)
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1],
'min_samples_split':[2,5,10,20],
'max_depth':[2,3,5,10]}
clf = grid_search.GridSearchCV(gbc, parameters)
t0 = time()
clf.fit(X_crossval, labels)
print "Gridsearch time:", round(time() - t0, 3), "s"
print clf.best_params_
# The output is: {'min_samples_split': 2, 'learning_rate': 0.01, 'max_depth': 2}
Run Code Online (Sandbox Code Playgroud)
这与默认值相同,但max_depth为3.当我使用这些参数时,我得到72%的准确度,而默认值为78%.
我做的一件事,我承认是可疑的,是我使用我的整个数据集进行交叉验证.然后在获得参数后,我使用相同的数据集运行它,分成75-25训练/测试.
我的网格搜索是否有理由忽视"优越"默认值?
当您在同一数据集上进行测试时,在整个数据集上运行交叉验证以进行参数和/或特征选择肯定会导致问题。看起来这至少是问题的一部分。在您的数据子集上运行 CV 以进行参数优化,并留下一个保留集进行测试,这是一种很好的做法。
假设您正在使用iris数据集(这是您评论链接中示例中使用的数据集),下面是一个示例,说明GridSearchCV首先使用以下内容创建保持集如何影响参数优化train_test_split:
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
iris = datasets.load_iris()
gbc = GradientBoostingClassifier()
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1],
'min_samples_split':[2,5,10,20],
'max_depth':[2,3,5,10]}
clf = GridSearchCV(gbc, parameters)
clf.fit(iris.data, iris.target)
print(clf.best_params_)
# {'learning_rate': 1, 'max_depth': 2, 'min_samples_split': 2}
Run Code Online (Sandbox Code Playgroud)
现在使用随机训练子集重复网格搜索:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(iris.data, iris.target,
test_size=0.33,
random_state=42)
clf = GridSearchCV(gbc, parameters)
clf.fit(X_train, y_train)
print(clf.best_params_)
# {'learning_rate': 0.01, 'max_depth': 5, 'min_samples_split': 2}
Run Code Online (Sandbox Code Playgroud)
我发现这两种方法的分类准确度要高得多,这让我觉得您可能正在使用不同的数据 - 但这里演示了在维护保持集的同时执行参数选择的基本要点。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |