sklearn:调用 LinearRegression.fit() 时发现样本数量不一致的数组

sklearn: Found arrays with inconsistent numbers of samples when calling LinearRegression.fit()

只是想做一个简单的线性回归,但我对这个错误感到困惑:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].values, df2.iloc[1:1000, 2].values)

产生:

ValueError: Found arrays with inconsistent numbers of samples: [  1 999]

这些选择必须具有相同的维度,并且它们应该是 numpy 数组,所以我错过了什么?

看起来sklearn需要(​​行号,列号)的数据形状。 如果您的数据形状是(行号,),如 (999, ),则它不起作用。 通过使用 numpy.reshape(),您应该将数组的形状更改为 (999, 1),例如使用

data=data.reshape((999,1))

就我而言,它适用于此。

我认为 regr.fit 的 "X" 参数需要是一个矩阵,所以下面的应该有效。

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, [5]].values, df2.iloc[1:1000, 2].values)
expects X(feature matrix)

尝试将您的特征放在这样的元组中:

features = ['TV', 'Radio', 'Newspaper']
X = data[features]

看起来您正在使用 pandas 数据框(来自名称 df2)。

您还可以执行以下操作:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].to_frame(), df2.iloc[1:1000, 2].to_frame())

注意:我删除了 "values",因为它将 pandas 系列转换为 numpy.ndarray 并且 numpy.ndarray 没有属性 to_frame()。

我遇到此错误是因为我将数据转换为 np.array。我通过将我的数据转换为 np.matrix 并进行转置来解决问题。

值错误: regr.fit(np.array(x_list), np.array(y_list))

正确: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))

要分析两个数组(array1和array2)需要满足以下两个要求:

1) 他们需要 numpy.ndarray

检查

type(array1)
# and
type(array2)

如果至少其中之一不是这种情况,请执行

array1 = numpy.ndarray(array1)
# or
array2 = numpy.ndarray(array2)

2)尺寸需要如下:

array1.shape #shall give (N, 1)
array2.shape #shall give (N,)

N 是数组中的项目数。 要为 array1 提供正确数量的轴,请执行:

array1 = array1[:, numpy.newaxis]

正如上面提到的,X 参数必须是矩阵或具有已知维度的 numpy 数组。所以你可能会使用这个:

df2.iloc[1:1000, 5:some_last_index].values

因此您的数据框将被转换为具有已知维度的数组,您不需要重新整形

在 Udacity 深度学习基础课程上看到:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])

我遇到了类似的问题。我的问题是,X 中的行数不等于 y 中的行数。

即特征列中的条目数不等于目标变量中的整体数,因为我从特征列中删除了一些行。

在火车测试拆分期间,您可能犯了一个错误

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)

以上代码正确

你可能像下面那样做了,但这是错误的

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)