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

11

我正在尝试构建一个线性回归模型,用于预测儿子身高与父亲身高的关系。

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'

第二件事是计算儿子的平均长度和平均数的标准误差?


在代码的哪一行出现了错误? - ImportanceOfBeingErnest
X = df['Father'] y = df['Son'] - user5573514
3个回答

32

这里有两个主要问题:

  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()

在这里输入图片描述


非常感谢您提供的详细答案,帮助我解决了同样的问题。我只是没有完全理解数据的整形,但我已经进行了相应的编辑,现在它可以正常工作了!谢谢! - LeleMarieC

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()

-1

在加载数据时,请执行以下操作:

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: 找到不一致样本数量的数组:[1 1078] - user5573514
看起来你可能在反向输入数据。尝试使用 model2.fit(X, y) - Alex
@AlexG 这个问题与 LinearRegression.fit 期望的数据输入方式有关。因此,重新整形或反转元素的顺序都没有帮助。需要按照我的解决方案,在第一个输入数组中添加一个新的维度。 - ImportanceOfBeingErnest
@ImportanceOfBeingErnest这就是为什么我在我的解决方案中包含了这行代码(几天前):“X = df['Father'].values.reshape(-1, 1)” - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接