代码之家  ›  专栏  ›  技术社区  ›  Aaraeus

使用分层洗牌分割返回平均评估指标?

  •  0
  • Aaraeus  · 技术社区  · 7 年前

    我正努力让我的分层洗牌组合发挥作用。我有两组数据, features labels 我想把我的名单还给你 results 所有f1/准确度的列表。

    然而,我想我只是对这应该如何将结果返回给我感到困惑和困惑。有人能看出我做错了什么吗?

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.naive_bayes import GaussianNB
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.neighbors import KNeighborsClassifier
    
    from sklearn.model_selection import StratifiedShuffleSplit
    from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score,confusion_matrix
    
    sss = StratifiedShuffleSplit(n_splits=1, random_state=42, test_size=0.33)
    
    clf_obj = RandomForestClassifier(n_estimators=10)
    
    
    scoring = {'accuracy' : make_scorer(accuracy_score), 
               'precision' : make_scorer(precision_score),
               'recall' : make_scorer(recall_score), 
               'f1_score' : make_scorer(f1_score)}
    
    results = cross_validate(estimator=clf_obj,
                                X=features,
                                y=labels,
                                cv=sss,
                                scoring=scoring)
    

    我想让我困惑的是我得到了这个错误:

    ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of groups for any class cannot be less than 2.

    但我不明白我的x和y值发生了什么。我看到的第一个错误似乎是 scoring 参数:

    ---> 29 scoring=scoring)

    ... 但从我看到的情况来看,我想我已经填写了 cross_validate() 功能正常吗?

    完整错误跟踪:

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-27-2af4c433ccc9> in <module>
         27                             y=labels,
         28                             cv=sss,
    ---> 29                             scoring=scoring)
    
    /anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py in cross_validate(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score, return_estimator, error_score)
        238             return_times=True, return_estimator=return_estimator,
        239             error_score=error_score)
    --> 240         for train, test in cv.split(X, y, groups))
        241 
        242     zipped_scores = list(zip(*scores))
    
    /anaconda3/lib/python3.7/site-packages/sklearn/externals/joblib/parallel.py in __call__(self, iterable)
        915             # remaining jobs.
        916             self._iterating = False
    --> 917             if self.dispatch_one_batch(iterator):
        918                 self._iterating = self._original_iterator is not None
        919 
    
    /anaconda3/lib/python3.7/site-packages/sklearn/externals/joblib/parallel.py in dispatch_one_batch(self, iterator)
        752             tasks = BatchedCalls(itertools.islice(iterator, batch_size),
        753                                  self._backend.get_nested_backend(),
    --> 754                                  self._pickle_cache)
        755             if len(tasks) == 0:
        756                 # No more tasks available in the iterator: tell caller to stop.
    
    /anaconda3/lib/python3.7/site-packages/sklearn/externals/joblib/parallel.py in __init__(self, iterator_slice, backend_and_jobs, pickle_cache)
        208 
        209     def __init__(self, iterator_slice, backend_and_jobs, pickle_cache=None):
    --> 210         self.items = list(iterator_slice)
        211         self._size = len(self.items)
        212         if isinstance(backend_and_jobs, tuple):
    
    /anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py in <genexpr>(.0)
        233                         pre_dispatch=pre_dispatch)
        234     scores = parallel(
    --> 235         delayed(_fit_and_score)(
        236             clone(estimator), X, y, scorers, train, test, verbose, None,
        237             fit_params, return_train_score=return_train_score,
    
    /anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py in split(self, X, y, groups)
       1313         """
       1314         X, y, groups = indexable(X, y, groups)
    -> 1315         for train, test in self._iter_indices(X, y, groups):
       1316             yield train, test
       1317 
    
    /anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py in _iter_indices(self, X, y, groups)
       1693         class_counts = np.bincount(y_indices)
       1694         if np.min(class_counts) < 2:
    -> 1695             raise ValueError("The least populated class in y has only 1"
       1696                              " member, which is too few. The minimum"
       1697                              " number of groups for any class cannot"
    
    ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of groups for any class cannot be less than 2.
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   desertnaut SKZI    7 年前

    错误消息实际上说明了这一切:

    ValueError:y中填充最少的类只有1个成员,这太少了。任何类别的最小组数不得少于2。

    你的学校里可能有一门课 y 它只有一个样本,因此任何分层分割实际上都是不可能的。

    你能做的就是从你的数据中删除那个(单个)样本——在任何情况下,由单个样本表示的类对分类都没有任何用处。。。

    推荐文章