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

Using scikit-learn LinearRegression to plot a linear fit

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

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'

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

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

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)

这里主要有两个问题:

  1. 从源中获取数据
  2. 将数据转化为sklearn.LinearRegression.fit 理解的形状

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

2。整理数据
sklearn.LinearRegression.fit 有两个参数。首先是 "training data",它应该是一个二维数组,其次是 "target values"。在这里考虑的情况下,我们只是简单地拟合什么,所以我们不太关心这些概念,但我们需要将该函数的第一个输入带入所需的形状。这可以通过为其中一个数组创建一个新轴来轻松完成,即 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()

我一直在寻找同一问题的答案,但初始数据集 URL 不再有效。 “Father/Son”皮尔逊身高数据集 csv 可以从以下 URL 中检索,然后只需要进行一些小的调整即可像宣传的那样工作(注意 .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()