Pandas GridSearchCV:“;类型错误:';层状褶皱&x27;“对象不可编辑”;

Pandas GridSearchCV:“;类型错误:';层状褶皱&x27;“对象不可编辑”;,pandas,scikit-learn,grid-search,sklearn-pandas,Pandas,Scikit Learn,Grid Search,Sklearn Pandas,我想在RandomForestClassifier中执行GridSearchCV,但数据不平衡,因此我使用StratifiedKFold: from sklearn.model_selection import StratifiedKFold from sklearn.grid_search import GridSearchCV from sklearn.ensemble import RandomForestClassifier param_grid = {'n_estimators':[

我想在RandomForestClassifier中执行GridSearchCV,但数据不平衡,因此我使用StratifiedKFold:

from sklearn.model_selection import StratifiedKFold
from sklearn.grid_search import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

param_grid = {'n_estimators':[10, 30, 100, 300], "max_depth": [3, None],
          "max_features": [1, 5, 10], "min_samples_leaf": [1, 10, 25, 50], "criterion": ["gini", "entropy"]}

rfc = RandomForestClassifier()

clf = GridSearchCV(rfc, param_grid=param_grid, cv=StratifiedKFold()).fit(X_train, y_train)
但我有一个错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-597-b08e92c33165> in <module>()
     9 rfc = RandomForestClassifier()
     10 
---> 11 clf = GridSearchCV(rfc, param_grid=param_grid, cv=StratifiedKFold()).fit(X_train, y_train)

c:\python34\lib\site-packages\sklearn\grid_search.py in fit(self, X, y)
    811 
    812         """
--> 813         return self._fit(X, y, ParameterGrid(self.param_grid))

c:\python34\lib\site-packages\sklearn\grid_search.py in _fit(self, X, y, parameter_iterable)
    559                                     self.fit_params, return_parameters=True,
    560                                     error_score=self.error_score)
--> 561                 for parameters in parameter_iterable
    562                 for train, test in cv)

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in __call__(self, iterable)
    756             # was dispatched. In particular this covers the edge
    757             # case of Parallel used with an exhausted iterator.
--> 758             while self.dispatch_one_batch(iterator):
    759                 self._iterating = True
    760             else:

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in dispatch_one_batch(self, iterator)
    601 
    602         with self._lock:
--> 603             tasks = BatchedCalls(itertools.islice(iterator, batch_size))
    604             if len(tasks) == 0:
    605                 # No more tasks available in the iterator: tell caller to stop.

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in __init__(self, iterator_slice)
    125 
    126     def __init__(self, iterator_slice):
--> 127         self.items = list(iterator_slice)
    128         self._size = len(self.items)

c:\python34\lib\site-packages\sklearn\grid_search.py in <genexpr>(.0)
    560                                     error_score=self.error_score)
    561                 for parameters in parameter_iterable
--> 562                 for train, test in cv)
    563 
    564         # Out is a list of triplet: score, estimator, n_test_samples

TypeError: 'StratifiedKFold' object is not iterable
TypeError回溯(最近一次调用)
在()
9 rfc=RandomForestClassifier()
10
--->11 clf=网格搜索cv(rfc,参数网格=参数网格,cv=分层折叠()).fit(X\U序列,y\U序列)
c:\python34\lib\site packages\sklearn\grid\u search.py in fit(self,X,y)
811
812         """
-->813返回自拟合(X,y,参数网格(自参数网格))
c:\python34\lib\site packages\sklearn\grid\u search.py in\u fit(self,X,y,parameter\u iterable)
559 self.fit_参数,返回_参数=True,
560错误分数=自身错误分数)
-->561用于参数_iterable中的参数
562(对于列车,在cv中进行试验)
c:\python34\lib\site packages\sklearn\externals\joblib\parallel.py in\uuuuu调用(self,iterable)
756#被派遣。特别是这涵盖了边缘
757#与耗尽迭代器一起使用的并行情况。
-->758自行调度一批时(迭代器):
759自迭代=真
760其他:
c:\python34\lib\site packages\sklearn\externals\joblib\parallel.py在dispatch\u one\u批处理中(self,迭代器)
601
602带自锁:
-->603任务=批处理调用(itertools.islice(迭代器,批处理大小))
604如果len(任务)==0:
605#迭代器中没有更多可用任务:告诉调用方停止。
c:\python34\lib\site packages\sklearn\externals\joblib\parallel.py in\uuuuu init\uuuu(self,iterator\u slice)
125
126定义初始化(自、迭代器切片):
-->127 self.items=列表(迭代器_切片)
128自身尺寸=长度(自身项目)
c:\python34\lib\site packages\sklearn\grid\u search.py in(.0)
560错误分数=自身错误分数)
561用于参数_iterable中的参数
-->562(对于列车,在cv中进行试验)
563
564#Out是一个三元组列表:分数、估计值、n#u检验样本
TypeError:“StratifiedKFold”对象不可编辑

当我写
cv=StratifiedKFold(y_train)
时,我有
ValueError:折叠的数量必须是整数类型。
但是当我写`cv=5时,它工作


我不明白StratifiedKFold有什么问题。api在最新版本中发生了更改。您过去只传递y,现在在创建StratifiedKFold对象时只传递数字。稍后再传递y。

似乎
cv=StratifiedKFold()).fit(X_train,y_train)
应该更改为
cv=StratifiedKFold()).split(X\u train,y\u train)。

这里的问题是其他答案中提到的API更改,但是答案可能更明确

cv
参数文档说明:

cv:int,交叉验证生成器或iterable,可选

确定交叉验证拆分策略。可能的输入 有关cv,请参见:

  • 无,使用默认的3倍交叉验证整数, 指定折叠的数量

  • 作为一个对象使用的对象 交叉验证生成器

  • 可承受的屈服列车/试验分离

对于整数/无输入,如果y是二进制或多类,则为StratifiedKFold 如果估计器是一个分类器,或者如果y既不是二进制的也不是二进制的 多类,使用KFold

因此,无论使用何种方式,所需的只是使用函数
split
提供生成器,建议如下:

kfolds = StratifiedKFold(5)
clf = GridSearchCV(estimator, parameters, scoring=qwk, cv=kfolds.split(xtrain,ytrain))
clf.fit(xtrain, ytrain)
我遇到了完全相同的问题。对我有效的解决方案是替换:

那么它应该可以正常工作。

我写了
cv=StratifiedKFold(10)
并得到
TypeError:“StratifiedKFold”对象不适用
我应该在什么时候通过y?在当前版本中,导入sklearn.model\u selection.StratifiedKFold。然后你可以执行cv=StratifiedKFold(10)并且应该没有错误。但是,可能您是从以前的模块导入的,该模块在版本20之前出于兼容性目的仍然存在。我可以再问一个问题吗?我从该网站下载了文件scikit_learn-0.18-cp34-cp34m-win32.whl,安装了它,但现在我得到
ImportError:DLL加载失败:%1不是有效的win32 appli阳离子。
。怎么了?可能缺少某个依赖项。简单的方法是下载anaconda。然后它就可以工作了。这与错误无关。这行代码:clf=GridSearchCV(rfc,param\u grid=param\u grid,cv=StratifiedKFold()).fit(X\u train,y\u train)只需定义对象clf,然后调用fit方法来训练/拟合clf。@rll还提到fit应替换为split。
from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import GridSearchCV