ValueError: Неизвестный тип метки: при реализации MLPClassifier

У меня есть кадр данных со столбцами Год, месяц, день, час, минута, секунда, Daily_KWH. Мне нужно предсказать ежедневный KWH с помощью нейронной сети. Пожалуйста, дайте мне знать, как это сделать

      Daily_KWH_System  year  month  day  hour  minute  second
0          4136.900384  2016      9    7     0       0       0
1          3061.657187  2016      9    8     0       0       0
2          4099.614033  2016      9    9     0       0       0
3          3922.490275  2016      9   10     0       0       0
4          3957.128982  2016      9   11     0       0       0

Я получаю ошибку значения, когда подбираю модель.

код пока:

X = df[['year','month','day','hour','minute','second']]
y = df['Daily_KWH_System']

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Fit only to the training data
scaler.fit(X_train)

#y_train.shape
#X_train.shape

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

from sklearn.neural_network import MLPClassifier

mlp = MLPClassifier(hidden_layer_sizes=(30,30,30))

#y_train = np.asarray(df['Daily_KWH_System'], dtype="|S6") 

mlp.fit(X_train,y_train)

Ошибка:

ValueError: Unknown label type: (array([  2.27016856e+02,   3.02173014e+03,   4.29404190e+03,
     2.41273427e+02,   1.76714247e+02,   4.23374425e+03,

person Anagha    schedule 10.03.2017    source источник


Ответы (4)


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

Если вы все равно хотите подойти к этому как к проблеме классификации, то в соответствии с документацией sklearn:

При выполнении классификации в scikit-learn y представляет собой вектор целых чисел или строк.

В вашем случае y - это вектор с плавающей запятой, и поэтому вы получаете ошибку. Таким образом, вместо строки

y = df['Daily_KWH_System']

написать строку

y = np.asarray(df['Daily_KWH_System'], dtype="|S6")

и это решит проблему. (Подробнее об этом подходе можно прочитать здесь: Python RandomForest — ошибка неизвестной метки)

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

from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(hidden_layer_sizes=(30,30,30))

с

from sklearn.neural_network import MLPRegressor
mlp = MLPRegressor(hidden_layer_sizes=(30,30,30))

Код будет выполняться без выдачи ошибки (но данных явно недостаточно, чтобы проверить, хорошо ли работает модель, которую мы получаем).

При этом я не думаю, что это правильный подход к выбору функций для этой проблемы.

В этой задаче мы имеем дело с последовательностью действительных чисел, образующих временной ряд. Одна разумная характеристика, которую мы могли бы выбрать, — это количество секунд (или минут\часов\дней и т. д.), прошедших с начальной точки. Поскольку эти конкретные данные содержат только дни, месяцы и годы (другие значения всегда равны 0), мы могли бы выбрать в качестве признака количество дней, прошедших с начала. Тогда ваш фрейм данных будет выглядеть так:

      Daily_KWH_System  days_passed 
0          4136.900384    0   
1          3061.657187    1     
2          4099.614033    2  
3          3922.490275    3   
4          3957.128982    4  

Вы можете взять значения в столбце days_passed в качестве характеристик, а значения в Daily_KWH_System в качестве целей. Вы также можете добавить некоторые функции индикатора. Например, если вы считаете, что конец года может повлиять на цель, вы можете добавить функцию индикатора, которая указывает, является ли месяц декабрем или нет.

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

http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/

http://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/

person Miriam Farber    schedule 19.07.2017

Функция fit() ожидает, что y будет одномерным списком. Нарезая кадр данных Pandas, вы всегда получаете 2D-объект. Это означает, что в вашем случае вам нужно преобразовать 2D-объект, полученный в результате нарезки DataFrame, в фактический 1D-список, как и ожидалось с помощью функции подгонки:

y = list(df['Daily_KWH_System'])
person zeebonk    schedule 13.07.2017
comment
Это не решит проблему. Если вы хотите решить это как проблему классификации, вам следует указать тип Y (аналогично этому ответу: stackoverflow.com/questions/34246336/…). Однако, судя по значениям в Daily_KWH_System, это должна быть не проблема классификации, а скорее проблема регрессии (подробнее см. в моем ответе). - person Miriam Farber; 20.07.2017

Вместо этого используйте регрессор. Это решит проблему с плавающими 2D-данными.

from sklearn.neural_network import MLPRegressor   
model = MLPRegressor(solver='lbfgs',alpha=0.001,hidden_layer_sizes=(10,10))

model.fit(x_train,y_train)

y_pred = model.predict(x_test)
person Aditya Vikram Singh    schedule 18.12.2019

Вместо mlp.fit(X_train,y_train) используйте этот mlp.fit(X_train,y_train.values)

person Chandra    schedule 20.07.2017
comment
Это не устранит ошибку. Смотрите мой комментарий к zeebonk - person Miriam Farber; 20.07.2017
comment
В этом случае ваше решение использовать регрессию вместо классификации правильно. Однако, с точки зрения программирования, каждое число может быть меткой класса, если метки, т. е. y_train, могут быть массивом чисел и по-прежнему представлять массив меток..... так что даже MLPClassifier должен работать с точки зрения программирования, хотя функционально это не так. хорошая идея использовать классификатор в таких данных. - person Chandra; 20.07.2017
comment
В таком случае необходимо указать тип Y соответственно, как в этом ответе: stackoverflow.com/questions/34246336/. Простое преобразование его в список значений не решит проблему. - person Miriam Farber; 20.07.2017