使用Sci-kit Learn对Pandas DataFrame进行线性回归

Din*_*aur 19 python linear-regression dataframe pandas scikit-learn

我是Python的新手,并试图在pandas数据帧上使用sklearn执行线性回归.这就是我做的:

data = pd.read_csv('xxxx.csv')
Run Code Online (Sandbox Code Playgroud)

之后我得到了两列的DataFrame,让我们称之为'c1','c2'.现在我想对(c1,c2)的集进行线性回归,所以我输入了

X=data['c1'].values
Y=data['c2'].values
linear_model.LinearRegression().fit(X,Y)
Run Code Online (Sandbox Code Playgroud)

这导致以下错误

IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)

这有什么不对?另外,我想知道

  1. 可视化结果
  2. 根据结果​​做出预测?

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

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

PS:我注意到大量的初学者问题在stackoverflow中被低估了.请注意这样一个事实,即专家用户看似显而易见的事情可能需要一个初学者的日子才能弄明白.按下向下箭头时请谨慎使用,以免损害本讨论社区的活力.

Sco*_*ott 38

让我们假设您的csv看起来像:

c1,c2
0.000000,0.968012
1.000000,2.712641
2.000000,11.958873
3.000000,10.889784
...
Run Code Online (Sandbox Code Playgroud)

我生成了这样的数据:

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))
Run Code Online (Sandbox Code Playgroud)

这些数据保存到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.]
Run Code Online (Sandbox Code Playgroud)

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

在这里x.shape = (10,),我们需要它(10, 1),见sklearn.同样如此y.所以我们重塑:

x = x.reshape(length, 1)
y = y.reshape(length, 1)
Run Code Online (Sandbox Code Playgroud)

现在我们创建回归对象,然后调用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()
Run Code Online (Sandbox Code Playgroud)

请参阅sklearn线性回归示例. 在此输入图像描述


mak*_*kis 8

我发布了一个答案,该答案完全解决了您遇到的错误:

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


ser*_*inc 6

根据结果​​做出预测?

预测,

lr = linear_model.LinearRegression().fit(X,Y)
lr.predict(X)
Run Code Online (Sandbox Code Playgroud)

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

线性回归具有coef_intercept_属性。

lr.coef_
lr.intercept_
Run Code Online (Sandbox Code Playgroud)

显示斜率和截距。


小智 6

数据集

在此处输入图片说明

导入库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
Run Code Online (Sandbox Code Playgroud)

导入数据集

dataset = pd.read_csv('1.csv')
X = dataset[["mark1"]]
y = dataset[["mark2"]]
Run Code Online (Sandbox Code Playgroud)

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

regressor = LinearRegression()
regressor.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

预测设定结果

y_pred = regressor.predict(X)
Run Code Online (Sandbox Code Playgroud)

可视化设置结果

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 恕我直言,`X = dataset[["mark1"]]`比`reshape`更清晰! (2认同)

Tom*_*mmy 0

您确实应该查看该方法的文档,您可以在此处fit查看

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

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

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

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

X = [[x] for x in data['c1'].values]
Run Code Online (Sandbox Code Playgroud)