在学习机器学习时,为了便于理解观察,有时候会拿一些一维的数组进行测试,在初学阶段可能就难免会踩到这个坑。这个bug处理起来比较简单,就是将一维的数组变成二维的数组。
相关环境:
Windows 64位
Python3.9
scikit-learn1.0.2
pandas1.4.2
下面用一个简单的小例子还原一下场景来看看如何处理:
在做一个线性回归训练的时候,前面读数据、画图,进展的很顺利,但是到了训练模型步骤竟然报错了,从字面意思,训练模型期望传递一个二维的数组,但是实际传递的是一维数组,从给出的信息看,是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.
官方在报错之后也提供了相关的解决方案,只要对报错的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]])
注:这里忽略了一些查看数据的过程,大家有需要自己打印出来看看。