10

我有包含年、月、日、小时、分钟、秒、Daily_KWH 列的数据框。我需要使用神经网络预测 Daily 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,
4

4 回答 4

12

首先,这是一个回归问题而不是分类问题,因为Daily_KWH_System列中的值不会形成一组标签。相反,它们似乎是(至少基于提供的示例)实数。

如果您想将其作为分类问题来处理,那么根据sklearn 文档

在 scikit-learn 中进行分类时,y 是整数或字符串的向量。

在您的情况下,y是一个浮点向量,因此您会收到错误消息。因此,而不是线

y = df['Daily_KWH_System']

写行

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

这将解决问题。(您可以在此处阅读有关此方法的更多信息:Python RandomForest - Unknown label Error

然而,由于回归在这种情况下更合适,所以代替上述更改,替换行

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作为目标。您还可以添加一些指标功能。例如,如果您认为年底可能会影响目标,则可以添加指示月份是否为 12 月的指示器功能。

如果数据确实是每天的(至少在这个例子中你每天有一个数据点)并且你想用神经网络解决这个问题,那么另一种合理的方法是将它作为时间序列来处理并尝试拟合递归神经网络网络。以下是描述这种方法的几篇很棒的博客文章:

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

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

于 2017-07-19T23:06:07.923 回答
2

fit()函数期望 y 是一维列表。通过对 Pandas 数据框进行切片,您总能得到一个 2D 对象。这意味着对于您的情况,您需要将切片 DataFrame 获得的 2D 对象转换为实际的 1D 列表,正如 fit 函数所期望的那样:

y = list(df['Daily_KWH_System'])
于 2017-07-13T14:18:53.613 回答
0

请改用回归器。这将解决浮动二维数据问题。

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)
于 2019-12-18T19:18:02.150 回答
-1

而不是 mlp.fit(X_train,y_train) 使用这个 mlp.fit(X_train,y_train.values)

于 2017-07-20T07:08:10.213 回答