Python机器学习bug:ValueError_ Expected 2D array, got 1D array instead

0 前言

在学习机器学习时,为了便于理解观察,有时候会拿一些一维的数组进行测试,在初学阶段可能就难免会踩到这个坑。这个bug处理起来比较简单,就是将一维的数组变成二维的数组。

相关环境:

Windows 64位
Python3.9
scikit-learn1.0.2
pandas
1.4.2

1 场景还原

下面用一个简单的小例子还原一下场景来看看如何处理:
在做一个线性回归训练的时候,前面读数据、画图,进展的很顺利,但是到了训练模型步骤竟然报错了,从字面意思,训练模型期望传递一个二维的数组,但是实际传递的是一维数组,从给出的信息看,是X出问题了。
相关代码如下:

# 测试代码
import pandas as pd
# 调用sklearn的线性模型
from sklearn.linear_model import LinearRegression

data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
X = data.loc[:,'x']
y = data.loc[:,'y']

# 实例化线性模型
lr_model = LinearRegression()

# 训练模型
lr_model.fit(X,y)
# 预测x结果
y_predict = lr_model.predict(X)
# 预测具体某个值的结果
y_p = lr_model.predict([[3.5]])

报错内容:

ValueError: Expected 2D array, got 1D array instead: array=[1 2 3 4 5 6].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

2 解决方案

官方在报错之后也提供了相关的解决方案,只要对报错的array=[1 2 3 4 5 6]加一步array.reshape(-1, 1)转换为二维数组即可。
具体代码如下,添加了第12~13行。将Series转化为二维数组即可。

import pandas as pd
# 调用sklearn的线性模型
from sklearn.linear_model import LinearRegression

data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
X = data.loc[:,'x']
y = data.loc[:,'y']

# 实例化线性模型
lr_model = LinearRegression()

# 将Series转化为二维数组
X = X.values.reshape(-1, 1) 
# 训练模型
lr_model.fit(X,y)
# 预测x结果
y_predict = lr_model.predict(X)
# 预测具体某个值的结果
y_p = lr_model.predict([[3.5]])

除了使用array.reshape(-1, 1),还可以在一开始给变量X赋值的时候就从data中取出一个二维数组,使用X = df[['x']]即可。
具体代码如下:

import pandas as pd
# 调用sklearn的线性模型
from sklearn.linear_model import LinearRegression

data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
# X = data.loc[:,'x']
X = data[['x']].values      # values是转化为数组,不转也不影响最终的结果,只是会有一个提示:X does not have valid feature names
y = data.loc[:,'y']

# 实例化线性模型
lr_model = LinearRegression()

# 训练模型
lr_model.fit(X,y)
# 预测x结果
y_predict = lr_model.predict(x)
# 预测具体某个值的结果
y_p = lr_model.predict([[3.5]])

注:这里忽略了一些查看数据的过程,大家有需要自己打印出来看看。

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月29日
下一篇 2023年3月29日

相关推荐