Numpy DataConversionWarning: A column-vector y was passed when a 1d array was expected错误

Numpy DataConversionWarning: A column-vector y was passed when a 1d array was expected错误

在本文中,我们将介绍一个常见的Numpy警告:“Numpy DataConversionWarning: A column-vector y was passed when a 1d array was expected”,并提供一些解决方案。

阅读更多:Numpy 教程

警告信息

当我们使用Numpy进行数据处理的时候,有时候会遇到类似如下的警告信息:

/Users/user/opt/anaconda3/lib/python3.7/site-packages/numpy/core/_asarray.py:83: UserWarning: Warning: converting a masked element to nan.
  return array(a, dtype, copy=False, order=order, subok=True)
/Users/user/opt/anaconda3/lib/python3.7/site-packages/numpy/core/_asarray.py:89: UserWarning: Warning: converting a masked element to nan.
  return masked_array(a, dtype=dtype, copy=False, keep_mask=True)
/Users/user/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py:71: FutureWarning: Pass y=[0. 0. 0. ... 0. 0. 0.] as keyword args. From version 0.25 passing these as positional arguments will result in an error
  FutureWarning)
Warning (from warnings module):
  File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", line 1086
    FutureWarning)


/Users/user/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py:71: 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().
  FutureWarning)
Python

其中,我们主要关注的是最后一行: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(). 这条警告信息告诉我们,在某些场景下,我们传递的数据格式需要从“列向量”改成“1维数组”。

为什么会出现这个警告?

在理解这个警告之前,我们需要先了解一些Numpy和Scikit-Learn的知识。

在Numpy中,有“数组”(ndarray)和“矩阵”(matrix)两种类型。它们的本质区别在于矩阵只能是2维的,而数组可以是任意多维的。对于大部分数值计算的任务来说,使用数组是更加方便和灵活的选择。

在Scikit-Learn中,机器学习模型的输入和输出都是“二维数组”(ndarray)。例如,在分类问题中,我们通常将样本矩阵(X)和目标向量(y)作为模型的输入,其中X是二维数组,其形状为(n_samples, n_features),而y是一维数组,其形状为(n_samples,)。这样的数据格式可以方便地传递给各种机器学习算法。

那么为什么会出现“column-vector y was passed”这样的警告呢?

通常来说,当我们处理数据的时候,如果不小心把一维数组特殊地当成了二维数组中的一列,就容易出现这样的情况。例如:

import numpy as np

y = np.array([0, 1, 0])
print(y.shape)
>>> (3,)

y = y[:, np.newaxis] # 把一维数组改成了2维数组的一列
print(y.shape)
>>> (3, 1)
Python

这样的话,如果我们直接把y作为Scikit-Learn模型的输入,就会发生上述警告。因为模型期望的是(n_samples,)形状的一维数组,而我们传递给它的是(n_samples, 1)形状的二维数组,转换成一维数组之后才符合模型要求。

解决方案

那么如何解决这个问题呢?以下是几种常见的方案。

1. 使用ravel()方法

在Numpy中,有一个ravel()方法,可以将多维数组转换成一维数组。例如:

y = np.array([0, 1, 0])
y = y[:, np.newaxis]
y = y.ravel() # 将二维数组转换成一维数组
print(y.shape)
>>> (3,)
Python

这样就可以把y转换成符合Scikit-Learn模型要求的一维数组了。

2. 使用reshape()方法

另外一个类似的方法是使用reshape()方法,它可以将数组变换成指定的形状。例如:

y = np.array([0, 1, 0])
y = y[:, np.newaxis]
y = y.reshape(-1,) # 将二维数组转换成一维数组
print(y.shape)
>>> (3,)
Python

这里的reshape(-1,)表示将数组“展平”,即转换成一维数组。这个写法比较通用,可以适用于任意形状的数组。

3. 直接使用一维数组

如果我们不需要使用二维数组的一列,那么可以直接使用一维数组,这样就可以避免这个问题了。例如:

y = np.array([0, 1, 0])
print(y.shape)
>>> (3,)
Python

这里就不会出现警告了,因为y的形状符合Scikit-Learn模型要求的一维数组形状。

总结

本文介绍了一个常见的Numpy警告:“Numpy DataConversionWarning: A column-vector y was passed when a 1d array was expected”,并提供了几种解决方案。在使用Numpy和Scikit-Learn进行数据处理的时候,尤其需要注意数组的形状,避免出现不必要的问题。在将多维数组作为Scikit-Learn模型的输入和输出时,要确保其形状符合要求,尤其是目标向量(y)不能是二维数组的一列,而应该是一维数组形状。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册