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

4 numpy matplotlib curve-fitting scikit-learn

我试图制作线性回归模型,从父亲的长度预测儿子的长度

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')
Run Code Online (Sandbox Code Playgroud)

我收到错误

ValueError: could not convert string to float: 'Father'
Run Code Online (Sandbox Code Playgroud)

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

Imp*_*est 14

这里有两个主要问题:

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

1.获取数据
源文件包含带有列名称的标题行.我们不希望在数据中使用列名,因此在将整个数据读入数据帧后df,我们可以告诉它使用第一行作为标题
df.head().这允许稍后通过列名称查询数据帧,即df['Father'].

2.使数据成形
sklearn.LinearRegression.fit需要两个参数.首先是"训练数据",它应该是2D阵列,其次是"目标值".在这里考虑的情况下,我们只是简单地做了什么,所以我们不太关心这些概念,但我们需要将该函数的第一个输入带入所需的形状.这可以通过为其中一个阵列创建一个新轴来轻松完成,即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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述