我想确保机器学习的操作顺序正确:
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
应该完成吗?
答案 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
。请注意,您有两个阶段,因此参数必须由阶段fs
或clf
指定。在功能选择阶段,您还可以使用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_
进行预测。