为 Sklearn 重塑数据

Posted

技术标签:

【中文标题】为 Sklearn 重塑数据【英文标题】:Reshape a data for Sklearn 【发布时间】:2017-12-13 02:54:51 【问题描述】:

我有一个颜色列表:

initialColors = [u'black' u'black' u'black' u'white' u'white' u'white' u'powderblue'
 u'whitesmoke' u'black' u'cornflowerblue' u'powderblue' u'powderblue'
 u'goldenrod' u'white' u'lavender' u'white' u'powderblue' u'powderblue'
 u'powderblue' u'powderblue' u'powderblue' u'powderblue' u'powderblue'
 u'powderblue' u'white' u'white' u'powderblue' u'white' u'white']

我有一个这样的颜色标签:

labels_train = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

0 表示颜色由女性选择,1 表示男性。我将使用另一个颜色数组来预测性别。

因此,对于我的初始颜色,我将名称转换为数字特征向量,如下所示:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(initialColors)
features_train = le.transform(initialColors)

之后我的features_train 看起来像:

[0 0 0 5 5 5 4 6 0 1 4 4 2 5 3 5 4 4 4 4 4 4 4 4 5 5 4 5 5] 

最后,我愿意:

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(features_train, labels_train)

但我有一个错误:

/Library/Python/2.7/site-packages/sklearn/utils/validation.py:395: 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.
  DeprecationWarning)
Traceback (most recent call last):
  File "app.py", line 36, in <module>
    clf.fit(features_train, labels_train)
  File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 182, in fit
    X, y = check_X_y(X, y)
  File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 531, in check_X_y
    check_consistent_length(X, y)
  File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 181, in check_consistent_length
    " samples: %r" % [int(l) for l in lengths])
ValueError: Found input variables with inconsistent numbers of samples: [1, 70]

我做到了:

features_train = features_train.reshape(-1, 1)
labels_train = labels_train.reshape(-1, 1)
clf.fit(features_train, labels_train)

我有一个错误:

/Library/Python/2.7/site-packages/sklearn/utils/validation.py:526: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)

我也试过了:

features_train = features_train.reshape(1, -1)
labels_train = labels_train.reshape(1, -1)

但无论如何:

Traceback (most recent call last):
  File "app.py", line 36, in <module>
    clf.fit(features_train, labels_train)
  File "/Library/Python/2.7/site-packages/sklearn/naive_bayes.py", line 182, in fit
    X, y = check_X_y(X, y)
  File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 526, in check_X_y
    y = column_or_1d(y, warn=True)
  File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 562, in column_or_1d
    raise ValueError("bad input shape 0".format(shape))
ValueError: bad input shape (1, 29)

我的问题是我不明白在我的案例中重塑数据的最佳方法是什么。你能帮我选择一种方法来重塑我的数据吗?

【问题讨论】:

【参考方案1】:

当你这样做时:

features_train = features_train.reshape(1, -1) labels_train = labels_train.reshape(1, -1)

首先,对于您的情况,这里的 features_train 转换是错误的,因为 X.reshape(1, -1) 意味着您有 1 个样本并希望让 numpy 推断那里有多少特征。这不是您想要的,但 fit() 不知道并会相应地对其进行处理,从而给您错误的结果。

话虽如此,您的最后一个错误并非来自 features_train = features_train.reshape(1, -1)。它来自 labels_train = labels_train.reshape(1, -1)。您的 labels_train 现在的形状 (1, 29) 既不是行也不是列向量。虽然我们可能知道它应该被解释为目标值的一维数组,但 fit() 还没有那么聪明,也不知道如何处理它。

【讨论】:

【参考方案2】:

快速回答:

features_train = features_train.reshape(-1, 1); 不要做labels_train = labels_train.reshape(-1, 1)。保持 labels_train 不变。

一些细节:

您似乎对为什么估算器需要二维数据数组输入感到困惑。你的training vectors X has a shape (n_samples, n_features)。所以features_train.reshape(-1, 1) 对您的情况是正确的,因为您只有 1 个功能并且想让numpy 推断那里有多少样本。这确实解决了您的第一个错误。

您的target values y has a shape (n_samples,),它需要一个一维数组。当您执行labels_train = labels_train.reshape(-1, 1) 时,会将其转换为二维列向量。这就是你收到第二个警告的原因。请注意,这是一个警告,意思是 fit() 发现并进行了正确的转换,即您的程序继续运行并且应该是正确的。

当你这样做时:

features_train = features_train.reshape(1, -1)
labels_train = labels_train.reshape(1, -1)

首先,对于您的情况,features_train 的转换是错误的,因为X.reshape(1, -1) 表示您有 1 个样本,并希望让numpy 推断有多少特征。这不是您想要的,但 fit() 不知道并会相应地处理它,给您错误的结果。

话虽如此,您的最后一个错误并非来自features_train = features_train.reshape(1, -1)。它来自labels_train = labels_train.reshape(1, -1)。您的 labels_train 现在的形状 (1, 29) 既不是行也不是列向量。虽然我们可能知道它应该被解释为目标值的一维数组,但fit() 还没有那么聪明,也不知道如何处理它。

【讨论】:

非常感谢!

以上是关于为 Sklearn 重塑数据的主要内容,如果未能解决你的问题,请参考以下文章

Python SKlearn拟合方法不起作用

重塑数据集以正确大小

如何修复重塑我的数据集以进行交叉验证?

sklearn数据库-老鱼学sklearn

将sklearn糖尿病数据集转换为pandas DataFrame [重复]

初识人工智能:机器学习:sklearn数据集