确保在scikit中随机森林分类中的正确操作顺序学习

use*_*827 -1 python pandas scikit-learn

我想确保我的机器学习的操作顺序是正确的:

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.grid_search import GridSearchCV

# 1. Initialize model
model = RandomForestClassifier(5000)

# 2. Load dataset
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 3. Remove unimportant features
model = SelectFromModel(model, threshold=0.5).estimator

# 4. cross validate model on the important features
k_fold = KFold(n=len(data), n_folds=10, shuffle=True)
for k, (train, test) in enumerate(k_fold):
    self.model.fit(data[train], target[train])

# 5. grid search for best parameters
param_grid = {
    'n_estimators': [1000, 2500, 5000],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth': [3, 5, data.shape[1]]
}

gs = GridSearchCV(estimator=model, param_grid=param_grid)
gs.fit(X, y)
model = gs.best_estimator_

# Now the model can be used for prediction
Run Code Online (Sandbox Code Playgroud)

如果此订单看起来不错或是否可以采取措施改进,请告知我们.

--EDIT,澄清减少downvotes.

具体来说,1.应该SelectFromModel在交叉验证后完成吗?

  1. 网格搜索应该在交叉验证之前完成吗?

Dav*_*ust 6

您的方法的主要问题是您将功能选择变换器与最终估算器混淆.您需要做的是创建两个阶段,首先是变压器:

rf_feature_imp = RandomForestClassifier(100)
feat_selection = SelectFromModel(rf_feature_imp, threshold=0.5)
Run Code Online (Sandbox Code Playgroud)

然后,您需要第二阶段,使用缩减的特征集在简化的特征集上训练分类器.

clf = RandomForestClassifier(5000)
Run Code Online (Sandbox Code Playgroud)

完成阶段后,您可以构建一个管道,将两者合并为最终模型.

model = Pipeline([
          ('fs', feat_selection), 
          ('clf', clf), 
        ])
Run Code Online (Sandbox Code Playgroud)

现在你可以执行GridSearch你的model.请记住,您有两个阶段,因此参数必须由stage fsclf.在功能选择阶段,您还可以使用基本估算器fs__estimator.下面是如何在三个对象中的任何一个上搜索参数的示例.

 params = {
    'fs__threshold': [0.5, 0.3, 0.7],
    'fs__estimator__max_features': ['auto', 'sqrt', 'log2'],
    'clf__max_features': ['auto', 'sqrt', 'log2'],
 }

 gs = GridSearchCV(model, params, ...)
 gs.fit(X,y)
Run Code Online (Sandbox Code Playgroud)

然后,您可以gs直接或使用进行预测gs.best_estimator_.

  • 一个说明.我通常不会在RandomForest的`n_estimators`中搜索最佳数字.通常它总是最高的.但是,您可能希望对其进行测试,以便构建更快或更小的模型. (2认同)
  • GridSearchCV默认自动执行k折交叉验证,以便选择最佳参数.您可以使用`gs.best_score_`或`gs.grid_scores_`查看这些分数.这将给你一个估计,但它可能会偏高,因为它是许多参数的许多运行中最好的.如果你想要一个更精确的估计,你应该在一开始就提出一些数据,并在最后运行`gs.score(test_X,test_y)`以获得更好的估计. (2认同)