我正在尝试制作线性回归模型,用父亲的长度预测儿子的长度
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'
第二件事是计算儿子的平均长度和平均值的标准误差?
答案 0 :(得分:12)
这里有两个主要问题:
sklearn.LinearRegression.fit
理解的形状 <强> 1。获取数据
源文件包含带有列名称的标题行。我们不希望在数据中使用列名,因此在将整个数据读入数据框system("scp", "file", "server:");
后,我们可以告诉它使用第一行作为标题
df
。这允许稍后通过列名称查询数据帧,例如df.head()
。
<强> 2。使数据成形
sklearn.LinearRegression.fit
有两个参数。首先是“训练数据”,它应该是2D阵列,其次是“目标值”。在这里考虑的情况下,我们只是简单地做了什么,所以我们不太关心这些概念,但我们需要将该函数的第一个输入带入所需的形状。这可以通过为其中一个数组创建新轴(即df['Father']
完整的工作机会:
df['Father'].values[:,np.newaxis]
答案 1 :(得分:1)
我一直在寻找同一问题的答案,但初始数据集 URL 不再有效。 “父/子”皮尔逊高度数据集 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()
答案 2 :(得分:-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)