使用 scikit-learn LinearRegression 绘制线性拟合

Posted

技术标签:

【中文标题】使用 scikit-learn LinearRegression 绘制线性拟合【英文标题】:Using scikit-learn LinearRegression to plot a linear fit 【发布时间】:2017-04-17 21:57:52 【问题描述】:

我正在尝试制作线性回归模型,根据父亲的长度预测儿子的长度

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.linear_model import LinearRegression


Headings_cols = ['Father', 'Son']
df = pd.read_csv('http://www.math.uah.edu/stat/data/Pearson.txt', 
                 delim_whitespace=True, names=Headings_cols)



X = df['Father']  
y = df['Son']  

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

plt.scatter(X, y,color='g')
plt.plot(X, model.predict(X),color='g')

plt.scatter(y, X, color='r')
plt.plot(y, X, color='r')

我得到错误

ValueError: could not convert string to float: 'Father'

第二件事是计算儿子的平均长度,以及均值的标准误?

【问题讨论】:

你在哪一行代码中得到了那个错误? X = df['父亲'] y = df['儿子'] 【参考方案1】:

这里有两个主要问题:

    从源中获取数据 将数据转换为sklearn.LinearRegression.fit 可以理解的形状

1.获取数据 源文件包含带有列名的标题行。我们不想在我们的数据中列名称,因此在将整个数据读入数据框df 后,我们可以通过df.head() 告诉它使用第一行作为标题。这允许以后像往常一样按列名查询数据框,即df['Father']

2。整理数据sklearn.LinearRegression.fit 有两个参数。首先是“训练数据”,它应该是一个二维数组,其次是“目标值”。在此处考虑的情况下,我们只是简单地进行拟合,因此我们不太关心这些概念,但我们需要将该函数的第一个输入带入所需的形状。这可以通过为其中一个数组创建一个新轴来轻松完成,即df['Father'].values[:,np.newaxis]

完整的工作脚本:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns

from sklearn.linear_model import LinearRegression

df = pd.read_csv('http://www.math.uah.edu/stat/data/Pearson.txt',
                 delim_whitespace=True)
df.head() # prodce a header from the first data row


# LinearRegression will expect an array of shape (n, 1) 
# for the "Training data"
X = df['Father'].values[:,np.newaxis]
# target data is array of shape (n,) 
y = df['Son'].values


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

plt.scatter(X, y,color='g')
plt.plot(X, model2.predict(X),color='k')

plt.show()

【讨论】:

非常感谢您的详细回答,帮助我解决了同样的问题。我只是没有完全理解数据的形成,但我已经进行了相应的编辑,现在可以使用了!谢谢!【参考方案2】:

我一直在寻找相同问题的答案,但初始数据集 URL 不再有效。可以从以下 URL 检索“父/子”Pearson 身高数据集 csv,然后只需进行一些小的调整即可按照宣传的方式工作(注意 .csv 文件的重命名):

http://www.randomservices.org/random/data/Pearson.html

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
import csv

from sklearn.linear_model import LinearRegression

# data retrieved from http://www.randomservices.org/random/data/Pearson.html#

df = pd.read_csv('./pearsons_height_data.csv',
                 quotechar='"',
                 quoting=csv.QUOTE_ALL)

df.head() # produce a header from the first data row

# LinearRegression will expect an array of shape (n, 1)
# for the "Training data"
X = df['Father'].values[:,np.newaxis]
# target data is array of shape (n,)
y = df['Son'].values

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

plt.scatter(X, y,color='g')
plt.plot(X, model2.predict(X),color='k')

plt.show()

【讨论】:

【参考方案3】:

在加载数据时,改为这样做:

df = pd.read_csv('http://www.math.uah.edu/stat/data/Pearson.txt', 
                 delim_whitespace=True)
df.columns = Headings_cols

您还应该确保 X 的形状正确:

X = df['Father'].values.reshape(-1, 1)

【讨论】:

它给出了这个错误 ValueError: Found arrays with contrast numbers of samples: [ 1 1078] 看起来您可能正在向后提供数据。试试model2.fit (X, y) @AlexG 问题与LinearRegression.fit 期望其数据输入的方式有关。因此,重塑或颠倒元素的顺序无济于事。如我的解决方案所示,需要向第一个输入数组添加一个新维度。 @ImportanceOfBeingErnest 这就是为什么我将这一行包含在我的解决方案中(几天前):X = df['Father'].values.reshape(-1, 1)

以上是关于使用 scikit-learn LinearRegression 绘制线性拟合的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scikit-Learn 数据上传查询机器学习

使用Python scikit-learn 库实现神经网络算法

使用 Scikit-learn 谷歌应用引擎

如何使用 scikit-learn 创建我自己的数据集?

scikit-learn 中的 DBSCAN(仅使用指标)

使用 scikit-learn 去除低方差的特征