Arhn - архитектура программирования

Создание нового столбца для прогнозируемого кластера: SettingWithCopyWarning

К сожалению, этот вопрос будет дублироваться, но я не смог исправить проблему в своем коде, даже после просмотра других подобных вопросов и связанных с ними ответов. Мне нужно разделить мой набор данных на поезд, тест и набор данных. Однако, похоже, я делаю какую-то ошибку, когда добавляю новый столбец для прогнозирования кластера. Ошибка, которую я получаю:

/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  This is separate from the ipykernel package so we can avoid doing imports until

Есть несколько вопросов по этой ошибке, но, вероятно, я делаю что-то не так, так как я еще не исправил проблему и все еще получаю ту же ошибку, что и выше. Набор данных следующий:

    Date    Link    Value   
0   03/15/2020  https://www.bbc.com 1
1   03/15/2020  https://www.netflix.com 4   
2   03/15/2020  https://www.google.com 10
...

Я разделил набор данных на обучающие и тестовые наборы следующим образом:

import sklearn
from sklearn.model_selection import cross_validate
from sklearn.model_selection import train_test_split
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
import nltk
import string as st 

train_data=df.Link.tolist()
df_train=pd.DataFrame(train_data, columns = ['Review'])
X = df_train

X_train, X_test = train_test_split(
        X, test_size=0.4).copy()
X_test, X_val = train_test_split(
        X_test, test_size=0.5).copy()
print(X_train.isna().sum())
print(X_test.isna().sum())

stop_words = stopwords.words('english')

def preprocessor(t):
    t = re.sub(r"[^a-zA-Z]", " ", t())
    words = word_tokenize(t)
    w_lemm = [WordNetLemmatizer().lemmatize(w) for w in words if w not in stop_words]
    return w_lemm


vect =TfidfVectorizer(tokenizer= preprocessor)
vectorized_text=vect.fit_transform(X_train['Review'])
kmeans =KMeans(n_clusters=3).fit(vectorized_text)

Строки кода, вызывающие ошибку:

cl=kmeans.predict(vectorized_text)
X_train['Cluster']=pd.Series(cl, index=X_train.index)

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

Как добавить прогнозируемые кластеры k-средних в столбец к фрейму данных в Python

Как бороться с SettingWithCopyWarning в Pandas?

но что-то все еще продолжает быть не так в моем коде.

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


  • Пожалуйста, прежде чем удалять вопрос, который был закрыт как дубликат, и повторно открывать его дословно, убедитесь, что вы показываете, как именно связанные ответы не решают вашу проблему, вместо того, чтобы просто констатировать, что в моем коде все еще что-то не так. ; первый ответ ясно показывает, как разбить строку, выдающую ошибку, на два шага, то есть cl=kmeans.predict(vectorized_text), а затем X_train['Cluster']=pd.Series(cl, index=X_train.index). Вы действительно пробовали это? Если да, но по-прежнему возникает ошибка, измените показанный здесь код соответствующим образом. 21.05.2020
  • В первом ответе действительно была проблема (должно быть pd.Series вместо Series); пожалуйста, проверьте и подтвердите, что ваша проблема решена, используя (отредактированный) ответ. 21.05.2020
  • Хорошо, тогда, как я уже сказал, пожалуйста, измените свой код, чтобы показать это (таким образом подтверждая, что ваш вопрос не является дубликатом). 21.05.2020
  • Это не ошибка - это предупреждение. Вы перешли по ссылке, предложенной в предупреждении? Каждый раз, когда вы назначаете данные копии фрагмента фрейма данных, вы получите это сообщение. Это не обязательно ошибка в вашем коде, поэтому это предупреждение, а не ошибка. 21.05.2020
  • Да, я сделал, но я не понял, что я должен сделать, чтобы он исчез/исправил 21.05.2020

Ответы:


1

ИМХО, train_test_split дает вам кортеж, и когда вы делаете copy(), это copy() является операцией tuple, а не pandas. Это вызывает печально известное предупреждение о копировании панд.

Таким образом, вы создаете только неглубокую копию кортежа, а не элементов. Другими словами

X_train, X_test = train_test_split(X, test_size=0.4).copy()

эквивалентно:

train_test = train_test_split(X, test_size=0.4)
train_test_copy = train_test.copy()
X_train, X_test = train_test_copy[0], train_test_copy[1]

Поскольку кадры данных pandas являются указателями, X_train и X_test могут указывать или не указывать на те же данные, что и X. Если вы хотите скопировать кадры данных, вы должны явно указать copy() для каждого кадра данных:

X_train, X_test = train_test_split(X, test_size=0.4)
X_train, X_test = X_train.copy(), X_test.copy()

or

X_train, X_test = [d.copy() for d in train_test_split(X, test_size=0.4)]

Затем каждый X_train и X_test представляет собой новый кадр данных, указывающий на новые данные памяти.


Обновление: протестирован этот код без каких-либо предупреждений:

X = pd.DataFrame(np.random.rand(100,3))
X_train, X_test = train_test_split(X, test_size=0.4)
X_train, X_test = X_train.copy(), X_test.copy()

X_train['abcd'] = 1
20.05.2020
  • Большое спасибо, @Quang Hoang. Это исправило предупреждение. 21.05.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..