如果数据具有单个特征,则使用 array.reshape(-1, 1) 重塑数据;如果数据包含单个样本,则使用 array.reshape(1, -1)

问题描述 投票:0回答:2

当我从数据中预测一个样本时,它会给出重塑错误,但我的模型具有相同的行数。这是我的代码:

import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np
x = np.array([2.0 , 2.4, 1.5, 3.5, 3.5, 3.5, 3.5, 3.7, 3.7])
y = np.array([196, 221, 136, 255, 244, 230, 232, 255, 267])

lr = LinearRegression()
lr.fit(x,y)

print(lr.predict(2.4))

错误是

if it contains a single sample.".format(array))
ValueError: Expected 2D array, got scalar array instead:
array=2.4.
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.
python python-3.x machine-learning scikit-learn linear-regression
2个回答
25
投票

您应该将 X 重塑为 2D 数组而不是 1D 数组。拟合模型需要二维数组。

i.e (n_samples, n_features)

x = np.array([2.0 , 2.4, 1.5, 3.5, 3.5, 3.5, 3.5, 3.7, 3.7])
y = np.array([196, 221, 136, 255, 244, 230, 232, 255, 267])

lr = LinearRegression()
lr.fit(x.reshape(-1, 1), y)

print(lr.predict([[2.4]]))

0
投票

该错误基本上是说将平面特征数组转换为列数组。

reshape(-1, 1)
完成工作;也可以使用
[:, None]

特征数组

X
的第二个维度也必须与传递给
predict()
的任何内容的第二个维度匹配。由于
X
被强制转换为 2D 数组,因此传递给
predict()
的数组也应该是 2D。

x = np.array([2.0 , 2.4, 1.5, 3.5, 3.5, 3.5, 3.5, 3.7, 3.7])
y = np.array([196, 221, 136, 255, 244, 230, 232, 255, 267])
X = x[:, None]         # X.ndim should be 2

lr = LinearRegression()
lr.fit(X, y)

prediction = lr.predict([[2.4]])

如果您的输入是 pandas 列,则使用双括号 (

[[]]
) 获取 2D 特征数组。

df = pd.DataFrame({'feature': x, 'target': y})
lr = LinearRegression()
lr.fit(df['feature'], df['target'])            # <---- error
lr.fit(df[['feature']], df['target'])          # <---- OK
#        ^^         ^^                           <---- double brackets 
为什么
X
应该是二维的?

如果我们查看

fit()
(scikit-learn 中任何模型)的源代码,首先要做的事情之一就是通过
validate_data()
方法验证输入,该方法调用
check_array()
来验证输入验证
X
check_array()
检查
X
是否为 2D。
X
必须是 2D,因为最终,
LinearRegression().fit()
调用
scipy.linalg.lstsq
来解决最小二乘问题,而
lstsq
需要
X
是 2D
才能执行矩阵乘法。

对于分类器,需要第二维来获取特征数量,这对于获得正确形状的模型系数至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.