мои данные имеют 14 атрибутов и 303 наблюдения, но при применении кн значение k больше 1 дает ошибку - PullRequest
0 голосов
/ 03 июля 2018

Я получаю эту ошибку -

     ValueError: Expected n_neighbors <= n_samples,  but n_samples = 1, n_neighbors = 11

данные, которые я использую, имеют 14 атрибутов и 303 наблюдения. Я хочу, чтобы число соседей было 11 (что-нибудь больше, чем один), но эта ошибка появляется каждый раз.

вот мой код-

     import pandas as pd

    header_names = ['age','sex','cp','trestbps','chol','fbs','restecg','thalach','exang','oldpeak','slope','ca','thal','num']
    dataset = pd.read_csv('E:/HCU proj doc/EHR dataset/cleveland_cleaned_data.csv', names= header_names)

    training_sizes = [1,25,50,75,100,150,200]

    from sklearn.linear_model import LinearRegression
    from sklearn.model_selection import learning_curve

    features = ['age','sex','cp','trestbps','chol','fbs','restecg','thalach','exang','oldpeak','slope','ca','thal']
    target = 'num'

    from sklearn.neighbors import KNeighborsClassifier
    train_size, train_scores, validation_scores = learning_curve(estimator = KNeighborsClassifier(n_neighbors=1), X=dataset[features], y=dataset[target], train_sizes=training_sizes, cv=5, scoring='neg_log_loss')

вот трассировка ошибки-

          Traceback (most recent call last):
  File "E:\HCU proj doc\heart_disease_scaling_and_learning_curve.py", line 15, in <module>
    train_size, train_scores, validation_scores = learning_curve(estimator = KNeighborsClassifier(n_neighbors=11), X=dataset[features], y=dataset[target], train_sizes=training_sizes, cv=5, scoring='neg_log_loss')
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\model_selection\_validation.py", line 1128, in learning_curve
    for train, test in train_test_proportions)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py", line 779, in __call__
    while self.dispatch_one_batch(iterator):
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py", line 625, in dispatch_one_batch
    self._dispatch(tasks)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py", line 588, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 111, in apply_async
    result = ImmediateResult(func)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 332, in __init__
    self.results = batch()
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in __call__
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in <listcomp>
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\model_selection\_validation.py", line 488, in _fit_and_score
    test_scores = _score(estimator, X_test, y_test, scorer, is_multimetric)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\model_selection\_validation.py", line 528, in _score
    score = scorer(estimator, X_test, y_test)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\metrics\scorer.py", line 138, in __call__
    y_pred = clf.predict_proba(X)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\neighbors\classification.py", line 190, in predict_proba
    neigh_dist, neigh_ind = self.kneighbors(X)
  File "C:\Users\Sharanya\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\neighbors\base.py", line 347, in kneighbors
    (train_size, n_neighbors)
ValueError: Expected n_neighbors <= n_samples,  but n_samples = 1, n_neighbors = 11

в чем проблема? что не так в коде? что я должен сделать, чтобы удалить ошибку?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Ваша задача двоичная. Поэтому, когда вы устанавливаете training_size=1, только одна выборка передается в функцию оценки (log_loss в этом случае).

То есть там будет 0.0 или 1.0. Это ошибка. Необходимо указать все метки для метрической функции, чтобы она могла рассчитать потери.

Чтобы решить эту проблему, вы можете сделать несколько вещей:

1) Не передавайте training_sizes в learning_curve, как сказал @desertnaut, и позвольте ему использовать значение по умолчанию. В этом случае данные обучения будут разделены на 5 равных интервалов, которые (в большинстве случаев) будут содержать обе метки в наборе обучения, и log_loss автоматически идентифицирует их для расчета результата.

2) Измените значения training_sizes на более значимые. Может быть, просто удалите 1 из него.

training_sizes = [25,50,75,100,150,200]

Это работает для меня для ваших данных.

3) Измените параметр оценки, чтобы явно передать все labels в log_loss. Таким образом, даже если вы укажете 1 в training_sizes, метод log_loss знает, что данные имеют 2 метки, и рассчитал потери соответственно.

from sklearn.metrics import log_loss

# This will calculate the 'neg_log_loss' as you wanted, just with one extra param
scorer = make_scorer(log_loss, greater_is_better=False, 
                     needs_proba=True, 
                     labels=[0.0, 1.0])   #<== This is what you need.

А затем сделайте это:

....
.... 
train_size, train_scores, validation_scores = learning_curve(KNeighborsClassifier(n_neighbors=1), 
                                           X=dd[features], 
                                           y=dd[target],
                                           train_sizes=training_sizes, 
                                           cv=5, 
                                           scoring=scorer)  #<== Add that here
0 голосов
/ 03 июля 2018

Я подозреваю, что проблема связана с тем, как вы определяете целевой вектор. попробуйте заменить это:

target = 'num'

с этим:

target = ['num']

надеюсь, это поможет

...