scikit learn中的预处理-单个样本-折旧警告
Posted
技术标签:
【中文标题】scikit learn中的预处理-单个样本-折旧警告【英文标题】:Preprocessing in scikit learn - single sample - Depreciation warning 【发布时间】:2016-05-07 01:08:42 【问题描述】:在 Ubuntu 下全新安装 Anaconda...在使用 Scikit-Learn 进行分类任务之前,我正在以各种方式预处理我的数据。
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler().fit(train)
train = scaler.transform(train)
test = scaler.transform(test)
这一切都很好,但是如果我有一个新的样本(温度低于)我想分类(因此我想以同样的方式进行预处理,那么我得到
temp = [1,2,3,4,5,5,6,....................,7]
temp = scaler.transform(temp)
然后我收到弃用警告...
DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17
and will raise ValueError in 0.19. Reshape your data either using
X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1)
if it contains a single sample.
所以问题是我应该如何重新调整这样的单个样本?
我想另一种选择(不是很好)是......
temp = [temp, temp]
temp = scaler.transform(temp)
temp = temp[0]
但我相信还有更好的方法。
【问题讨论】:
嗯……你自己回答了。它在警告中:Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
如果您的数据不是 numpy 数组,请先使用 np.array(data)。
【参考方案1】:
你总是可以像这样重塑:
temp = [1,2,3,4,5,5,6,7]
temp = temp.reshape(len(temp), 1)
因为,主要问题是当你的 temp.shape 是: (8,)
你需要 (8,1)
【讨论】:
【参考方案2】:只要听听警告告诉你什么:
如果您的数据具有单个特征/列,则使用 X.reshape(-1, 1) 重塑您的数据 和 X.reshape(1, -1) 如果它包含单个样本。
对于您的示例类型(如果您有多个功能/列):
temp = temp.reshape(1,-1)
对于一个特征/列:
temp = temp.reshape(-1,1)
【讨论】:
我不明白他们所说的单个样本是什么意思。 X.shape 返回 (891, 158) 。他们提出的两种解决方案中的任何一种都会出错,但如果我不对其进行重塑,我仍然会收到该警告。 不要重塑 X!它大约 y(目标)! y 显然只有一列。前几天有同样的问题。花了我一个小时试图重塑 X ;-) 所以......我想知道有多少项目会在这最终成为错误的那一天打破。 除了按照它说的去做(或提供任何有效的输入,据我所知)不会使警告消失。 我很高兴看到这个回复。我收到了类似的错误,但是对于 python 和 numpy 来说是新手,解决方案并不明显。【参考方案3】:.values.reshape(-1,1)
将被接受而不会发出警报/警告
.reshape(-1,1)
将被接受,但有弃用战争
【讨论】:
【参考方案4】:我遇到了同样的问题并收到了同样的弃用警告。当我收到消息时,我正在使用一个 [23, 276] 的 numpy 数组。我尝试根据警告对其进行重塑,但最终无济于事。然后我从 numpy 数组中选择每一行(因为我一直在迭代它)并将其分配给一个列表变量。它在没有任何警告的情况下工作。
array = []
array.append(temp[0])
然后您可以使用 python 列表对象(此处为“数组”)作为 sk-learn 函数的输入。不是最有效的解决方案,但对我有用。
【讨论】:
【参考方案5】:这可能会有所帮助
temp = ([[1,2,3,4,5,6,.....,7]])
【讨论】:
【参考方案6】:嗯,看起来警告实际上是在告诉你该怎么做。
作为sklearn.pipeline
stages' uniform interfaces 的一部分,根据经验:
当你看到X
时,它应该是一个二维的np.array
当您看到y
时,它应该是一个单一维度的np.array
。
因此,您应该考虑以下几点:
temp = [1,2,3,4,5,5,6,....................,7]
# This makes it into a 2d array
temp = np.array(temp).reshape((len(temp), 1))
temp = scaler.transform(temp)
【讨论】:
什么是'np'对象? @Tajchert 很抱歉 -import numpy as np
.
谢谢 :) 刚启动 Python,所以不明显
#This makes it into a 2d array
temp = [1,2,3,4,5,5,6,....................,7] #an instance
temp = np.array(temp).reshape((1, -1))
print(model.predict(temp))
这是否意味着sklearn决定不鼓励python原生列表?还有办法不使用numpy吗?以上是关于scikit learn中的预处理-单个样本-折旧警告的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn RandomForestClassifier 中的子样本大小
Scikit-learn 随机森林 out of bag 样本