【问题标题】:Linear Regression on Pandas DataFrame using Sklearn ( IndexError: tuple index out of range)使用 Sklearn 对 Pandas DataFrame 进行线性回归(IndexError:元组索引超出范围)
【发布时间】:2015-07-08 04:03:51
【问题描述】:

我是 Python 新手,正在尝试在 pandas 数据帧上使用 sklearn 执行线性回归。这就是我所做的:

data = pd.read_csv('xxxx.csv')

之后,我得到了一个包含两列的 DataFrame,我们称它们为“c1”、“c2”。现在我想对 (c1,c2) 的集合做线性回归,所以我输入了

X=data['c1'].values
Y=data['c2'].values
linear_model.LinearRegression().fit(X,Y)

导致以下错误

IndexError: tuple index out of range

这里有什么问题?还有,我想知道

  1. 可视化结果
  2. 根据结果进行预测?

我搜索并浏览了大量网站,但似乎没有一个网站可以指导初学者正确的语法。也许对专家来说显而易见的事情对于像我这样的新手来说并不那么明显。

你能帮忙吗?非常感谢您的宝贵时间。

PS:我注意到大量初学者问题在 stackoverflow 中被否决。请考虑这样一个事实,对于专家用户来说似乎很明显的事情可能需要初学者几天才能弄清楚。在按下向下箭头时请谨慎行事,以免损害此讨论社区的活力。

【问题讨论】:

标签: python pandas scikit-learn dataframe linear-regression


【解决方案1】:

假设您的 csv 看起来像这样:

c1,c2
0.000000,0.968012
1.000000,2.712641
2.000000,11.958873
3.000000,10.889784
...

我是这样生成数据的:

import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt

length = 10
x = np.arange(length, dtype=float).reshape((length, 1))
y = x + (np.random.rand(length)*10).reshape((length, 1))

此数据保存到 test.csv(只是为了让您知道它来自哪里,显然您将使用自己的)。

data = pd.read_csv('test.csv', index_col=False, header=0)
x = data.c1.values
y = data.c2.values
print x # prints: [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]

您需要查看您输入到.fit() 的数据的形状。

这里是x.shape = (10,),但我们需要它是(10, 1),请参阅sklearny 也是如此。所以我们重塑:

x = x.reshape(length, 1)
y = y.reshape(length, 1)

现在我们创建回归对象,然后调用fit()

regr = linear_model.LinearRegression()
regr.fit(x, y)

# plot it as in the example at http://scikit-learn.org/
plt.scatter(x, y,  color='black')
plt.plot(x, regr.predict(x), color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

请参阅 sklearn 线性回归 example

【讨论】:

    【解决方案2】:

    数据集

    导入库

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.linear_model import LinearRegression
    

    导入数据集

    dataset = pd.read_csv('1.csv')
    X = dataset[["mark1"]]
    y = dataset[["mark2"]]
    

    将简单线性回归拟合到集合

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

    预测设定结果

    y_pred = regressor.predict(X)
    

    可视化设置结果

    plt.scatter(X, y, color = 'red')
    plt.plot(X, regressor.predict(X), color = 'blue')
    plt.title('mark1 vs mark2')
    plt.xlabel('mark1')
    plt.ylabel('mark2')
    plt.show()
    

    【讨论】:

    • 恕我直言,X = dataset[["mark1"]]reshape 更清晰!
    【解决方案3】:

    我发布了一个答案,准确地解决了您遇到的错误:

    IndexError: 元组索引超出范围

    Scikit-learn 需要 2D 输入。只需重塑XY

    替换:

    X=data['c1'].values # this  has shape (XXX, ) - It's 1D
    Y=data['c2'].values # this  has shape (XXX, ) - It's 1D
    linear_model.LinearRegression().fit(X,Y)
    

    X=data['c1'].values.reshape(-1,1) # this  has shape (XXX, 1) - it's 2D
    Y=data['c2'].values.reshape(-1,1) # this  has shape (XXX, 1) - it's 2D
    linear_model.LinearRegression().fit(X,Y)
    

    【讨论】:

      【解决方案4】:

      根据结果进行预测?

      预测,

      lr = linear_model.LinearRegression().fit(X,Y)
      lr.predict(X)
      

      有什么方法可以查看回归的详细信息?

      LinearRegression 具有coef_intercept_ 属性。

      lr.coef_
      lr.intercept_
      

      显示斜率和截距。

      【讨论】:

        【解决方案5】:

        您真的应该查看fit 方法的文档,您可以查看here

        关于如何可视化线性回归,请使用示例here。我猜你也没有经常使用 ipython(现在称为 jupyter),所以你绝对应该花一些时间来学习它。它是探索数据和机器学习的绝佳工具。您可以将 scikit 线性回归中的示例复制/粘贴到 ipython 笔记本中并运行它

        对于fit 方法的具体问题,通过参考文档,您可以看到您为X 值传递的数据格式错误。

        根据文档, "X : numpy 数组或形状为 [n_samples,n_features] 的稀疏矩阵"

        你可以用这个来修复你的代码

        X = [[x] for x in data['c1'].values]
        

        【讨论】:

        • 谢谢你,汤米。有什么方法可以查看回归的详细信息?
        • 很有可能。你想要什么细节?
        猜你喜欢
        • 2015-01-22
        • 2013-07-28
        • 2018-11-16
        • 2017-07-12
        • 1970-01-01
        • 2013-12-16
        • 2021-12-21
        • 2014-08-01
        相关资源
        最近更新 更多