sklearn 问题:在进行回归时发现样本数量不一致的数组

Posted

技术标签:

【中文标题】sklearn 问题:在进行回归时发现样本数量不一致的数组【英文标题】:sklearn issue: Found arrays with inconsistent numbers of samples when doing regression 【发布时间】:2015-11-12 20:45:07 【问题描述】:

这个问题似乎以前被问过,但我似乎无法评论以进一步澄清接受的答案,我无法弄清楚所提供的解决方案。

我正在尝试学习如何将 sklearn 与我自己的数据一起使用。我基本上只是得到了过去 100 年来 2 个不同国家的 GDP 年变化百分比。我现在只是想学习使用单个变量。我实际上要做的是使用 sklearn 来预测 A 国的 GDP 百分比变化将根据 B 国 GDP 的百分比变化。

问题是我收到一条错误消息:

ValueError:发现样本数量不一致的数组:[ 1 107]

这是我的代码:

import sklearn.linear_model as lm
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


def bytespdate2num(fmt, encoding='utf-8'):#function to convert bytes to string for the dates.
    strconverter = mdates.strpdate2num(fmt)
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter

dataCSV = open('combined_data.csv')

comb_data = []

for line in dataCSV:
    comb_data.append(line)

date, chngdpchange, ausgdpchange = np.loadtxt(comb_data, delimiter=',', unpack=True, converters=0: bytespdate2num('%d/%m/%Y'))


chntrain = chngdpchange[:-1]
chntest = chngdpchange[-1:]

austrain = ausgdpchange[:-1]
austest = ausgdpchange[-1:]

regr = lm.LinearRegression()
regr.fit(chntrain, austrain)

print('Coefficients: \n', regr.coef_)

print("Residual sum of squares: %.2f"
      % np.mean((regr.predict(chntest) - austest) ** 2))

print('Variance score: %.2f' % regr.score(chntest, austest))

plt.scatter(chntest, austest,  color='black')
plt.plot(chntest, regr.predict(chntest), color='blue')

plt.xticks(())
plt.yticks(())

plt.show()

我做错了什么?我基本上试图将 sklearn 教程(他们使用了一些糖尿病数据集)应用于我自己的简单数据。我的数据只包含日期、国家 A 在特定年份的 GDP 变化百分比以及国家 B 在同一年的 GDP 变化百分比。

我尝试了here 和here (basically trying to find more out about the solution in the first link) 的解决方案,但收到完全相同的错误。

这里是完整的回溯,如果您想查看它:

Traceback (most recent call last):
  File "D:\My Stuff\Dropbox\Python\Python projects\test regression\tester.py", line 34, in <module>
    regr.fit(chntrain, austrain)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\linear_model\base.py", line 376, in fit
    y_numeric=True, multi_output=True)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\utils\validation.py", line 454, in check_X_y
    check_consistent_length(X, y)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\utils\validation.py", line 174, in check_consistent_length
    "%s" % str(uniques))
ValueError: Found arrays with inconsistent numbers of samples: [  1 107]

【问题讨论】:

在分成训练集/测试集之前检查chntrainaustrain的形状。它们应该具有相同的形状;该错误似乎表明尺寸不同 我该怎么做?我一直在谷歌搜索,但每一个让我重塑或找到形状的解决方案都会给出错误:IndexError: too many indices for array 例如print chngdpchange.shape, ausgdpchange.shape 【参考方案1】:
regr.fit(chntrain, austrain)

这看起来不对。 fit 的第一个参数应该是一个X,它指的是一个特征向量。第二个参数应该是y,即与X相关联的正确答案(目标)向量。

例如,如果你有 GDP,你可能有:

X[0] = [43, 23, 52] -> y[0] = 5
# meaning the first year had the features [43, 23, 52] (I just made them up)
# and the change that year was 5

从你的名字来看,chntrainaustrain 都是特征向量。从您加载数据的方式来看,也许最后一列是目标?

也许您需要执行以下操作:

chntrain_X, chntrain_y = chntrain[:, :-1], chntrain[:, -1]
# you can do the same with austrain and concatenate them or test on them if this part works
regr.fit(chntrain_X, chntrain_y)

但如果不知道您数据的确切存储格式,我们就无法判断。

【讨论】:

【参考方案2】:

尝试将chntrain 更改为二维数组而不是一维数组,即重塑为(len(chntrain), 1)

对于预测,还将chntest 更改为二维数组。

【讨论】:

【参考方案3】:

在 fit(X,y) 中,输入参数 X 应该是一个二维数组。但是如果你的数据中的 X 只是一维的,你可以像这样将它重塑成一个二维数组:regr.fit(chntrain_X.reshape(len(chntrain_X), 1), chntrain_Y)

【讨论】:

【参考方案4】:

我也遇到过类似的问题,已经找到解决办法了。

您遇到以下错误的地方:

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

[ 1 107] 部分基本上是说您的数组是错误的。 Sklearn 认为您有 1 行的 107 列数据。

要解决此问题,请尝试像这样转置 X 数据:

chntrain.T

重新运行你的合身:

regr.fit(chntrain, austrain)

根据您的“austrain”数据的样子,您可能也需要转置它。

【讨论】:

【参考方案5】:

您也可以使用np.newaxis。该示例可以是X = X[:, np.newaxis]。我在Logistic function找到了方法

【讨论】:

以上是关于sklearn 问题:在进行回归时发现样本数量不一致的数组的主要内容,如果未能解决你的问题,请参考以下文章

样本数量不一致的 Python Sklearn 变量

sklearn:发现样本数量不一致的输入变量:[1, 99]

逻辑回归 ValueError:发现样本数量不一致的输入变量:[699,

Sklearn:ValueError:发现样本数量不一致的输入变量:[1, 6]

将 CSV 索引到不一致的样本数量以进行逻辑回归

当 p > n 时,sklearn 如何进行线性回归?