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在交叉验证后完成吗?
您的方法的主要问题是您将功能选择变换器与最终估算器混淆.您需要做的是创建两个阶段,首先是变压器:
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 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)
Run Code Online (Sandbox Code Playgroud)
然后,您可以gs直接或使用进行预测gs.best_estimator_.
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |