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

时间:2016-02-07 17:48:14

标签: 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

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

- 编辑,澄清减少downvotes。

具体而言, 1.交叉验证后SelectFromModel应该完成吗?

  1. 在交叉验证之前是否应该进行网格搜索?

1 个答案:

答案 0 :(得分:6)

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

rf_feature_imp = RandomForestClassifier(100)
feat_selection = SelectFromModel(rf_feature_imp, threshold=0.5)

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

clf = RandomForestClassifier(5000)

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

model = Pipeline([
          ('fs', feat_selection), 
          ('clf', clf), 
        ])

现在,您可以在GridSearch上执行model。请注意,您有两个阶段,因此参数必须由阶段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)

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