【问题标题】:ValueError: Unknown label type: while implementing MLPClassifierValueError:未知标签类型:在实现 MLPClassifier 时
【发布时间】:2017-07-31 11:55:15
【问题描述】:

我有包含年、月、日、小时、分钟、秒、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,

【问题讨论】:

    标签: python-3.x neural-network classification model-fitting valueerror


    【解决方案1】:

    改为使用回归器。这将解决浮点 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)
    

    【讨论】:

      【解决方案2】:

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

      如果你想把它当作一个分类问题来处理,那么根据sklearn documentation

      在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/

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这不会解决错误。查看我对 zeebonk 的评论
        • 在这种情况下,您使用回归而不是分类的解决方案是正确的。但是,从编程的角度来看,每个数字都可以是类标签,如果标签,即 y_train 可以是数字数组并且仍然表示标签数组......所以即使 MLPClassifier 从编程的角度来看也应该可以工作,尽管在功能上它不是在这种数据中使用分类器是个好主意。
        • 在这种情况下,需要相应地指定 Y 的类型,如以下答案:stackoverflow.com/questions/34246336/…。仅将其转换为值列表并不能解决问题。
        【解决方案4】:

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

        y = list(df['Daily_KWH_System'])
        

        【讨论】:

        • 这不会解决问题。如果要将其作为分类问题处理,则应指定 Y 的类型(类似于此答案:stackoverflow.com/questions/34246336/...)。但是,根据 Daily_KWH_System 中的值,这不应该是分类问题,而是回归问题(请参阅我的答案中的更多详细信息)。
        猜你喜欢
        • 2018-01-02
        • 2018-12-16
        • 2021-05-11
        • 2021-08-17
        • 2020-05-14
        • 2018-03-16
        • 2017-06-06
        • 2019-11-10
        • 2017-08-29
        相关资源
        最近更新 更多