使用 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 绘制线性拟合的主要内容,如果未能解决你的问题,请参考以下文章