【问题标题】:Sklearn complains about one-column dataframesSklearn 抱怨单列数据框
【发布时间】:2020-04-28 10:59:15
【问题描述】:

考虑以下最小示例:

from time import sleep  # To (try to) get warnings printed at the right places

import pandas as pd
from sklearn.neural_network import MLPClassifier
from sklearn.dummy import DummyClassifier

df = pd.DataFrame([[1, 1, 1, 1], [0, 0, 0, 0]])
mlp = MLPClassifier(tol=10)
dummy = DummyClassifier(strategy='uniform')

for size in [1, 2]:

    input_columns = [0, 1]
    output_columns = [j + 2 for j in range(size)]

    print('Dimension of output: ', len(output_columns))  # Is 1 or 2

    X = df[input_columns]
    Y = df[output_columns]

    print('MLPClassifier')
    mlp.fit(X, Y)
    sleep(3)

    print('DummyClassifier')
    dummy.fit(X, Y)
    sleep(3)

    print('\n\n\n')

在第一次迭代中,在 MLPClassifier 的训练过程中,Sklearn 抱怨:

lib/python3.6/site-packages/sklearn/neural_network/_multilayer_perceptron.py:934:DataConversionWarning:当需要一维数组时,传递了列向量 y。请将 y 的形状更改为 (n_samples, ),例如使用 ravel()。 y = column_or_1d(y, warn=True)

第二次迭代运行良好。 DummyClassifier (dummy.fit) 在两次迭代中都运行良好。

错误是因为我试图将一列数据帧 (Y) 发送到 mlp.fit。在第二次迭代中不会发生这种情况,其中Y 是一个双列数据框。

问题是:在 MLPClassifier 的情况下,如何正确地将数据传递给 fit?我知道我可以做Y = Y.values.ravel(),当数据帧是一列时它可以工作,但它不适用于两列数据帧。我正在寻找一种一致的方法来为任意数量的列通用地解决这个问题。

【问题讨论】:

  • 不确定我是否理解为什么您的 Y 会有两列用于分类任务?

标签: python pandas scikit-learn


【解决方案1】:

一种方法是预先检查列数是否 ==1。

    if len(output_columns) == 1:
        mlp.fit(X, Y.values.ravel())
    else:
        mlp.fit(X, Y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2022-01-10
    • 2012-01-28
    相关资源
    最近更新 更多