2016-05-03 3 views
4

У меня есть довольно большой файл CSV, содержащий данные обзора amazon, которые я прочитал в рамке данных pandas. Я хочу разбить данные 80-20 (тест поездов), но при этом я хочу убедиться, что разделенные данные пропорционально представляют значения одного столбца (категории), т. Е. Вся другая категория отзывов присутствует как в поезде и тестовые данные пропорционально.sklearn стратифицированная выборка на основе столбца

Данные выглядит следующим образом:

**ReviewerID**  **ReviewText**  **Categories**  **ProductId** 

1212     good product   Mobile    14444425 
1233     will buy again  drugs    324532 
5432     not recomended  dvd     789654123 

Im используя следующий код, чтобы сделать это:

import pandas as pd 
Meta = pd.read_csv('C:\\Users\\xyz\\Desktop\\WM Project\\Joined.csv') 
import numpy as np 
from sklearn.cross_validation import train_test_split 

train, test = train_test_split(Meta.categories, test_size = 0.2, stratify=y) 

это дает следующее сообщение об ошибке

NameError: name 'y' is not defined 

Как я относительно new to python Я не могу понять, что я делаю неправильно, или этот код будет стратифицировать на основе категорий столбцов. Кажется, что он отлично работает, когда я удаляю параметр stratify, а также столбцы категорий из split-test split.

Любая помощь будет оценена по достоинству.

+1

Вы еще не определили 'y', прежде чем использовать его в' train_test_split'. – qmaruf

+1

Вам нужно определить переменную y раньше. На странице sklearn, stratify: array-like или None (по умолчанию None) Если нет None, данные разбиваются по стратифицированному модулю, используя это как массив меток. Значит, у вас должны быть ярлыки, которые вы используете. – nEO

+0

категории - это ваш y, и вам необходимо разделить данные (X и Y). Вы не делаете разделения на данные прямо сейчас – nEO

ответ

5
>>> import pandas as pd 
    >>> Meta = pd.read_csv('C:\\Users\\a578209\\Downloads\\so\\Book1.csv') 
    >>> import numpy as np 
    >>> from sklearn.cross_validation import train_test_split 
    >>> y = Meta.pop('Categories') 
    >>> Meta 
     ReviewerID  ReviewText ProductId 
     0  1212 good product 14444425 
     1  1233 will buy again  324532 
     2  5432 not recomended 789654123 
    >>> y 
     0 Mobile 
     1  drugs 
     2  dvd 
     Name: Categories, dtype: object 
    >>> X = Meta 
    >>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) 
    >>> X_test 
     ReviewerID ReviewText ProductId 
     0  1212 good product 14444425 
+0

Спасибо за подробное решение, я последовал за ним и ввел опцию stratify –

+0

np. Вы можете выбрать это как ответ, если вам понравится – nEO

7

sklearn.cross_validation.train_test_split

наслаивается: массив тип или None (по умолчанию не является None) Если нет Нет, данные не раскола в стратифицированной моде, используя это в качестве массива меток. Новое в версии 0.17 : наслаиваются расщепление

Вдоль API Docs, я думаю, вы должны попробовать, как X_train, X_test, y_train, y_test = train_test_split(Meta_X, Meta_Y, test_size = 0.2, stratify=Meta_Y).

Meta_X, Meta_Y должны быть назначены правильно вами (я думаю Meta_Y должен быть Meta.categories на основе кода).

+0

предупреждение, 'train_test_split' устарело (проверьте со ссылкой) –