Перекрестная проверка для Sklearn 0.20+?

Я пытаюсь выполнить перекрестную проверку и получаю сообщение об ошибке: «Найдены входные переменные с несовместимым количеством выборок: [18, 1]».

Я использую разные столбцы в фрейме данных pandas (df) в качестве функций, а последний столбец - в качестве метки. Это получено из репозитория машинного обучения для UC Irvine. При импорте пакета перекрестной проверки, который я использовал в прошлом, я получаю сообщение об ошибке, что, возможно, он устарел. Я собираюсь запустить дерево решений, SVM и K-NN.

Мой код такой:

feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'],
       df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'],
       df['cons.conf.idx'], df['euribor3m'], df['nr.employed']]
label = [df['y']]

from sklearn.cross_validation import train_test_split
from sklearn.model_selection import cross_val_score
# Model Training 
x = feature[:]
y = label
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

Любая помощь будет здорово!


person rmahesh    schedule 13.11.2017    source источник
comment
Что непонятного в ошибке? Тип печати и форма x. Это похоже на список серий pd, которые могут быть не тем, что вам нужно.   -  person sascha    schedule 13.11.2017


Ответы (2)


Модуль cross_validation устарел. Новый модуль model_selection занял свое место. Итак, все, что вы делали с cross_validation. теперь доступен в model_selection. Тогда ваш приведенный выше код становится:

feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'],
       df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'],
       df['cons.conf.idx'], df['euribor3m'], df['nr.employed']]
label = [df['y']]

from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score

Теперь, что касается объявления X и y, почему вы заключаете их в список. Просто используйте их так:

feature = df[['age', 'job', 'marital', 'education', 'default', 'housing', 
              'loan', 'contact', 'month', 'day_of_week', 'campaign', 
              'pdays', 'previous', 'emp.var.rate', 'cons.price.idx', 
              'cons.conf.idx', 'euribor3m', 'nr.employed']]
label = df['y']

И тогда вы можете просто использовать свой код, ничего не меняя.

# Model Training 
x = feature[:]
y = label
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

И что касается вашего последнего вопроса о сгибах при перекрестной проверке, в sklearn есть несколько классов, которые делают это (в зависимости от задачи). Пожалуйста, взгляните на:

Который содержит итераторы сгиба. И помните, все это есть в пакете model_selection.

person Vivek Kumar    schedule 14.11.2017

Элементы в вашем списке feature относятся к серии панд. Вам не нужно перечислять каждую функцию в списке, как вы сделали; вам просто нужно передать их все как одну «таблицу».

Например, так выглядит набор данных банка:

df = pd.read_csv('bank.csv', sep=';')
#df.shape
#(4521, 17)
#df.columns
#Index(['age', 'job', 'marital', 'education', 'default', 'balance', 'housing',
#       'loan', 'contact', 'day', 'month', 'duration', 'campaign', 'pdays',
#       'previous', 'poutcome', 'y'],
#      dtype='object')

x = df.iloc[:, :-1]
y = df.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

Должно сработать. Единственное, на что здесь следует обратить внимание, это то, что x - это DataFrame с 16 столбцами, но его базовые данные представляют собой numpy ndarray - не список серий, а единую «матрицу».

person Jarad    schedule 13.11.2017
comment
Кажется, это работает, спасибо. Мой следующий вопрос будет заключаться в том, что где-то в пакете перекрестной проверки, который я импортировал, я мог бы указать количество сгибов для перекрестной проверки? Я не верю, что train_test_split принимает этот параметр. - person rmahesh; 14.11.2017