【问题标题】:Using scikit-learn LinearRegression to plot a linear fit使用 scikit-learn LinearRegression 绘制线性拟合
【发布时间】: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['儿子']

标签: numpy matplotlib scikit-learn curve-fitting


【解决方案1】:

这里有两个主要问题:

  1. 从源中获取数据
  2. 将数据转换为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)
    猜你喜欢
    • 2021-12-29
    • 2019-03-08
    • 2020-11-01
    • 2015-03-11
    • 2020-08-20
    • 2018-02-22
    • 2016-02-05
    • 2016-08-24
    相关资源
    最近更新 更多