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:权重在岭回归中的作用

scikit-learn RandomForestClassifier 中的子样本大小

Scikit-learn 随机森林 out of bag 样本

带权重的 Scikit-Learn 分类和回归

Scikit-learn:使用 DBSCAN 进行聚类后,绘制的点比初始数据样本少

scikit-learning教程统计学习科学数据处理的教程